@gct-paas/design 0.1.4-dev.17 → 0.1.4-dev.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -68,21 +68,21 @@
68
68
  */
69
69
  .gct-design-view-layout {
70
70
  position: relative;
71
- height: 100%;
72
71
  width: 100%;
72
+ height: 100%;
73
73
  overflow: hidden;
74
74
  }
75
- .gct-design-view-layout :global(.gct-modal-name-editor__input .ant-input.ant-input-sm) {
75
+ .gct-design-view-layout .gct-modal-name-editor__input .ant-input.ant-input-sm {
76
76
  color: rgb(26, 29, 35);
77
77
  }
78
78
  .gct-design-view-layout__header {
79
- width: 100%;
80
- height: 69px;
81
79
  display: flex;
82
80
  align-items: center;
83
81
  justify-content: space-between;
84
- background-color: #fff;
82
+ width: 100%;
83
+ height: 69px;
85
84
  padding: 0 24px;
85
+ background-color: #fff;
86
86
  border-bottom: 1px solid #E0E3EB;
87
87
  }
88
88
 
@@ -90,10 +90,10 @@
90
90
  display: inline-flex;
91
91
  align-items: center;
92
92
  justify-content: center;
93
- cursor: pointer;
94
93
  width: 20px;
95
94
  height: 20px;
96
95
  font-size: 20px;
96
+ cursor: pointer;
97
97
  }
98
98
 
99
99
  .gct-design-view-layout__header-info {
@@ -131,8 +131,8 @@
131
131
 
132
132
  .gct-design-view-layout__header-actions {
133
133
  display: flex;
134
- align-items: center;
135
134
  gap: 12px;
135
+ align-items: center;
136
136
  height: 100%;
137
137
  }
138
138
 
@@ -141,14 +141,14 @@
141
141
  align-items: center;
142
142
  }
143
143
  .gct-design-view-layout__header-action-btn:focus {
144
- border-color: #E0E3EB;
145
144
  color: rgba(0, 0, 0, 0.85);
145
+ border-color: #E0E3EB;
146
146
  }
