aldehyde 0.2.454 → 0.2.456

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.
Files changed (124) hide show
  1. package/lib/layout/menu/l2menu-message-bar.d.ts +2 -22
  2. package/lib/layout/menu/l2menu-message-bar.d.ts.map +1 -1
  3. package/lib/layout/menu/l2menu-message-bar.js +82 -89
  4. package/lib/layout/menu/l2menu-message-bar.js.map +1 -1
  5. package/lib/layout/menu/message-bar.less +5 -0
  6. package/lib/lowcode-components/bar-chart/index.d.ts.map +1 -1
  7. package/lib/lowcode-components/bar-chart/index.js +9 -0
  8. package/lib/lowcode-components/bar-chart/index.js.map +1 -1
  9. package/lib/lowcode-components/base-image/index.d.ts.map +1 -1
  10. package/lib/lowcode-components/base-image/index.js +8 -0
  11. package/lib/lowcode-components/base-image/index.js.map +1 -1
  12. package/lib/lowcode-components/base-map/index.d.ts.map +1 -1
  13. package/lib/lowcode-components/base-map/index.js +9 -0
  14. package/lib/lowcode-components/base-map/index.js.map +1 -1
  15. package/lib/lowcode-components/capsule-bar-chart/index.d.ts.map +1 -1
  16. package/lib/lowcode-components/capsule-bar-chart/index.js +9 -0
  17. package/lib/lowcode-components/capsule-bar-chart/index.js.map +1 -1
  18. package/lib/lowcode-components/carousel/index.d.ts.map +1 -1
  19. package/lib/lowcode-components/carousel/index.js +10 -0
  20. package/lib/lowcode-components/carousel/index.js.map +1 -1
  21. package/lib/lowcode-components/circular-progress-chart/index.d.ts.map +1 -1
  22. package/lib/lowcode-components/circular-progress-chart/index.js +10 -0
  23. package/lib/lowcode-components/circular-progress-chart/index.js.map +1 -1
  24. package/lib/lowcode-components/column-3d-chart/index.d.ts.map +1 -1
  25. package/lib/lowcode-components/column-3d-chart/index.js +9 -0
  26. package/lib/lowcode-components/column-3d-chart/index.js.map +1 -1
  27. package/lib/lowcode-components/column-chart/index.d.ts.map +1 -1
  28. package/lib/lowcode-components/column-chart/index.js +9 -0
  29. package/lib/lowcode-components/column-chart/index.js.map +1 -1
  30. package/lib/lowcode-components/data-number/index.d.ts.map +1 -1
  31. package/lib/lowcode-components/data-number/index.js +9 -0
  32. package/lib/lowcode-components/data-number/index.js.map +1 -1
  33. package/lib/lowcode-components/effectScatter-map/index.d.ts.map +1 -1
  34. package/lib/lowcode-components/effectScatter-map/index.js +9 -0
  35. package/lib/lowcode-components/effectScatter-map/index.js.map +1 -1
  36. package/lib/lowcode-components/effectScatter-map-3d/index.d.ts.map +1 -1
  37. package/lib/lowcode-components/effectScatter-map-3d/index.js +9 -0
  38. package/lib/lowcode-components/effectScatter-map-3d/index.js.map +1 -1
  39. package/lib/lowcode-components/gauge-chart/index.d.ts.map +1 -1
  40. package/lib/lowcode-components/gauge-chart/index.js +9 -0
  41. package/lib/lowcode-components/gauge-chart/index.js.map +1 -1
  42. package/lib/lowcode-components/line-bar-chart/index.d.ts.map +1 -1
  43. package/lib/lowcode-components/line-bar-chart/index.js +10 -0
  44. package/lib/lowcode-components/line-bar-chart/index.js.map +1 -1
  45. package/lib/lowcode-components/line-chart/index.d.ts.map +1 -1
  46. package/lib/lowcode-components/line-chart/index.js +10 -0
  47. package/lib/lowcode-components/line-chart/index.js.map +1 -1
  48. package/lib/lowcode-components/liquid-chart/index.d.ts.map +1 -1
  49. package/lib/lowcode-components/liquid-chart/index.js +9 -0
  50. package/lib/lowcode-components/liquid-chart/index.js.map +1 -1
  51. package/lib/lowcode-components/lowcode-view/component/abstract-definition.d.ts +2 -2
  52. package/lib/lowcode-components/lowcode-view/component/abstract-definition.d.ts.map +1 -1
  53. package/lib/lowcode-components/lowcode-view/component/component-container.js.map +1 -1
  54. package/lib/lowcode-components/lowcode-view/component/component-controller.d.ts +9 -2
  55. package/lib/lowcode-components/lowcode-view/component/component-controller.d.ts.map +1 -1
  56. package/lib/lowcode-components/lowcode-view/component/component-controller.js +40 -4
  57. package/lib/lowcode-components/lowcode-view/component/component-controller.js.map +1 -1
  58. package/lib/lowcode-components/lowcode-view/index.d.ts.map +1 -1
  59. package/lib/lowcode-components/lowcode-view/index.js +53 -8
  60. package/lib/lowcode-components/lowcode-view/index.js.map +1 -1
  61. package/lib/lowcode-components/pie-chart/index.d.ts.map +1 -1
  62. package/lib/lowcode-components/pie-chart/index.js +9 -0
  63. package/lib/lowcode-components/pie-chart/index.js.map +1 -1
  64. package/lib/lowcode-components/progress-chart/index.d.ts.map +1 -1
  65. package/lib/lowcode-components/progress-chart/index.js +9 -0
  66. package/lib/lowcode-components/progress-chart/index.js.map +1 -1
  67. package/lib/lowcode-components/stroke-animation/index.d.ts.map +1 -1
  68. package/lib/lowcode-components/stroke-animation/index.js +9 -0
  69. package/lib/lowcode-components/stroke-animation/index.js.map +1 -1
  70. package/lib/lowcode-components/text-scroller/index.d.ts.map +1 -1
  71. package/lib/lowcode-components/text-scroller/index.js +9 -0
  72. package/lib/lowcode-components/text-scroller/index.js.map +1 -1
  73. package/lib/table/column/column-builder.d.ts.map +1 -1
  74. package/lib/table/column/column-builder.js +12 -1
  75. package/lib/table/column/column-builder.js.map +1 -1
  76. package/lib/tmpl/hc-data-source.d.ts.map +1 -1
  77. package/lib/tmpl/hc-data-source.js +36 -8
  78. package/lib/tmpl/hc-data-source.js.map +1 -1
  79. package/lib/tmpl/hcservice-v3.d.ts +2 -4
  80. package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
  81. package/lib/tmpl/hcservice-v3.js +14 -2
  82. package/lib/tmpl/hcservice-v3.js.map +1 -1
  83. package/lib/tmpl/interface.d.ts +1 -0
  84. package/lib/tmpl/interface.d.ts.map +1 -1
  85. package/lib/tmpl/interface.js.map +1 -1
  86. package/lib/tmpl/web-socket.js +1 -1
  87. package/lib/tmpl/web-socket.js.map +1 -1
  88. package/package.json +1 -1
  89. package/src/aldehyde/layout/menu/l2menu-message-bar.tsx +39 -62
  90. package/src/aldehyde/layout/menu/message-bar.less +5 -0
  91. package/src/aldehyde/lowcode-components/bar-chart/index.tsx +10 -0
  92. package/src/aldehyde/lowcode-components/base-image/index.tsx +9 -0
  93. package/src/aldehyde/lowcode-components/base-map/index.tsx +10 -0
  94. package/src/aldehyde/lowcode-components/capsule-bar-chart/index.tsx +10 -0
  95. package/src/aldehyde/lowcode-components/carousel/index.tsx +11 -0
  96. package/src/aldehyde/lowcode-components/circular-progress-chart/index.tsx +10 -0
  97. package/src/aldehyde/lowcode-components/column-3d-chart/index.tsx +10 -0
  98. package/src/aldehyde/lowcode-components/column-chart/index.tsx +11 -0
  99. package/src/aldehyde/lowcode-components/data-number/index.tsx +10 -0
  100. package/src/aldehyde/lowcode-components/data.d.ts +1 -0
  101. package/src/aldehyde/lowcode-components/effectScatter-map/index.tsx +10 -0
  102. package/src/aldehyde/lowcode-components/effectScatter-map-3d/index.tsx +10 -0
  103. package/src/aldehyde/lowcode-components/gauge-chart/index.tsx +10 -0
  104. package/src/aldehyde/lowcode-components/line-bar-chart/index.tsx +11 -0
  105. package/src/aldehyde/lowcode-components/line-chart/index.tsx +11 -0
  106. package/src/aldehyde/lowcode-components/liquid-chart/index.tsx +10 -0
  107. package/src/aldehyde/lowcode-components/lowcode-view/component/abstract-definition.ts +2 -2
  108. package/src/aldehyde/lowcode-components/lowcode-view/component/component-container.tsx +3 -3
  109. package/src/aldehyde/lowcode-components/lowcode-view/component/component-controller.ts +42 -3
  110. package/src/aldehyde/lowcode-components/lowcode-view/index.tsx +55 -8
  111. package/src/aldehyde/lowcode-components/pie-chart/index.tsx +10 -0
  112. package/src/aldehyde/lowcode-components/progress-chart/index.tsx +10 -0
  113. package/src/aldehyde/lowcode-components/stroke-animation/index.tsx +10 -0
  114. package/src/aldehyde/lowcode-components/text-scroller/index.tsx +10 -0
  115. package/src/aldehyde/table/column/column-builder.tsx +10 -1
  116. package/src/aldehyde/tmpl/hc-data-source.tsx +34 -8
  117. package/src/aldehyde/tmpl/hcservice-v3.tsx +14 -1
  118. package/src/aldehyde/tmpl/interface.tsx +1 -0
  119. package/src/aldehyde/tmpl/web-socket.ts +1 -1
  120. package/lib/lowcode-components/lowcode-view/component/abstract-designer-controller.d.ts +0 -28
  121. package/lib/lowcode-components/lowcode-view/component/abstract-designer-controller.d.ts.map +0 -1
  122. package/lib/lowcode-components/lowcode-view/component/abstract-designer-controller.js +0 -49
  123. package/lib/lowcode-components/lowcode-view/component/abstract-designer-controller.js.map +0 -1
  124. package/src/aldehyde/lowcode-components/lowcode-view/component/abstract-designer-controller.ts +0 -56
