aldehyde 0.2.449 → 0.2.452
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.
- package/lib/controls/enum-badge/index.d.ts.map +1 -1
- package/lib/controls/enum-badge/index.js +21 -3
- package/lib/controls/enum-badge/index.js.map +1 -1
- package/lib/controls/enum-tag/index.d.ts.map +1 -1
- package/lib/controls/enum-tag/index.js +34 -19
- package/lib/controls/enum-tag/index.js.map +1 -1
- package/lib/form/criteria-form.js +1 -1
- package/lib/form/criteria-form.js.map +1 -1
- package/lib/lowcode-components/base-image/index.d.ts.map +1 -1
- package/lib/lowcode-components/base-image/index.js +5 -2
- package/lib/lowcode-components/base-image/index.js.map +1 -1
- package/lib/table/pagination.js +2 -2
- package/lib/table/pagination.js.map +1 -1
- package/lib/table/query-table.d.ts.map +1 -1
- package/lib/table/query-table.js +3 -2
- package/lib/table/query-table.js.map +1 -1
- package/lib/table/select-table.d.ts.map +1 -1
- package/lib/table/select-table.js +2 -2
- package/lib/table/select-table.js.map +1 -1
- package/lib/tmpl/hc-data-source.d.ts +2 -2
- package/lib/tmpl/hc-data-source.d.ts.map +1 -1
- package/lib/tmpl/hc-data-source.js +24 -18
- package/lib/tmpl/hc-data-source.js.map +1 -1
- package/lib/tmpl/hcservice-v3.d.ts +4 -0
- package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
- package/lib/tmpl/hcservice-v3.js +16 -0
- package/lib/tmpl/hcservice-v3.js.map +1 -1
- package/lib/tmpl/web-socket.d.ts +52 -0
- package/lib/tmpl/web-socket.d.ts.map +1 -0
- package/lib/tmpl/web-socket.js +355 -0
- package/lib/tmpl/web-socket.js.map +1 -0
- package/package.json +3 -1
- package/src/aldehyde/controls/enum-badge/index.tsx +14 -4
- package/src/aldehyde/controls/enum-tag/index.tsx +29 -21
- package/src/aldehyde/form/criteria-form.tsx +1 -1
- package/src/aldehyde/lowcode-components/base-image/index.tsx +5 -2
- package/src/aldehyde/table/pagination.tsx +2 -2
- package/src/aldehyde/table/query-table.tsx +2 -1
- package/src/aldehyde/table/select-table.tsx +2 -1
- package/src/aldehyde/tmpl/hc-data-source.tsx +13 -7
- package/src/aldehyde/tmpl/hcservice-v3.tsx +14 -0
- package/src/aldehyde/tmpl/web-socket.ts +367 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import SockJS from 'sockjs-client';
|
|
11
|
+
import { Client } from '@stomp/stompjs';
|
|
12
|
+
import Units from "../units";
|
|
13
|
+
/**
|
|
14
|
+
* 使用方法:
|
|
15
|
+
* const webSocket= WebSocket.getInstance(WS_URL); // 创建连接
|
|
16
|
+
* const subscribe = webSocket.subscribe('/topic/test',{}, (val)=>{console.log("推送的数据:",val)}); // 订阅
|
|
17
|
+
* subscribe.unsubscribe(); // 销毁订阅
|
|
18
|
+
* webSocket.disconnect(); // 关闭连接
|
|
19
|
+
*/
|
|
20
|
+
// 获取订阅地址
|
|
21
|
+
const getWebSocketConfig = (path, options) => {
|
|
22
|
+
const serverKey = options.serverKey;
|
|
23
|
+
const header = options.connectionHeaders || {};
|
|
24
|
+
const programCode = header.programCode || Units.programCode(serverKey);
|
|
25
|
+
let server = new URL(options.hydrocarbonServer ? options.hydrocarbonServer : Units.api(serverKey));
|
|
26
|
+
let hydrocarbonToken = null;
|
|
27
|
+
if (header === null || header === void 0 ? void 0 : header.hydrocarbonToken) {
|
|
28
|
+
hydrocarbonToken = header.hydrocarbonToken;
|
|
29
|
+
}
|
|
30
|
+
else if (serverKey) {
|
|
31
|
+
hydrocarbonToken = Units.serverHydrocarbonToken(serverKey);
|
|
32
|
+
}
|
|
33
|
+
else if (Units.hydrocarbonToken(programCode)) {
|
|
34
|
+
hydrocarbonToken = Units.hydrocarbonToken(programCode);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
hydrocarbonToken = Units.getAnoHydrocarbonToken();
|
|
38
|
+
}
|
|
39
|
+
const url = `${server.protocol}//${server.host}${server.pathname}/${path}`;
|
|
40
|
+
return { url, hydrocarbonToken, programCode };
|
|
41
|
+
};
|
|
42
|
+
// 连接状态枚举
|
|
43
|
+
var ConnectionState;
|
|
44
|
+
(function (ConnectionState) {
|
|
45
|
+
ConnectionState["DISCONNECTED"] = "DISCONNECTED";
|
|
46
|
+
ConnectionState["CONNECTING"] = "CONNECTING";
|
|
47
|
+
ConnectionState["CONNECTED"] = "CONNECTED";
|
|
48
|
+
ConnectionState["RECONNECTING"] = "RECONNECTING";
|
|
49
|
+
})(ConnectionState || (ConnectionState = {}));
|
|
50
|
+
class WebSocket {
|
|
51
|
+
/**
|
|
52
|
+
* 获取单例实例的唯一入口
|
|
53
|
+
* @param url WebSocket 服务器地址
|
|
54
|
+
* @param options 配置项
|
|
55
|
+
* @returns 返回对应 URL 的唯一 WebSocket 实例
|
|
56
|
+
*/
|
|
57
|
+
static getInstance(url, options = {}) {
|
|
58
|
+
if (!WebSocket.instances.has(url)) {
|
|
59
|
+
// 注意:这里调用的是私有的构造函数
|
|
60
|
+
const instance = new WebSocket(url, options);
|
|
61
|
+
WebSocket.instances.set(url, instance);
|
|
62
|
+
}
|
|
63
|
+
return WebSocket.instances.get(url);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 私有构造函数
|
|
67
|
+
* 防止外部直接使用 new WebSocket() 导致单例失效
|
|
68
|
+
*/
|
|
69
|
+
constructor(url, options = {}) {
|
|
70
|
+
this.client = null;
|
|
71
|
+
this.subscriptions = new Map();
|
|
72
|
+
this.operationQueue = [];
|
|
73
|
+
this.state = ConnectionState.DISCONNECTED;
|
|
74
|
+
this.reconnectAttempts = 0;
|
|
75
|
+
this.reconnectTimer = null;
|
|
76
|
+
this.connectPromises = new Map();
|
|
77
|
+
this.config = {
|
|
78
|
+
reconnectDelay: 5000,
|
|
79
|
+
maxReconnectAttempts: 5,
|
|
80
|
+
heartbeatIncoming: 10000,
|
|
81
|
+
heartbeatOutgoing: 10000,
|
|
82
|
+
debug: false,
|
|
83
|
+
connectionHeaders: {},
|
|
84
|
+
};
|
|
85
|
+
this.url = url;
|
|
86
|
+
this.config = Object.assign(Object.assign({}, this.config), options);
|
|
87
|
+
this.connect();
|
|
88
|
+
}
|
|
89
|
+
// 建立连接
|
|
90
|
+
connect() {
|
|
91
|
+
if (this.state === ConnectionState.CONNECTED) { // 当前已连接不重复创建连接
|
|
92
|
+
return Promise.resolve();
|
|
93
|
+
}
|
|
94
|
+
this.state = ConnectionState.CONNECTING;
|
|
95
|
+
const { url: wsUrl, hydrocarbonToken, programCode } = getWebSocketConfig(this.url, this.config);
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
const currentPromiseId = Date.now().toString();
|
|
98
|
+
this.connectPromises.set(currentPromiseId, { resolve, reject });
|
|
99
|
+
const { heartbeatIncoming, heartbeatOutgoing, reconnectDelay } = this.config;
|
|
100
|
+
const socket = new SockJS(wsUrl);
|
|
101
|
+
this.client = new Client({
|
|
102
|
+
webSocketFactory: () => socket,
|
|
103
|
+
debug: this.config.debug ? (str) => console.log('[STOMP]', str) : () => { },
|
|
104
|
+
heartbeatIncoming,
|
|
105
|
+
heartbeatOutgoing,
|
|
106
|
+
reconnectDelay,
|
|
107
|
+
connectHeaders: {
|
|
108
|
+
"hydrocarbon-token": hydrocarbonToken,
|
|
109
|
+
"hydrocarbon-program-token": programCode
|
|
110
|
+
},
|
|
111
|
+
onConnect: (frame) => {
|
|
112
|
+
console.log("连接成功:frame", frame);
|
|
113
|
+
this.state = ConnectionState.CONNECTED;
|
|
114
|
+
this.reconnectAttempts = 0;
|
|
115
|
+
this.connectPromises.forEach(({ resolve }) => resolve());
|
|
116
|
+
this.connectPromises.clear();
|
|
117
|
+
this._restoreSubscriptions();
|
|
118
|
+
this._flushQueue().catch(console.error);
|
|
119
|
+
},
|
|
120
|
+
onStompError: (frame) => {
|
|
121
|
+
console.error('[WS] ❌ STOMP 协议错误', frame);
|
|
122
|
+
const error = new Error(frame.headers['message'] || 'STOMP Error');
|
|
123
|
+
if (this.state !== ConnectionState.DISCONNECTED) {
|
|
124
|
+
this.state = ConnectionState.DISCONNECTED;
|
|
125
|
+
this.client = null;
|
|
126
|
+
this._scheduleReconnect();
|
|
127
|
+
}
|
|
128
|
+
this.connectPromises.forEach(({ reject }) => reject(error));
|
|
129
|
+
this.connectPromises.clear();
|
|
130
|
+
},
|
|
131
|
+
onWebSocketClose: () => {
|
|
132
|
+
if ([ConnectionState.CONNECTED, ConnectionState.CONNECTING].includes(this.state)) {
|
|
133
|
+
console.warn('[WS] ⚠️ 连接意外断开,准备重连...');
|
|
134
|
+
this.state = ConnectionState.DISCONNECTED;
|
|
135
|
+
this.client = null;
|
|
136
|
+
this._scheduleReconnect(); // 断开重连
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
onWebSocketError: (error) => {
|
|
140
|
+
console.error('[WS] ❌ WebSocket 错误', error);
|
|
141
|
+
const wsError = new Error('WebSocket Error');
|
|
142
|
+
if (this.state !== ConnectionState.DISCONNECTED) {
|
|
143
|
+
this.state = ConnectionState.DISCONNECTED;
|
|
144
|
+
this.client = null;
|
|
145
|
+
this._scheduleReconnect();
|
|
146
|
+
}
|
|
147
|
+
this.connectPromises.forEach(({ reject }) => reject(wsError));
|
|
148
|
+
this.connectPromises.clear();
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
this.client.activate();
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// 订阅请求
|
|
155
|
+
subscribe(topic, params, callback) {
|
|
156
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
157
|
+
if (this.state === ConnectionState.CONNECTED && this.client) {
|
|
158
|
+
return this._doSubscribe(topic, callback, params);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
return new Promise((resolve, reject) => {
|
|
162
|
+
this.operationQueue.push({
|
|
163
|
+
type: 'SUBSCRIBE',
|
|
164
|
+
payload: { topic, callback, resolve, reject, params },
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// 执行实际订阅
|
|
171
|
+
_doSubscribe(topic, callback, params) {
|
|
172
|
+
return new Promise((resolve, reject) => {
|
|
173
|
+
if (!this.client) {
|
|
174
|
+
reject(new Error('Client not initialized'));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const stompSub = this.client.subscribe(topic, (message) => {
|
|
179
|
+
try {
|
|
180
|
+
let body = message.body;
|
|
181
|
+
if (typeof message.body === 'string') {
|
|
182
|
+
body = JSON.parse(message.body);
|
|
183
|
+
}
|
|
184
|
+
callback(body, message);
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
console.error('[WS] JSON 解析错误', e);
|
|
188
|
+
callback(message.body, message);
|
|
189
|
+
}
|
|
190
|
+
}, params || {});
|
|
191
|
+
// 3. 更新内存记录
|
|
192
|
+
this.subscriptions.set(topic, {
|
|
193
|
+
topic,
|
|
194
|
+
callback,
|
|
195
|
+
subscription: stompSub // 关键:确保新的 subscription 对象被保存
|
|
196
|
+
});
|
|
197
|
+
resolve(stompSub);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
reject(error);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
// 发送消息
|
|
205
|
+
send(destination, body) {
|
|
206
|
+
if (this.state === ConnectionState.CONNECTED && this.client) {
|
|
207
|
+
try {
|
|
208
|
+
this.client.publish({
|
|
209
|
+
destination,
|
|
210
|
+
body: typeof body === 'string' ? body : JSON.stringify(body),
|
|
211
|
+
headers: { 'content-type': 'application/json' },
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
console.error('[WS] 发送消息失败:', error);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.operationQueue.push({ type: 'SEND', payload: { destination, body } });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// 取消订阅
|
|
223
|
+
unsubscribe(topic) {
|
|
224
|
+
var _a;
|
|
225
|
+
const record = this.subscriptions.get(topic);
|
|
226
|
+
if (record) {
|
|
227
|
+
(_a = record.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
228
|
+
this.subscriptions.delete(topic);
|
|
229
|
+
console.log(`[WS] 🚫 已取消订阅: ${topic}`);
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
// 取消所有订阅
|
|
235
|
+
unsubscribeAll() {
|
|
236
|
+
this.subscriptions.forEach((record) => {
|
|
237
|
+
var _a;
|
|
238
|
+
(_a = record.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
239
|
+
});
|
|
240
|
+
this.subscriptions.clear();
|
|
241
|
+
console.log('[WS] 🚫 已取消所有订阅');
|
|
242
|
+
}
|
|
243
|
+
// 断开连接
|
|
244
|
+
disconnect() {
|
|
245
|
+
this.state = ConnectionState.DISCONNECTED;
|
|
246
|
+
if (this.reconnectTimer) {
|
|
247
|
+
clearTimeout(this.reconnectTimer);
|
|
248
|
+
this.reconnectTimer = null;
|
|
249
|
+
}
|
|
250
|
+
if (this.client) {
|
|
251
|
+
WebSocket.instances.delete(this.client.webSocket.url);
|
|
252
|
+
this.client.deactivate();
|
|
253
|
+
this.client = null;
|
|
254
|
+
}
|
|
255
|
+
this.unsubscribeAll();
|
|
256
|
+
this.operationQueue = [];
|
|
257
|
+
this.connectPromises.forEach(({ reject }) => {
|
|
258
|
+
reject(new Error('Connection manually disconnected'));
|
|
259
|
+
});
|
|
260
|
+
this.connectPromises.clear();
|
|
261
|
+
console.log('[WS] 🔌 客户端已主动断开');
|
|
262
|
+
}
|
|
263
|
+
// 当前订阅数量
|
|
264
|
+
getSubscriptionCount() {
|
|
265
|
+
return this.subscriptions.size;
|
|
266
|
+
}
|
|
267
|
+
// 连接后恢复订阅
|
|
268
|
+
_restoreSubscriptions() {
|
|
269
|
+
if (this.subscriptions.size === 0 || !this.client)
|
|
270
|
+
return;
|
|
271
|
+
console.log(`[WS] 🔄 正在恢复 ${this.subscriptions.size} 个订阅...`);
|
|
272
|
+
this.subscriptions.forEach((record, topic) => {
|
|
273
|
+
try {
|
|
274
|
+
const stompSub = this.client.subscribe(topic, (message) => {
|
|
275
|
+
try {
|
|
276
|
+
let body = message.body;
|
|
277
|
+
if (typeof message.body === 'string') {
|
|
278
|
+
body = JSON.parse(message.body);
|
|
279
|
+
}
|
|
280
|
+
record.callback(body, message);
|
|
281
|
+
}
|
|
282
|
+
catch (e) {
|
|
283
|
+
record.callback(message.body, message);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
record.subscription = stompSub;
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
console.error(`[WS] 恢复订阅失败: ${topic}`, error);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
// 订阅队列
|
|
294
|
+
_flushQueue() {
|
|
295
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
296
|
+
if (this.operationQueue.length === 0)
|
|
297
|
+
return;
|
|
298
|
+
console.log(`[WS] 🚀 正在执行 ${this.operationQueue.length} 个排队操作...`);
|
|
299
|
+
const queue = [...this.operationQueue];
|
|
300
|
+
this.operationQueue = [];
|
|
301
|
+
for (const op of queue) {
|
|
302
|
+
try {
|
|
303
|
+
if (op.type === 'SUBSCRIBE') {
|
|
304
|
+
const { topic, callback, resolve, reject, params } = op.payload;
|
|
305
|
+
try {
|
|
306
|
+
const subscription = yield this._doSubscribe(topic, callback, params);
|
|
307
|
+
resolve(subscription);
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
reject(error);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else if (op.type === 'SEND') {
|
|
314
|
+
const { destination, body } = op.payload;
|
|
315
|
+
this.send(destination, body);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
console.error('[WS] 执行队列操作失败:', error);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
// 断连重连
|
|
325
|
+
_scheduleReconnect() {
|
|
326
|
+
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
327
|
+
console.error('[WS] ❌ 重连失败:达到最大尝试次数');
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (![ConnectionState.RECONNECTING, ConnectionState.DISCONNECTED].includes(this.state)) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
this.reconnectAttempts++;
|
|
334
|
+
const delay = Math.min(this.config.reconnectDelay * Math.pow(1.5, this.reconnectAttempts - 1), 60000);
|
|
335
|
+
console.log(`[WS] ⏱️ ${delay}ms 后进行第 ${this.reconnectAttempts} 次重连...`);
|
|
336
|
+
this.reconnectTimer = setTimeout(() => {
|
|
337
|
+
this.connect().catch((err) => {
|
|
338
|
+
if (this.state !== ConnectionState.DISCONNECTED) {
|
|
339
|
+
console.error('[WS] 重连尝试异常:', err);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}, delay);
|
|
343
|
+
}
|
|
344
|
+
// 判断是否已连接
|
|
345
|
+
isConnected() {
|
|
346
|
+
return this.state === ConnectionState.CONNECTED;
|
|
347
|
+
}
|
|
348
|
+
// 获取所有订阅的topic
|
|
349
|
+
getSubscribedTopics() {
|
|
350
|
+
return Array.from(this.subscriptions.keys());
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
WebSocket.instances = new Map();
|
|
354
|
+
export default WebSocket;
|
|
355
|
+
//# sourceMappingURL=web-socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-socket.js","sourceRoot":"","sources":["../../../../src/aldehyde/tmpl/web-socket.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,MAAM,EAAuC,MAAM,gBAAgB,CAAC;AAC7E,OAAO,KAAK,MAAM,UAAU,CAAC;AAE7B;;;;;;GAMG;AAEH,SAAS;AACT,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvE,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACnG,IAAI,gBAAgB,GAAG,IAAI,CAAC;IAC5B,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,EAAE,CAAC;QAC3B,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC/C,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACnB,gBAAgB,GAAG,KAAK,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAA;IAC9D,CAAC;SAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACJ,gBAAgB,GAAG,KAAK,CAAC,sBAAsB,EAAE,CAAA;IACrD,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;IAC3E,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;AAClD,CAAC,CAAA;AAwBD,SAAS;AACT,IAAK,eAKJ;AALD,WAAK,eAAe;IAChB,gDAA6B,CAAA;IAC7B,4CAAyB,CAAA;IACzB,0CAAuB,CAAA;IACvB,gDAA6B,CAAA;AACjC,CAAC,EALI,eAAe,KAAf,eAAe,QAKnB;AAED,MAAM,SAAS;IAGX;;;;;OAKG;IACI,MAAM,CAAC,WAAW,CAAC,GAAW,EAAE,UAA4B,EAAE;QACjE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,mBAAmB;YACnB,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC7C,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,YAAoB,GAAW,EAAE,UAA4B,EAAE;QAOvD,WAAM,GAAkB,IAAI,CAAC;QAC7B,kBAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;QACtD,mBAAc,GAAsB,EAAE,CAAC;QACvC,UAAK,GAAoB,eAAe,CAAC,YAAY,CAAC;QACtD,sBAAiB,GAAG,CAAC,CAAC;QACtB,mBAAc,GAAQ,IAAI,CAAC;QAC3B,oBAAe,GAAG,IAAI,GAAG,EAAmE,CAAC;QAC7F,WAAM,GAA+B;YACzC,cAAc,EAAE,IAAI;YACpB,oBAAoB,EAAE,CAAC;YACvB,iBAAiB,EAAE,KAAK;YACxB,iBAAiB,EAAE,KAAK;YACxB,KAAK,EAAE,KAAK;YACZ,iBAAiB,EAAE,EAAE;SACxB,CAAC;QApBE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,mCAAQ,IAAI,CAAC,MAAM,GAAK,OAAO,CAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAmBD,OAAO;IACA,OAAO;QACV,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,eAAe;YAC3D,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC;QACxC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChG,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAChE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;gBACrB,gBAAgB,EAAE,GAAG,EAAE,CAAC,MAAM;gBAC9B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;gBAC3E,iBAAiB;gBACjB,iBAAiB;gBACjB,cAAc;gBACd,cAAc,EAAE;oBACZ,mBAAmB,EAAE,gBAAgB;oBACrC,2BAA2B,EAAE,WAAW;iBAC3C;gBACD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;oBACjC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC;oBACvC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;oBAC3B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;oBACzD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;oBAC7B,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC7B,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC;gBACD,YAAY,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC5B,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;oBAC1C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,CAAC;oBACnE,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,YAAY,EAAE,CAAC;wBAC9C,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC;wBAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;wBACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC9B,CAAC;oBACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC5D,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBACjC,CAAC;gBACD,gBAAgB,EAAE,GAAG,EAAE;oBACnB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/E,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;wBACvC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC;wBAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;wBACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,OAAO;oBACtC,CAAC;gBACL,CAAC;gBACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;oBACxB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;oBAC5C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBAC7C,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,YAAY,EAAE,CAAC;wBAC9C,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC;wBAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;wBACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC9B,CAAC;oBACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC9D,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBACjC,CAAC;aACJ,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO;IACM,SAAS,CAAU,KAAa,EAAE,MAA8B,EAAE,QAAoD;;YAC/H,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACJ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACnC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;qBACxD,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;KAAA;IAED,SAAS;IACD,YAAY,CAAI,KAAa,EAAE,QAAoD,EAAE,MAA8B;QACvH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAC5C,OAAO;YACX,CAAC;YACD,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,OAAiB,EAAE,EAAE;oBAChE,IAAI,CAAC;wBACD,IAAI,IAAI,GAAQ,OAAO,CAAC,IAAI,CAAC;wBAC7B,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACnC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACpC,CAAC;wBACD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC5B,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACT,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;wBACnC,QAAQ,CAAC,OAAO,CAAC,IAAW,EAAE,OAAO,CAAC,CAAC;oBAC3C,CAAC;gBACL,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBACjB,YAAY;gBACZ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE;oBAC1B,KAAK;oBACL,QAAQ;oBACR,YAAY,EAAE,QAAQ,CAAC,6BAA6B;iBACvD,CAAC,CAAC;gBACH,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO;IACA,IAAI,CAAC,WAAmB,EAAE,IAAS;QACtC,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;oBAChB,WAAW;oBACX,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC5D,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAClD,CAAC,CAAC;YACP,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;IACL,CAAC;IAED,OAAO;IACA,WAAW,CAAC,KAAa;;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACT,MAAA,MAAM,CAAC,YAAY,0CAAE,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,SAAS;IACF,cAAc;QACjB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;;YAClC,MAAA,MAAM,CAAC,YAAY,0CAAE,WAAW,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,CAAC;IAED,OAAO;IACA,UAAU;QACb,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC;QAC1C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACxC,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACpC,CAAC;IAED,SAAS;IACF,oBAAoB;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,UAAU;IACF,qBAAqB;QACzB,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAC1D,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACzC,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,OAAiB,EAAE,EAAE;oBAChE,IAAI,CAAC;wBACD,IAAI,IAAI,GAAQ,OAAO,CAAC,IAAI,CAAC;wBAC7B,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACnC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACpC,CAAC;wBACD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACnC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACT,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC3C,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,YAAY,GAAG,QAAQ,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,gBAAgB,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;YAClD,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO;IACO,WAAW;;YACrB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,cAAc,CAAC,MAAM,WAAW,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;YACvC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YACzB,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACD,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBAC1B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC;wBAChE,IAAI,CAAC;4BACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;4BACtE,OAAO,CAAC,YAAY,CAAC,CAAC;wBAC1B,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACb,MAAM,CAAC,KAAK,CAAC,CAAC;wBAClB,CAAC;oBACL,CAAC;yBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC5B,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC;wBACzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACjC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC;QACL,CAAC;KAAA;IAED,OAAO;IACC,kBAAkB;QACtB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACtC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,CAAC,eAAe,CAAC,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrF,OAAO;QACX,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,WAAW,IAAI,CAAC,iBAAiB,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzB,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,YAAY,EAAE,CAAC;oBAC9C,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;gBACvC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,EAAE,KAAK,CAAC,CAAC;IACd,CAAC;IAED,UAAU;IACH,WAAW;QACd,OAAO,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,CAAC;IACpD,CAAC;IAED,eAAe;IACR,mBAAmB;QACtB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;;AA5Sc,mBAAS,GAAG,IAAI,GAAG,EAAqB,AAA/B,CAAgC;AA+S5D,eAAe,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aldehyde",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.452",
|
|
4
4
|
"author": "cosmicparticle",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/aldehyde/index.txs",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"@emotion/babel-preset-css-prop": "^11.11.0",
|
|
29
29
|
"@emotion/react": "^11.11.1",
|
|
30
30
|
"@emotion/styled": "^11.11.0",
|
|
31
|
+
"@stomp/stompjs": "^7.3.0",
|
|
31
32
|
"@tinymce/tinymce-react": "^3.12.2",
|
|
32
33
|
"@types/react-resizable": "^3.0.8",
|
|
33
34
|
"@visactor/vtable": "^1.22.9",
|
|
@@ -112,6 +113,7 @@
|
|
|
112
113
|
"resolve": "^1.8.1",
|
|
113
114
|
"sass-loader": "^7.1.0",
|
|
114
115
|
"scroll-into-view-if-needed": "^2.2.28",
|
|
116
|
+
"sockjs-client": "^1.6.1",
|
|
115
117
|
"superagent": "^4.0.0",
|
|
116
118
|
"superagent-jsonp": "^0.2.1",
|
|
117
119
|
"three": "^0.134.0",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
2
|
import { Badge } from "antd";
|
|
3
3
|
import { VControlProps } from "../../tmpl/interface";
|
|
4
4
|
import HCDataSource from "../../tmpl/hc-data-source";
|
|
@@ -8,12 +8,22 @@ interface MenuBadgeProps extends VControlProps { }
|
|
|
8
8
|
|
|
9
9
|
const MenuBadge: React.FC<MenuBadgeProps> = (props) => {
|
|
10
10
|
const { translate } = useLocale();
|
|
11
|
-
|
|
12
|
-
const { value, itemType, fieldConfig } = props;
|
|
11
|
+
const [color, setColor] = useState<string>();
|
|
12
|
+
const { value, itemType, fieldConfig, serverKey } = props;
|
|
13
13
|
|
|
14
14
|
let viewControl = undefined;
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
const getColor = async () => {
|
|
17
|
+
const temColor = await HCDataSource.getEnumValueColor(fieldConfig.mstrucId, value, serverKey);
|
|
18
|
+
setColor(temColor);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (value) {
|
|
23
|
+
getColor();
|
|
24
|
+
}
|
|
25
|
+
}, [value]);
|
|
26
|
+
|
|
17
27
|
viewControl = (
|
|
18
28
|
<span className="infoStyle">
|
|
19
29
|
{value ? (
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Space
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { Space } from "antd";
|
|
3
3
|
import { VControlProps } from "../../tmpl/interface";
|
|
4
4
|
import HCDataSource from "../../tmpl/hc-data-source";
|
|
5
5
|
import { useLocale } from "../../locale/useLocale";
|
|
@@ -8,30 +8,38 @@ interface EnumTagsProps extends VControlProps { }
|
|
|
8
8
|
|
|
9
9
|
const EnumTags: React.FC<EnumTagsProps> = (props) => {
|
|
10
10
|
const { translate } = useLocale();
|
|
11
|
+
const [tagList, setTagList] = useState<any[]>([]);
|
|
12
|
+
const { value, fieldConfig, serverKey } = props;
|
|
11
13
|
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (value instanceof Array) {
|
|
18
|
-
} else {
|
|
19
|
-
if (value.indexOf("@,@") > 0) {
|
|
20
|
-
v = value.split("@,@");
|
|
14
|
+
const getTagList = async () => {
|
|
15
|
+
if (value) {
|
|
16
|
+
const temArr = [];
|
|
17
|
+
let v = value;
|
|
18
|
+
if (value instanceof Array) {
|
|
21
19
|
} else {
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
if (value.indexOf("@,@") > 0) {
|
|
21
|
+
v = value.split("@,@");
|
|
22
|
+
} else {
|
|
23
|
+
v = value.split(",");
|
|
24
|
+
}
|
|
24
25
|
|
|
26
|
+
}
|
|
27
|
+
for (let index = 0; index < v.length; index++) {
|
|
28
|
+
const item = v[index];
|
|
29
|
+
let color = await HCDataSource.getEnumValueColor(fieldConfig.mstrucId, value, serverKey) || "#1677FF";
|
|
30
|
+
temArr.push(<span key={item} className="tag" style={{ fontSize: "12px", padding: "4px 10px", borderRadius: "9999px", color, background: `${color}1A` }}>
|
|
31
|
+
{translate("${" + item + "}")}
|
|
32
|
+
</span>)
|
|
33
|
+
}
|
|
34
|
+
setTagList(temArr);
|
|
25
35
|
}
|
|
26
|
-
v.forEach((v) => {
|
|
27
|
-
let color = HCDataSource.getEnumValueColor(fieldConfig.mstrucId, value) || "#1677FF";
|
|
28
|
-
tagList.push(<span key={v} className="tag" style={{ fontSize: "12px", padding: "4px 10px", borderRadius: "9999px", color, background: `${color}1A` }}>
|
|
29
|
-
{translate("${" + v + "}")}
|
|
30
|
-
</span>)
|
|
31
|
-
});
|
|
32
36
|
}
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
getTagList();
|
|
40
|
+
}, [value]);
|
|
41
|
+
|
|
42
|
+
return <Space size={[8, 8]} wrap>{tagList}</Space>;
|
|
35
43
|
};
|
|
36
44
|
|
|
37
45
|
export default EnumTags;
|
|
@@ -545,7 +545,7 @@ const CriteriaForm: React.FC<CriteriaFormProps> = (props) => {
|
|
|
545
545
|
""
|
|
546
546
|
)}
|
|
547
547
|
{showQueryButton ? (
|
|
548
|
-
<Button type="primary" htmlType="submit">
|
|
548
|
+
<Button type="primary" htmlType="submit" loading={loading}>
|
|
549
549
|
{translate("${查询}")}
|
|
550
550
|
</Button>
|
|
551
551
|
) : (
|
|
@@ -56,9 +56,11 @@ const BaseImageComponent = forwardRef((props: BaseImageComponentProps, ref: Forw
|
|
|
56
56
|
const [initSearchParams, setInitSearchParams] = useState<{ [key: string]: any }>();
|
|
57
57
|
const [localImgCode, setLocalImgCode] = useState<string>();
|
|
58
58
|
const [localImgDel, setLocalImgDel] = useState<boolean>(false);
|
|
59
|
+
const [loading, setLoading] = useState<boolean>(true);
|
|
59
60
|
|
|
60
61
|
// 处理数据源图片地址
|
|
61
62
|
const handleDataImgSrc = (val) => {
|
|
63
|
+
setLoading(false);
|
|
62
64
|
const src = handleData(val);
|
|
63
65
|
if (!src) {
|
|
64
66
|
setImgSrc("");
|
|
@@ -157,8 +159,9 @@ const BaseImageComponent = forwardRef((props: BaseImageComponentProps, ref: Forw
|
|
|
157
159
|
} else {
|
|
158
160
|
getInitData();
|
|
159
161
|
}
|
|
160
|
-
} else
|
|
162
|
+
} else {
|
|
161
163
|
setImgSrc("");
|
|
164
|
+
setLoading(false);
|
|
162
165
|
}
|
|
163
166
|
}, [dataConfig?.sourceType, dataConfig?.sourceId, initSearchParams]);
|
|
164
167
|
|
|
@@ -199,7 +202,7 @@ const BaseImageComponent = forwardRef((props: BaseImageComponentProps, ref: Forw
|
|
|
199
202
|
|
|
200
203
|
return (
|
|
201
204
|
<div style={{ width: '100%', height: '100%' }}>
|
|
202
|
-
{!(imgSrc || defImgSrc) ? emptyImg :
|
|
205
|
+
{(loading || !(imgSrc || defImgSrc)) ? emptyImg :
|
|
203
206
|
isDesignMode && localImgDel ? renderLocalImgDel :
|
|
204
207
|
<img alt={'图片组件'} style={{ opacity: config?.opacity }} width={'100%'} height={'100%'} src={imgSrc || defImgSrc} />}
|
|
205
208
|
</div>
|
|
@@ -43,12 +43,12 @@ class Pagination extends React.PureComponent<PaginationProps, PaginationStat> {
|
|
|
43
43
|
}
|
|
44
44
|
} else if (touchEnd) {
|
|
45
45
|
sewTotal = false;
|
|
46
|
-
virtualTotal = pageInfo.virtualEndPageNo * pageInfo.pageSize + 1;
|
|
46
|
+
virtualTotal = (pageInfo.virtualEndPageNo || 0) * pageInfo.pageSize + 1;
|
|
47
47
|
seeTotalTitle = translate("${查看总数}");
|
|
48
48
|
} else {
|
|
49
49
|
//这里还有问题
|
|
50
50
|
sewTotal = false;
|
|
51
|
-
virtualTotal = pageInfo.virtualEndPageNo * pageInfo.pageSize + 1;
|
|
51
|
+
virtualTotal = (pageInfo.virtualEndPageNo || 0) * pageInfo.pageSize + 1;
|
|
52
52
|
seeTotalTitle = translate("${查看总数}");
|
|
53
53
|
}
|
|
54
54
|
|
|
@@ -177,8 +177,9 @@ class QueryTable extends React.PureComponent<QueryTableProps, QueryTableStat> {
|
|
|
177
177
|
queryKey,
|
|
178
178
|
pageInfo
|
|
179
179
|
);
|
|
180
|
-
if (queryData?.key
|
|
180
|
+
if (queryData?.key !== queryKey) {
|
|
181
181
|
this.setState({ loading: false, errorText: translate("${查询异常}"), dataSource: [] });
|
|
182
|
+
if (loadDataCallback) loadDataCallback([]); // 请求数据回调函数
|
|
182
183
|
return;
|
|
183
184
|
} else {
|
|
184
185
|
let dataSource: object[] = [];
|
|
@@ -93,7 +93,7 @@ class SelectTable extends React.PureComponent<SelectTableProps, SelectTableStat>
|
|
|
93
93
|
pageNo: pageInfo.pageNo,
|
|
94
94
|
queryKey,
|
|
95
95
|
criteriaData,
|
|
96
|
-
loading: false,
|
|
96
|
+
// loading: false,
|
|
97
97
|
});
|
|
98
98
|
}
|
|
99
99
|
|
|
@@ -448,6 +448,7 @@ class SelectTable extends React.PureComponent<SelectTableProps, SelectTableStat>
|
|
|
448
448
|
onChangeRowSelection={this.changeRowSelection}
|
|
449
449
|
sortColumnData={[]}
|
|
450
450
|
doSearch={this.doSearch}
|
|
451
|
+
loadDataCallback={() => this.setState({ loading: false })}
|
|
451
452
|
/>
|
|
452
453
|
{showView && drawCode ? (
|
|
453
454
|
<DtmplViewDrawer
|
|
@@ -364,14 +364,19 @@ HCDataSource.getEnumsValueMap = function (
|
|
|
364
364
|
return map;
|
|
365
365
|
};
|
|
366
366
|
|
|
367
|
-
HCDataSource.getEnumOption = function (
|
|
367
|
+
HCDataSource.getEnumOption = async function (
|
|
368
368
|
mstrucId: string,
|
|
369
|
-
enumValue: string
|
|
370
|
-
|
|
369
|
+
enumValue: string,
|
|
370
|
+
serverKey?: string
|
|
371
|
+
) {
|
|
371
372
|
if (!enumValue) {
|
|
372
373
|
return null;
|
|
373
374
|
}
|
|
374
375
|
let options = this.getEnums(mstrucId);
|
|
376
|
+
if (!options) { // 枚举不存在查询
|
|
377
|
+
await loadEnum(serverKey, [mstrucId]);
|
|
378
|
+
options = this.getEnums(mstrucId);
|
|
379
|
+
}
|
|
375
380
|
let enumItem: EnumItem = undefined;
|
|
376
381
|
if (options) {
|
|
377
382
|
options.forEach((option) => {
|
|
@@ -383,11 +388,12 @@ HCDataSource.getEnumOption = function (
|
|
|
383
388
|
}
|
|
384
389
|
return enumItem;
|
|
385
390
|
};
|
|
386
|
-
HCDataSource.getEnumValueColor = (
|
|
391
|
+
HCDataSource.getEnumValueColor = async (
|
|
387
392
|
mstrucId: string,
|
|
388
|
-
enumValue: string
|
|
389
|
-
|
|
390
|
-
|
|
393
|
+
enumValue: string,
|
|
394
|
+
serverKey?: string,
|
|
395
|
+
) => {
|
|
396
|
+
let enumItem: EnumItem = await HCDataSource.getEnumOption(mstrucId, enumValue, serverKey);
|
|
391
397
|
if (enumItem) {
|
|
392
398
|
return enumItem.color;
|
|
393
399
|
} else {
|
|
@@ -1496,4 +1496,18 @@ export default class HcserviceV3 {
|
|
|
1496
1496
|
return false;
|
|
1497
1497
|
}
|
|
1498
1498
|
}
|
|
1499
|
+
|
|
1500
|
+
// ws发送消息
|
|
1501
|
+
static async wsPush(hydrocarbonToken, data = { message: "测试数据", destination: "/user/queue/dashboard" }) {
|
|
1502
|
+
const res = await Super.super({
|
|
1503
|
+
url: `/v3/ws-push/${hydrocarbonToken}`,
|
|
1504
|
+
data,
|
|
1505
|
+
method: "POST",
|
|
1506
|
+
});
|
|
1507
|
+
if (res.code === 200) {
|
|
1508
|
+
message.success(translate("${已发送}"));
|
|
1509
|
+
} else {
|
|
1510
|
+
message.error(translate("${发送失败}"), 3);
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1499
1513
|
}
|