147
- .gct-design-view-layout__header-action-btn :global(.gct-iconfont) {
148
- font-size: 14px;
147
+ .gct-design-view-layout__header-action-btn .gct-iconfont {
149
148
  margin-right: 6px;
149
+ font-size: 14px;
150
150
  }
151
- .gct-design-view-layout__header-action-btn :global(span) {
151
+ .gct-design-view-layout__header-action-btn span {
152
152
  height: 22px;
153
153
  }
154
154
 
@@ -102,7 +102,7 @@ var DesignViewLayout = /* @__PURE__ */ defineComponent({
102
102
  createVNode("div", { "class": ns.e("header-left") }, [isBack.value ? createVNode("div", {
103
103
  "class": ns.e("header-back"),
104
104
  "onClick": onBack
105
- }, [createVNode(resolveComponent("assets-svg-icon"), { "src": "/assets/card-design/arrow_back.svg" }, null)]) : null, props.editName ? createVNode("div", { "class": ns.e("header-info") }, [createVNode("div", { "class": ns.e("header-sub-title") }, [subTitle.value]), createVNode("div", { "class": ns.e("header-title") }, [createVNode(ModalNameEditor, {
105
+ }, [createVNode(resolveComponent("assets-svg-icon"), { "src": "/extras-assets/card-design/arrow_back.svg" }, null)]) : null, props.editName ? createVNode("div", { "class": ns.e("header-info") }, [createVNode("div", { "class": ns.e("header-sub-title") }, [subTitle.value]), createVNode("div", { "class": ns.e("header-title") }, [createVNode(ModalNameEditor, {
106
106
  "value": val.value,
107
107
  "onUpdate:value": ($event) => val.value = $event,
108
108
  "defaultName": props.defaultName
@@ -4,6 +4,8 @@ import { FieldIconMap, t } from "@gct-paas/core";
4
4
  import { computed, createVNode, defineComponent, ref, toRefs, watch } from "vue";
5
5
  import { Empty, Transfer } from "ant-design-vue";
6
6
  //#region src/components/field-transfer/components/Transfer/AdvancedTransfer.tsx
7
+ var noData = "/extras-assets/design-view/pic_nodata.svg";
8
+ var noSearchData = "/extras-assets/design-view/pic_noresult.svg";
7
9
  var AdvancedTransfer_default = /* @__PURE__ */ defineComponent({
8
10
  name: "AdvancedTransfer",
9
11
  props: {
@@ -88,7 +90,10 @@ var AdvancedTransfer_default = /* @__PURE__ */ defineComponent({
88
90
  "checkedKeys": targetCheckedKeys.value,
89
91
  "onCheckedKeysChange": setTargetCheckedKeys
90
92
  }, null);
91
- if (direction === "left" && (!leftOption.value.length || !filteredLeftOption.value.length)) return createVNode("div", { "class": "empty-container" }, [createVNode(Empty, { "description": leftOption.value.length ? t("sys.component.fieldTransfer.noSearchData") : t("sys.component.fieldTransfer.noData") }, null)]);
93
+ if (direction === "left" && (!leftOption.value.length || !filteredLeftOption.value.length)) return createVNode("div", { "class": "empty-container" }, [createVNode(Empty, {
94
+ "image": leftOption.value.length ? noSearchData : noData,
95
+ "description": leftOption.value.length ? t("sys.component.fieldTransfer.noSearchData") : t("sys.component.fieldTransfer.noData")
96
+ }, null)]);
92
97
  } };
93
98
  return () => {
94
99
  return createVNode("div", { "class": "advanced-transfer-container" }, [createVNode(Transfer, {
@@ -5,6 +5,8 @@ import { FieldIconMap, t } from "@gct-paas/core";
5
5
  import { computed, createVNode, defineComponent, ref, toRefs } from "vue";
6
6
  import { Empty, Input, Tree } from "ant-design-vue";
7
7
  //#region src/components/field-transfer/components/Transfer/TransferTree.tsx
8
+ var noData = "/extras-assets/design-view/pic_nodata.svg";
9
+ var noSearchData = "/extras-assets/design-view/pic_noresult.svg";
8
10
  var TransferTree_default = /* @__PURE__ */ defineComponent({
9
11
  name: "TransferTree",
10
12
  props: {
@@ -52,7 +54,10 @@ var TransferTree_default = /* @__PURE__ */ defineComponent({
52
54
  }, null)]), createVNode("div", {
53
55
  "class": "tree-wrapper",
54
56
  "style": { overflow: "auto" }
55
- }, [filteredTreeData.value.length === 0 ? createVNode("div", { "class": "empty-container" }, [createVNode(Empty, { "description": keyword.value ? t("sys.component.fieldTransfer.noSearchData") : t("sys.component.fieldTransfer.noData") }, null)]) : createVNode(Tree, {
57
+ }, [filteredTreeData.value.length === 0 ? createVNode("div", { "class": "empty-container" }, [createVNode(Empty, {
58
+ "image": keyword.value ? noSearchData : noData,
59
+ "description": keyword.value ? t("sys.component.fieldTransfer.noSearchData") : t("sys.component.fieldTransfer.noData")
60
+ }, null)]) : createVNode(Tree, {
56
61
  "showIcon": true,
57
62
  "showLine": { showLeafIcon: false },
58
63
  "blockNode": true,
@@ -1085,7 +1085,7 @@ export declare function useDesigner(): {
1085
1085
  methodMap: import('vue').Ref<import('@gct-paas/schema').ExportMethod, import('@gct-paas/schema').ExportMethod>;
1086
1086
  checkWidgetMove: () => boolean;
1087
1087
  handleAddDrag: (newIndex: number, childrenList: LowCodeWidget.BasicSchema[], scope: SCOPE, formID?: string) => void;
1088
- setPageJson: (json: PageJson) => void;
1088
+ setPageJson: (json: PageJson) => Promise<void>;
1089
1089
  save: (flag?: boolean, showSuccess?: boolean) => Promise<boolean>;
1090
1090
  savePageJsonSnapshot: (json?: PageJson) => void;
1091
1091
  emitCache: () => void;
@@ -1,4 +1,6 @@
1
1
  import { platform } from "../../utils/design-view/index.mjs";
2
+ import { initMethodMap } from "../../utils/transform-js/transform-js.mjs";
3
+ import "../../utils/index.mjs";
2
4
  import { methodMap, pageJson } from "./design-state.mjs";
3
5
  import { useDesignModal } from "./designer/useDesignModal.mjs";
4
6
  import { useDesignPreview } from "./designer/useDesignPreview.mjs";
@@ -36,9 +38,12 @@ function useDesigner() {
36
38
  /**
37
39
  * 设置设计器的 pageJSON
38
40
  */
39
- function setPageJson(json) {
41
+ async function setPageJson(json) {
40
42
  pageJson.pageConfig.hasFooter = platform.value === Platform.MOBILE || platform.value === Platform.PAD;
41
43
  Object.assign(pageJson, json);
44
+ initMethodMap(pageJson.js).then((map) => {
45
+ methodMap.value = map;
46
+ });
42
47
  cache.emitCache();
43
48
  }
44
49
  /** 检查是否可以拖拽进入的方法,比如某些组件不能拖到某些组件内 */
@@ -1,5 +1,7 @@
1
+ import { platform } from "../../utils/design-view/index.mjs";
2
+ import "../../utils/index.mjs";
1
3
  import { hiddenButtonProps } from "./button-props-func.mjs";
2
- import { ButtonColorTheme, ButtonColorType, ButtonSize, ButtonStyle, PropGroup, StyleGroup } from "@gct-paas/core";
4
+ import { ButtonColorTheme, ButtonColorType, ButtonSize, ButtonStyle, Platform, PropGroup, StyleGroup } from "@gct-paas/core";
3
5
  //#region src/schema/common-config/button-editor-config.ts
4
6
  var buttonProps = {
5
7
  disabled: false,
@@ -79,7 +81,7 @@ var buttonEditor = [
79
81
  label: "sys.pageDesigner.buttonSize",
80
82
  group: PropGroup.ButtonStyle,
81
83
  hidden: (widget) => {
82
- return hiddenButtonProps(widget);
84
+ return hiddenButtonProps(widget) || platform.value === Platform.MOBILE;
83
85
  },
84
86
  _config: { options: Object.values(ButtonSize).map((i) => {
85
87
  return {
@@ -15,7 +15,7 @@ export declare class DesignPluginPgkUtil extends PluginPgkUtil {
15
15
  * @param {Platform} platform
16
16
  * @returns {*} {Promise<LoadPluginResult>}
17
17
  */
18
- static loadDesignPlugin(_app: App, platform: Platform, kit?: string[]): Promise<LoadPluginResult>;
18
+ static loadDesignPlugin(_app: App, _platform: Platform, _kit?: string[]): Promise<LoadPluginResult>;
19
19
  /**
20
20
  * 加载设计态中,已经被从配置中移除的插件
21
21
  *
@@ -15,35 +15,7 @@ var DesignPluginPgkUtil = class extends PluginPgkUtil {
15
15
  * @param {Platform} platform
16
16
  * @returns {*} {Promise<LoadPluginResult>}
17
17
  */
18
- static async loadDesignPlugin(_app, platform, kit = []) {
19
- try {
20
- const result = await this.loadPlugin(PluginModeEnum.DESIGN, platform, kit);
21
- const [configs, moduleMap] = result;
22
- configs.forEach((config) => {
23
- config.plugins.forEach((plugin) => {
24
- const module = moduleMap[plugin.key];
25
- if (!module) {
26
- console.error(`${plugin.key} 插件加载失败,请检查插件配置是否正确`);
27
- return;
28
- }
29
- switch (platform) {
30
- case Platform.MOBILE:
31
- if (module.mobile) _gct.register.designer.mobile.register(plugin.key, () => new module.mobile());
32
- break;
33
- case Platform.PAD:
34
- if (module.mobile) _gct.register.designer.pad.register(plugin.key, () => new module.mobile());
35
- break;
36
- case Platform.WEB:
37
- if (module.web) _gct.register.designer.web.register(plugin.key, () => new module.web());
38
- break;
39
- default: console.warn(`未知平台 ${platform},无法注册插件 ${plugin.key}`);
40
- }
41
- });
42
- });
43
- return result;
44
- } catch (error) {
45
- console.error(error);
46
- }
18
+ static async loadDesignPlugin(_app, _platform, _kit = []) {
47
19
  return [[], {}];
48
20
  }
49
21
  /**
@@ -10,4 +10,5 @@ import "./init-widget-info/init-widget-info.mjs";
10
10
  import "./design-plugin-pkg-util/design-plugin-pkg-util.mjs";
11
11
  import "./schema/index.mjs";
12
12
  import "./transform-js/transform-js.mjs";
13
+ import "./transform-js/index.mjs";
13
14
  import "./flatten.mjs";
@@ -0,0 +1 @@
1
+ import "./transform-js.mjs";
@@ -1,13 +1,14 @@
1
+ import { ExportMethod } from '@gct-paas/schema';
1
2
  /**
2
- * 将 TypeScript/ES 代码编译为可在运行时执行的 JS 字符串(在 Worker 中执行)
3
- * @param code - 源代码字符串(支持 TS 语法)
3
+ * 将 TypeScript/ES 代码编译为可在运行时执行的 JS 字符串
4
+ * @param code - 源代码字符串(支持 TS 语法,可为 URI 编码)
4
5
  * @param needExport - 是否在末尾追加 `return exports`,默认为 true
5
- * @returns 编译后可执行的 JS 字符串,失败时返回 null
6
+ * @returns 编译后可执行的 JS 字符串
6
7
  */
7
- export declare function buildRunJs(code: string, needExport?: boolean): Promise<string | null>;
8
+ export declare function buildRunJs(code: string, needExport?: boolean): Promise<string>;
8
9
  /**
9
- * 解析代码字符串并提取所有命名导出函数的方法映射(在 Worker 中执行)
10
+ * 解析代码字符串并提取所有命名导出函数的方法映射
10
11
  * @param code - 包含命名导出函数的代码字符串
11
12
  * @returns 以函数名为键的方法映射对象,解析失败时返回空对象
12
13
  */
13
- export declare function initMethodMap(code: string): Promise<IObject>;
14
+ export declare function initMethodMap(code: string): Promise<ExportMethod>;
@@ -1,82 +1,76 @@
1
1
  //#region src/utils/transform-js/transform-js.ts
2
- /** Worker 支持的操作类型 */
3
- var WorkerMessageType = /* @__PURE__ */ function(WorkerMessageType) {
4
- WorkerMessageType["BUILD_RUN_JS"] = "BUILD_RUN_JS";
5
- WorkerMessageType["INIT_METHOD_MAP"] = "INIT_METHOD_MAP";
6
- return WorkerMessageType;
7
- }(WorkerMessageType || {});
8
- /** 懒加载的 Worker 单例 */
9
- var _worker = null;
10
- /** 等待响应的请求映射表,key 为请求 ID */
11
- var _pendingMap = /* @__PURE__ */ new Map();
12
- /**
13
- * 获取(或创建)Worker 单例
14
- * @returns Worker 实例
15
- */
16
- function getWorker() {
17
- if (!_worker) {
18
- _worker = new Worker(new URL(
19
- /* @vite-ignore */
20
- "/assets/transform-js.worker-CI2jwZbi.js",
21
- "" + import.meta.url
22
- ), { type: "module" });
23
- _worker.onmessage = (event) => {
24
- const { id, result, error } = event.data;
25
- const pending = _pendingMap.get(id);
26
- if (!pending) return;
27
- _pendingMap.delete(id);
28
- if (error !== void 0) pending.reject(new Error(error));
29
- else pending.resolve(result);
30
- };
31
- _worker.onerror = (event) => {
32
- const err = new Error(event.message);
33
- _pendingMap.forEach((pending) => pending.reject(err));
34
- _pendingMap.clear();
35
- };
36
- }
37
- return _worker;
2
+ var _babel = null;
3
+ var _esprima = null;
4
+ var _estraverse = null;
5
+ var _escodegen = null;
6
+ async function loadBabel() {
7
+ if (!_babel) _babel = await import("@babel/standalone");
8
+ return _babel;
38
9
  }
39
- /**
40
- * Worker 发送任务并等待结果
41
- * @param type - 操作类型
42
- * @param payload - 操作参数
43
- * @returns 操作结果的 Promise
44
- */
45
- function postTask(type, payload) {
46
- return new Promise((resolve, reject) => {
47
- const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
48
- _pendingMap.set(id, {
49
- resolve,
50
- reject
51
- });
52
- const request = {
53
- id,
54
- type,
55
- payload
56
- };
57
- console.log("Posting task to worker:", request, getWorker);
58
- resolve(null);
59
- });
10
+ async function loadAstModules() {
11
+ if (!_esprima) [_esprima, _estraverse, _escodegen] = await Promise.all([
12
+ import("esprima-next"),
13
+ import("estraverse"),
14
+ import("escodegen")
15
+ ]);
16
+ return {
17
+ esprima: _esprima,
18
+ estraverse: _estraverse,
19
+ escodegen: _escodegen
20
+ };
60
21
  }
61
22
  /**
62
- * 将 TypeScript/ES 代码编译为可在运行时执行的 JS 字符串(在 Worker 中执行)
63
- * @param code - 源代码字符串(支持 TS 语法)
23
+ * 将 TypeScript/ES 代码编译为可在运行时执行的 JS 字符串
24
+ * @param code - 源代码字符串(支持 TS 语法,可为 URI 编码)
64
25
  * @param needExport - 是否在末尾追加 `return exports`,默认为 true
65
- * @returns 编译后可执行的 JS 字符串,失败时返回 null
26
+ * @returns 编译后可执行的 JS 字符串
66
27
  */
67
- function buildRunJs(code, needExport = true) {
68
- return postTask(WorkerMessageType.BUILD_RUN_JS, {
69
- code,
70
- needExport
71
- });
28
+ async function buildRunJs(code, needExport = true) {
29
+ const babel = await loadBabel();
30
+ let decoded = code;
31
+ try {
32
+ decoded = decodeURIComponent(code);
33
+ } catch {
34
+ console.warn("decodeURIComponent failed, using original code");
35
+ }
36
+ return (babel.transform(decoded, {
37
+ filename: "inline.ts",
38
+ sourceMaps: false,
39
+ compact: false,
40
+ presets: [["typescript", {
41
+ allowDeclareFields: true,
42
+ optimizeConstEnums: true
43
+ }], ["env", {
44
+ targets: { browsers: "chrome >= 89" },
45
+ modules: "commonjs"
46
+ }]]
47
+ })?.code ?? "") + (needExport ? "\n return exports" : "");
72
48
  }
73
49
  /**
74
- * 解析代码字符串并提取所有命名导出函数的方法映射(在 Worker 中执行)
50
+ * 解析代码字符串并提取所有命名导出函数的方法映射
75
51
  * @param code - 包含命名导出函数的代码字符串
76
52
  * @returns 以函数名为键的方法映射对象,解析失败时返回空对象
77
53
  */
78
- function initMethodMap(code) {
79
- return postTask(WorkerMessageType.INIT_METHOD_MAP, { code });
54
+ async function initMethodMap(code) {
55
+ const { esprima, estraverse, escodegen } = await loadAstModules();
56
+ try {
57
+ const ast = esprima.parse(code, { sourceType: "module" });
58
+ const methods = {};
59
+ estraverse.traverse(ast, { enter(node) {
60
+ if (node.type !== "ExportNamedDeclaration") return;
61
+ const { name } = node.declaration.id;
62
+ const { params } = node.declaration;
63
+ methods[name] = {
64
+ type: "EXPORT_Function",
65
+ source: escodegen.generate(node),
66
+ params: params?.map((p) => p.name).join(",") ?? ""
67
+ };
68
+ } });
69
+ return methods;
70
+ } catch (error) {
71
+ console.error(error);
72
+ return {};
73
+ }
80
74
  }
81
75
  //#endregion
82
76
  export { buildRunJs, initMethodMap };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gct-paas/design",
3
- "version": "0.1.4-dev.17",
3
+ "version": "0.1.4-dev.18",
4
4
  "type": "module",
5
5
  "description": "paas 平台设计界面底包",
6
6
  "loader": "dist/loader.esm.min.js",
@@ -44,11 +44,12 @@
44
44
  "dependencies": {
45
45
  "@ant-design/icons-vue": "^7.0.1",
46
46
  "@babel/core": "^7.29.0",
47
+ "@babel/standalone": "^7.29.2",
47
48
  "@gct-paas/api": "^0.1.2-dev.1",
48
- "@gct-paas/core": "0.1.4-dev.17",
49
- "@gct-paas/core-web": "0.1.4-dev.17",
50
- "@gct-paas/schema": "0.1.4-dev.17",
51
- "@gct-paas/scss": "0.1.4-dev.17",
49
+ "@gct-paas/core": "0.1.4-dev.18",
50
+ "@gct-paas/core-web": "0.1.4-dev.18",
51
+ "@gct-paas/schema": "0.1.4-dev.18",
52
+ "@gct-paas/scss": "0.1.4-dev.18",
52
53
  "@jsplumb/browser-ui": "^6.2.10",
53
54
  "@vueuse/core": "^14.1.0",
54
55
  "ant-design-vue": "~3.2.20",
@@ -67,6 +68,7 @@
67
68
  },
68
69
  "devDependencies": {
69
70
  "@types/babel__core": "^7.20.5",
71
+ "@types/babel__standalone": "^7.1.9",
70
72
  "@types/estraverse": "^5.1.7"
71
73
  },
72
74
  "peerDependencies": {
@@ -77,5 +79,5 @@
77
79
  "@gct-paas/scss": "*",
78
80
  "vue": ">=3"
79
81
  },
80
- "gitHead": "386e2564d23891fd28c72e649788697ad12b7768"
82
+ "gitHead": "d79e561695bc9a4ff14b7c1bc735a595a32ed3e9"
81
83
  }