@@ -2,7 +2,8 @@ import { ComponentType, ClassType, createElement } from "react";
2
2
  import { createRoot } from "react-dom/client";
3
3
  import { message } from "antd";
4
4
  import { UpdateOptions } from "./abstract-controller";
5
- import AbstractDesignerController from "./abstract-designer-controller";
5
+ import AbstractController from "./abstract-controller";
6
+ import { ComponentBaseProps, IFilterConfigType } from "../interface";
6
7
 
7
8
  const merge = (originalData: any, newData: any): any => {
8
9
  if (!originalData && newData)
@@ -51,7 +52,7 @@ class ComponentUtil {
51
52
  }
52
53
 
53
54
 
54
- export class ComponentController extends AbstractDesignerController {
55
+ export class ComponentController extends AbstractController {
55
56
 
56
57
  private componentNode: ComponentType; // 组件实例
57
58
  private componentType: string; // 组件类型
@@ -88,6 +89,9 @@ export class ComponentController extends AbstractDesignerController {
88
89
 
89
90
 
90
91
  changeData(data: any) {
92
+ if (!this.config) {
93
+ return;
94
+ }
91
95
  if (this.componentType === "BaseText" && typeof data !== 'string') { // 文本组件数据更新
92
96
  message.warning('数据类型错误, 基础文本仅接受字符串类型的数据: ', data);
93
97
  this.config.data.staticData = "";
@@ -108,8 +112,43 @@ export class ComponentController extends AbstractDesignerController {
108
112
  this.instance?.updateConfig(this.config);
109
113
  return;
110
114
  }
115
+ if (data?.type === "wsData") { // ws组件订阅数据更新
116
+ this.config.data.wsData = data;
117
+ this.instance?.updateConfig(this.config);
118
+ return;
119
+ }
111
120
  // 默认组件静态数据更新
112
121
  this.config.data.staticData = data;
113
122
  this.instance?.updateConfig(this.config);
114
123
  }
115
- }
124
+
125
+ // 更新组件数据
126
+ public loadComponentData({ type, data }: { type: string, data: any }): void {
127
+ switch (type) {
128
+ case "initData":
129
+ // 初始化数据加载逻辑
130
+ this.changeData({ ...data, type: "initData" });
131
+ break;
132
+ case "wsData": // 订阅数据更新
133
+ this.changeData({ ...data, type: "wsData" });
134
+ break;
135
+ default:
136
+ break;
137
+ }
138
+ }
139
+
140
+ // 设置滤镜效果
141
+ public updateFilter(filter: IFilterConfigType): void {
142
+ if (this.config && (this.config as ComponentBaseProps).filter)
143
+ (this.config as ComponentBaseProps)!.filter = filter;
144
+ if (!this.container)
145
+ return;
146
+ if (filter?.enable) {
147
+ this.container.style.filter = `blur(${filter.blur}px) brightness(${filter.brightness}) contrast(${filter.contrast}) opacity(${filter.opacity}) saturate(${filter.saturate}) hue-rotate(${filter.hueRotate}deg)`
148
+ } else {
149
+ this.container.style.filter = 'none';
150
+ }
151
+ }
152
+ }
153
+
154
+ export default ComponentController;
@@ -1,4 +1,4 @@
1
- import React, { CSSProperties, useEffect, useState, createContext, useMemo } from 'react'
1
+ import React, { CSSProperties, useEffect, useState, createContext, useMemo, useRef } from 'react'
2
2
  import { useParams } from 'react-router-dom';
3
3
  import isEqual from "lodash/isEqual";
4
4
  import chunk from "lodash/chunk";
@@ -8,6 +8,7 @@ import './component/font/FontGlobal.css';
8
8
  import ScreenFit from "./component/screen-fit";
9
9
  import { LayerManagerDataType, CanvasConfig, ILayerItem } from "./interface";
10
10
  import HcserviceV3 from "../../tmpl/hcservice-v3";
11
+ import WebSocket from "../../tmpl/web-socket";
11
12
  import abstractDesignerLoader from "./component/abstract-designer-loader";
12
13
  import { merge } from "./component/util";
13
14
  import ProgramConfig from ".././../units";
@@ -57,6 +58,8 @@ const viewHeight = {
57
58
  v5: "calc(100vh - 88px)"
58
59
  }
59
60
 
61
+ type DataSourceConfig = { sourceId: string, chartCode: string } & { [key: string]: any };
62
+
60
63
  interface Props {
61
64
  isFullScreen: boolean,
62
65
  ddpageId?: string,
@@ -76,12 +79,17 @@ const LowcodeView = (props: Props) => {
76
79
  const [controllers, setControllers] = useState<any>({});
77
80
  const [searchParams, setSearchParams] = useState<any>({}); // 全局搜索参数,用于组件间通信
78
81
  const { width, height, adaptationType, backgroundColor } = canvasConfig || {};
82
+ const wsRef = useRef(undefined); // 实时数据websocket连接
83
+ const subscribeRef = useRef(undefined); // 实时数据订阅
79
84
 
80
85
  const backgroundImage = useMemo(() => handleImgUrl(canvasConfig?.backgroundImage), [canvasConfig]);
81
86
 
82
87
  useEffect(() => {
83
88
  //加载
84
89
  abstractDesignerLoader.load();
90
+ return () => {
91
+ subscribeRef.current && subscribeRef.current.unsubscribe();
92
+ }
85
93
  }, []);
86
94
 
87
95
  // 获取画面数据
@@ -109,8 +117,8 @@ const LowcodeView = (props: Props) => {
109
117
  setLayerManager({ ...layerManager, layerConfigs: { ...layerConfigs, ...temObj } });
110
118
  };
111
119
 
112
- // 获取初始化组件数据
113
- const getInitComponentData = async () => {
120
+ // all(所有数据源组件)、init(初始化请求组件)
121
+ const handleDataSourceParams = () => {
114
122
  const { elemConfigs } = layerManager;
115
123
  const nodesIds = Object.keys(elemConfigs || {});
116
124
  // publicParams 组件公共参数
@@ -123,14 +131,23 @@ const LowcodeView = (props: Props) => {
123
131
  const dataSourceConfigs = nodesIds.reduce((total, next) => {
124
132
  const { data: item = {}, base } = elemConfigs[next] || {};
125
133
  const temParams = { ...publicParams, ...(initSearchParams?.[next] || {}) }; // 指定组件传参,指定传参可覆盖公共
126
- if ((item.isInitParams || base.type === "PlaceholderComponent") && controllers[next]) {
134
+ if ((item.isInitParams || base.type === "PlaceholderComponent") && controllers[next]) { // 组件数据源接收外部参数,更新参数
127
135
  controllers[next].changeData({ ...elemConfigs[next], initSearchParams: temParams, type: "initSearchParams" });
128
136
  }
129
- if (item.sourceType === "sourceId" && item.sourceId && item.isInit) {
130
- total.push({ sourceId: item.sourceId, chartCode: next, ...(item.isInitParams ? temParams : {}) });
137
+ if (item.sourceType === "sourceId" && item.sourceId) { // 整合初始化请求/ws请求参数
138
+ const itemConfig = { sourceId: item.sourceId, chartCode: next, ...(item.isInitParams ? temParams : {}) };
139
+ if (item.isInit) { // 初始化请求
140
+ total.initDataSource.push(itemConfig);
141
+ }
142
+ total.allDataSource.push(itemConfig);
131
143
  }
132
144
  return total;
133
- }, []);
145
+ }, { allDataSource: [], initDataSource: [] });
146
+ return dataSourceConfigs;
147
+ }
148
+
149
+ // 获取初始化组件数据
150
+ const getInitComponentData = async (dataSourceConfigs: DataSourceConfig[]) => {
134
151
  if (!dataSourceConfigs.length) return;
135
152
  const temSourceConfigs = chunk(dataSourceConfigs, 10); // 每批处理10个组件数据
136
153
  temSourceConfigs.forEach(i => {
@@ -145,12 +162,42 @@ const LowcodeView = (props: Props) => {
145
162
  })
146
163
  };
147
164
 
165
+ // 获取当前大屏数据源配置
166
+ const getCharWSConfig = async (dataSourceConfigs: DataSourceConfig[]) => {
167
+ if (!dataSourceConfigs.length) return;
168
+ const sourceIds = dataSourceConfigs.map(r => r.sourceId);
169
+ const res = await HcserviceV3.requestCharWSConfig(null, sourceIds);
170
+ const wsSourceIds = Object.keys(res?.config || {});
171
+ if (!wsSourceIds?.length) {
172
+ return;
173
+ }
174
+ return dataSourceConfigs.filter(r => wsSourceIds.includes(r.sourceId));
175
+ }
176
+
177
+ // 实时订阅组件数据
178
+ const webSocketComponentData = async (dataSourceConfigs: DataSourceConfig[]) => {
179
+ if (subscribeRef.current) { subscribeRef.current.unsubscribe(); }
180
+ const temArr = await getCharWSConfig(dataSourceConfigs);
181
+ if (!temArr?.length) {
182
+ return;
183
+ }
184
+ wsRef.current = WebSocket.getInstance("v3/kk-ws");
185
+ // 订阅大屏数据
186
+ subscribeRef.current = await wsRef.current.subscribe(`/user/queue/chart-data/${ddpageId}`, { dataSourceConfigs: JSON.stringify(temArr) }, (data) => {
187
+ for (const item in data) { // 更新组件数据
188
+ controllers[item] && controllers[item].loadComponentData({ type: "wsData", data: data[item] || {} });
189
+ }
190
+ });
191
+ }
192
+
148
193
  useEffect(() => {
149
194
  const cKeys = Object.keys(controllers);
150
195
  const leKeys = Object.values(layerManager?.elemConfigs || {}).filter(item => item.base?.type !== "group").map(item => item.id);
151
196
  // 判断组件实例是否加载完成(组件实例是否存在且与配置数量相等)
152
197
  if (cKeys.length && cKeys.length === leKeys.length) {
153
- getInitComponentData();
198
+ const { allDataSource, initDataSource } = handleDataSourceParams();
199
+ getInitComponentData(initDataSource); // 初始化请求
200
+ webSocketComponentData(allDataSource); // ws订阅数据
154
201
  }
155
202
  }, [controllers, initSearchParams]);
156
203
 
@@ -174,6 +174,15 @@ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>
174
174
  }
175
175
  }
176
176
 
177
+ // ws订阅数据更新
178
+ const handleWSData = (val: DataConfigProps) => {
179
+ if (val.sourceType === "sourceId" && val.wsData) {
180
+ const { value } = val.initData;
181
+ const temData = handleData(value);
182
+ setData(temData);
183
+ }
184
+ }
185
+
177
186
  useImperativeHandle(ref, () => ({
178
187
  updateConfig: (newConfig) => {
179
188
  const { base, style: newStyle, data: newDataConfig, initSearchParams: newISParams } = newConfig;
@@ -184,6 +193,7 @@ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>
184
193
  handleInitData(newDataConfig);
185
194
  setSearchParams(newDataConfig.searchParams);
186
195
  setInitSearchParams(newISParams);
196
+ handleWSData(newDataConfig);
187
197
  },
188
198
  destroy: handleDestroy,
189
199
  }));
@@ -137,6 +137,15 @@ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>
137
137
  }
138
138
  }
139
139
 
140
+ // ws订阅数据更新
141
+ const handleWSData = (val: DataConfigProps) => {
142
+ if (val.sourceType === "sourceId" && val.wsData) {
143
+ const { value } = val.initData;
144
+ const temData = handleData(value);
145
+ setData(temData);
146
+ }
147
+ }
148
+
140
149
  useImperativeHandle(ref, () => ({
141
150
  updateConfig: (newConfig) => {
142
151
  const { base, style: newStyle, data: newDataConfig, initSearchParams: newISParams } = newConfig;
@@ -147,6 +156,7 @@ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>
147
156
  handleInitData(newDataConfig);
148
157
  setSearchParams(newDataConfig.searchParams);
149
158
  setInitSearchParams(newISParams);
159
+ handleWSData(newDataConfig);
150
160
  },
151
161
  destroy: handleDestroy,
152
162
  }));
@@ -64,6 +64,15 @@ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>
64
64
  }
65
65
  }
66
66
 
67
+ // ws订阅数据更新
68
+ const handleWSData = (val: DataConfigProps) => {
69
+ if (val.sourceType === "sourceId" && val.wsData) {
70
+ const { value } = val.initData;
71
+ const temData = handleData(value);
72
+ setData(temData);
73
+ }
74
+ }
75
+
67
76
  useImperativeHandle(ref, () => ({
68
77
  updateConfig: (newConfig) => {
69
78
  const { base, style: newStyle, data: newDataConfig, initSearchParams: newISParams } = newConfig;
@@ -73,6 +82,7 @@ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>
73
82
  handleInitData(newDataConfig);
74
83
  setSearchParams(newDataConfig.searchParams);
75
84
  setInitSearchParams(newISParams);
85
+ handleWSData(newDataConfig);
76
86
  },
77
87
  destroy: handleDestroy,
78
88
  }));
@@ -63,6 +63,15 @@ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>
63
63
  }
64
64
  }
65
65
 
66
+ // ws订阅数据更新
67
+ const handleWSData = (val: DataConfigProps) => {
68
+ if (val.sourceType === "sourceId" && val.wsData) {
69
+ const { value } = val.initData;
70
+ const temData = handleData(value);
71
+ setData(temData);
72
+ }
73
+ }
74
+
66
75
  useImperativeHandle(ref, () => ({
67
76
  updateConfig: (newConfig) => {
68
77
  const { style: newStyle, data: newDataConfig, initSearchParams: newISParams } = newConfig;
@@ -72,6 +81,7 @@ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>
72
81
  handleInitData(newDataConfig);
73
82
  setSearchParams(newDataConfig.searchParams);
74
83
  setInitSearchParams(newISParams);
84
+ handleWSData(newDataConfig);
75
85
  },
76
86
  destroy: handleDestroy,
77
87
  }));
@@ -97,7 +97,16 @@ export default {
97
97
  if (hiddenColIds && hiddenColIds.includes(item.originalId)) {
98
98
  return
99
99
  } else {
100
- tableColumns.push(column);
100
+ if (item.columnGroupName) { // 表头分组功能实现
101
+ const groupIndex = tableColumns.findIndex(r => r.children?.length && r.title === item.columnGroupName);
102
+ if (groupIndex !== -1) {
103
+ tableColumns[groupIndex].children.push(column);
104
+ } else {
105
+ tableColumns.push({ title: item.columnGroupName, align: "center", children: [column] });
106
+ }
107
+ } else {
108
+ tableColumns.push(column);
109
+ }
101
110
  }
102
111
  let title1 = translate("${" + item.title + "}");
103
112
  column["title"] = item.tip ? <>{title1}<Tooltip placement="top" title={item.tip}>
@@ -25,6 +25,8 @@ const fastMenuCache: Map<string, Level2Menu[]> = new Map<
25
25
  Level2Menu[]
26
26
  >();
27
27
  const enumMap: Map<string, EnumItem[]> = new Map<string, EnumItem[]>(); //key mstrucId
28
+ // pendingEnumRequests: 用于存储正在进行的枚举请求,防止多个组件同时请求同一个枚举时产生重复请求;key: mstrucId (枚举ID), value: Promise (对应的请求Promise)
29
+ const pendingEnumRequests: Map<string, Promise<void>> = new Map();
28
30
  const enumValueMap: Map<string, Map<string, string>> = new Map<
29
31
  string,
30
32
  Map<string, string>
@@ -156,15 +158,39 @@ async function loadEnumOfLtmplConfig(
156
158
 
157
159
  async function loadEnum(serverKey: string, mstrucIds: string[], path?: string) {
158
160
  if (mstrucIds && mstrucIds.length > 0) {
159
- let reqEnum = await HcserviceV3.requestEnum(serverKey, mstrucIds, path);
160
- for (let key in reqEnum) {
161
- let ems = reqEnum[key];
162
- for (let option of ems) {
163
- if (option["css"]) {
164
- option["color"] = option["css"].color;
165
- }
161
+ const pendingIds: string[] = []; // 需要发起新请求的枚举ID
162
+ const waitPromises: Promise<void>[] = []; // 正在请求中的Promise,等待它们完成
163
+ for (const id of mstrucIds) {
164
+ if (pendingEnumRequests.has(id)) { // 该枚举正在请求中,加入等待队列
165
+ waitPromises.push(pendingEnumRequests.get(id));
166
+ } else { // 该枚举需要发起新请求
167
+ pendingIds.push(id);
166
168
  }
167
- enumMap.set(key, ems);
169
+ }
170
+ if (waitPromises.length > 0) { // 等待所有已在请求中的枚举完成
171
+ await Promise.all(waitPromises);
172
+ }
173
+ if (pendingIds.length > 0) { //发起新的请求(仅针对未加载且未在请求中的枚举)
174
+ // 创建请求Promise并记录到pendingEnumRequests,防止后续请求重复发起
175
+ const requestPromise = (async () => {
176
+ try {
177
+ let reqEnum = await HcserviceV3.requestEnum(serverKey, pendingIds, path);
178
+ for (let key in reqEnum) {
179
+ let ems = reqEnum[key];
180
+ for (let option of ems) {
181
+ if (option["css"]) {
182
+ option["color"] = option["css"].color;
183
+ }
184
+ }
185
+ enumMap.set(key, ems);
186
+ }
187
+ } finally {
188
+ // 请求完成后清理pending状态
189
+ pendingIds.forEach(id => pendingEnumRequests.delete(id));
190
+ }
191
+ })();
192
+ pendingIds.forEach(id => pendingEnumRequests.set(id, requestPromise));
193
+ await requestPromise;
168
194
  }
169
195
  }
170
196
  }
@@ -761,6 +761,18 @@ export default class HcserviceV3 {
761
761
  return res;
762
762
  }
763
763
 
764
+ static async requestCharWSConfig(
765
+ serverKey: string,
766
+ sourceIds: string[]
767
+ ) {
768
+ let res = await Super.super({
769
+ url: `/v3/chart/ws/config`,
770
+ serverKey,
771
+ method: "GET",
772
+ query: { sourceIds },
773
+ });
774
+ return res;
775
+ }
764
776
 
765
777
  static async postActions(
766
778
  serverKey: string,
@@ -1498,7 +1510,8 @@ export default class HcserviceV3 {
1498
1510
  }
1499
1511
 
1500
1512
  // ws发送消息
1501
- static async wsPush(hydrocarbonToken, data = { message: "测试数据", destination: "/user/queue/dashboard" }) {
1513
+ // data:{ message: "测试数据", destination: "/user/queue/dashboard" }
1514
+ static async wsPush(hydrocarbonToken, data) {
1502
1515
  const res = await Super.super({
1503
1516
  url: `/v3/ws-push/${hydrocarbonToken}`,
1504
1517
  data,
@@ -291,6 +291,7 @@ export interface ColumnConfig extends FieldConfig {
291
291
  originalId: string;
292
292
  upperColumnTitle?: string,
293
293
  rowEditable?: boolean,
294
+ columnGroupName?: string, // 列分组
294
295
  }
295
296
 
296
297
  export type CodeSource = "new" | "listop" | "listop-new" | undefined;
@@ -309,7 +309,7 @@ class WebSocket {
309
309
  // 订阅队列
310
310
  private async _flushQueue() {
311
311
  if (this.operationQueue.length === 0) return;
312
- console.log(`[WS] 🚀 正在执行 ${this.operationQueue.length} 个排队操作...`);
312
+ // console.log(`[WS] 🚀 正在执行 ${this.operationQueue.length} 个排队操作...`);
313
313
  const queue = [...this.operationQueue];
314
314
  this.operationQueue = [];
315
315
  for (const op of queue) {
@@ -1,28 +0,0 @@
1
- import AbstractController from "./abstract-controller";
2
- import { IFilterConfigType, ThemeItemType } from "../interface";
3
- /**
4
- * AbstractDesignerController继承自AbstractController,在泛型的定义和约束上和AbstractController完全保持一致。
5
- * 此外,AbstractDesignerController扩展了一些自定义组件所需的特有方法,如:修改组件数据等
6
- */
7
- declare abstract class AbstractDesignerController<I = any, C = any> extends AbstractController<I, C> {
8
- /**
9
- * 更新组件数据,且必须触发组件的重新渲染
10
- * @param data
11
- */
12
- changeData(data: any): void;
13
- /**
14
- * 更新组件数据
15
- */
16
- loadComponentData({ type, data }: {
17
- type: string;
18
- data: any;
19
- }): void;
20
- /**
21
- * 更新本组件的主题样式方法,用于在全局切换主题时使用
22
- * @param newTheme 新主题
23
- */
24
- updateTheme(newTheme: ThemeItemType): void;
25
- updateFilter(filter: IFilterConfigType): void;
26
- }
27
- export default AbstractDesignerController;
28
- //# sourceMappingURL=abstract-designer-controller.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"abstract-designer-controller.d.ts","sourceRoot":"","sources":["../../../../../../src/aldehyde/lowcode-components/lowcode-view/component/abstract-designer-controller.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAsB,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEpF;;;GAGG;AACH,uBAAe,0BAA0B,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAE,SAAQ,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;IAExF;;;OAGG;IAEI,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIlC;;OAEG;IACI,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI;IAW3E;;;OAGG;IAEI,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI1C,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;CAYvD;AAED,eAAe,0BAA0B,CAAC"}
@@ -1,49 +0,0 @@
1
- import AbstractController from "./abstract-controller";
2
- /**
3
- * AbstractDesignerController继承自AbstractController,在泛型的定义和约束上和AbstractController完全保持一致。
4
- * 此外,AbstractDesignerController扩展了一些自定义组件所需的特有方法,如:修改组件数据等
5
- */
6
- class AbstractDesignerController extends AbstractController {
7
- /**
8
- * 更新组件数据,且必须触发组件的重新渲染
9
- * @param data
10
- */
11
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
- changeData(data) {
13
- }
14
- /**
15
- * 更新组件数据
16
- */
17
- loadComponentData({ type, data }) {
18
- switch (type) {
19
- case "initData":
20
- // 初始化数据加载逻辑
21
- this.changeData(Object.assign(Object.assign({}, data), { type: "initData" }));
22
- break;
23
- default:
24
- break;
25
- }
26
- }
27
- /**
28
- * 更新本组件的主题样式方法,用于在全局切换主题时使用
29
- * @param newTheme 新主题
30
- */
31
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
32
- updateTheme(newTheme) {
33
- }
34
- // 设置滤镜效果
35
- updateFilter(filter) {
36
- if (this.config && this.config.filter)
37
- this.config.filter = filter;
38
- if (!this.container)
39
- return;
40
- if (filter === null || filter === void 0 ? void 0 : filter.enable) {
41
- this.container.style.filter = `blur(${filter.blur}px) brightness(${filter.brightness}) contrast(${filter.contrast}) opacity(${filter.opacity}) saturate(${filter.saturate}) hue-rotate(${filter.hueRotate}deg)`;
42
- }
43
- else {
44
- this.container.style.filter = 'none';
45
- }
46
- }
47
- }
48
- export default AbstractDesignerController;
49
- //# sourceMappingURL=abstract-designer-controller.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"abstract-designer-controller.js","sourceRoot":"","sources":["../../../../../../src/aldehyde/lowcode-components/lowcode-view/component/abstract-designer-controller.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AAGvD;;;GAGG;AACH,MAAe,0BAA6C,SAAQ,kBAAwB;IAExF;;;OAGG;IACH,6DAA6D;IACtD,UAAU,CAAC,IAAS;IAC3B,CAAC;IAGD;;OAEG;IACI,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAA+B;QAChE,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,UAAU;gBACX,YAAY;gBACZ,IAAI,CAAC,UAAU,iCAAM,IAAI,KAAE,IAAI,EAAE,UAAU,IAAG,CAAC;gBAC/C,MAAM;YACV;gBACI,MAAM;QACd,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,6DAA6D;IACtD,WAAW,CAAC,QAAuB;IAC1C,CAAC;IAED,SAAS;IACF,YAAY,CAAC,MAAyB;QACzC,IAAI,IAAI,CAAC,MAAM,IAAK,IAAI,CAAC,MAA6B,CAAC,MAAM;YACxD,IAAI,CAAC,MAA8B,CAAC,MAAM,GAAG,MAAM,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS;YACf,OAAO;QACX,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,MAAM,CAAC,IAAI,kBAAkB,MAAM,CAAC,UAAU,cAAc,MAAM,CAAC,QAAQ,aAAa,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,QAAQ,gBAAgB,MAAM,CAAC,SAAS,MAAM,CAAA;QACnN,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACzC,CAAC;IACL,CAAC;CAEJ;AAED,eAAe,0BAA0B,CAAC"}
@@ -1,56 +0,0 @@
1
- import AbstractController from "./abstract-controller";
2
- import { ComponentBaseProps, IFilterConfigType, ThemeItemType } from "../interface";
3
-
4
- /**
5
- * AbstractDesignerController继承自AbstractController,在泛型的定义和约束上和AbstractController完全保持一致。
6
- * 此外,AbstractDesignerController扩展了一些自定义组件所需的特有方法,如:修改组件数据等
7
- */
8
- abstract class AbstractDesignerController<I = any, C = any> extends AbstractController<I, C> {
9
-
10
- /**
11
- * 更新组件数据,且必须触发组件的重新渲染
12
- * @param data
13
- */
14
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
15
- public changeData(data: any): void {
16
- }
17
-
18
-
19
- /**
20
- * 更新组件数据
21
- */
22
- public loadComponentData({ type, data }: { type: string, data: any }): void {
23
- switch (type) {
24
- case "initData":
25
- // 初始化数据加载逻辑
26
- this.changeData({ ...data, type: "initData" });
27
- break;
28
- default:
29
- break;
30
- }
31
- }
32
-
33
- /**
34
- * 更新本组件的主题样式方法,用于在全局切换主题时使用
35
- * @param newTheme 新主题
36
- */
37
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
38
- public updateTheme(newTheme: ThemeItemType): void {
39
- }
40
-
41
- // 设置滤镜效果
42
- public updateFilter(filter: IFilterConfigType): void {
43
- if (this.config && (this.config as ComponentBaseProps).filter)
44
- (this.config as ComponentBaseProps)!.filter = filter;
45
- if (!this.container)
46
- return;
47
- if (filter?.enable) {
48
- this.container.style.filter = `blur(${filter.blur}px) brightness(${filter.brightness}) contrast(${filter.contrast}) opacity(${filter.opacity}) saturate(${filter.saturate}) hue-rotate(${filter.hueRotate}deg)`
49
- } else {
50
- this.container.style.filter = 'none';
51
- }
52
- }
53
-
54
- }
55
-
56
- export default AbstractDesignerController;