@lcap/nasl 0.3.9-beta → 0.3.10-beta.5

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 (152) hide show
  1. package/out/service/create/errHandles.js +7 -2
  2. package/out/service/create/errHandles.js.map +1 -1
  3. package/out/service/logic/logic.d.ts +50 -14
  4. package/out/service/logic/logic.js +26 -0
  5. package/out/service/logic/logic.js.map +1 -1
  6. package/out/service/page/element.d.ts +9 -0
  7. package/out/service/page/element.js +6 -0
  8. package/out/service/page/element.js.map +1 -1
  9. package/out/service/permission/api.d.ts +57 -0
  10. package/out/service/permission/api.js +41 -0
  11. package/out/service/permission/api.js.map +1 -0
  12. package/out/service/permission/index.d.ts +2 -0
  13. package/out/service/permission/index.js +17 -0
  14. package/out/service/permission/index.js.map +1 -0
  15. package/out/service/webFile/index.js +5 -0
  16. package/out/service/webFile/index.js.map +1 -1
  17. package/out/types/app/App.d.ts +4 -0
  18. package/out/types/app/App.js +30 -0
  19. package/out/types/app/App.js.map +1 -1
  20. package/out/types/app/Service.d.ts +2 -2
  21. package/out/types/app/Service.js +28 -3
  22. package/out/types/app/Service.js.map +1 -1
  23. package/out/types/cache.d.ts +6 -0
  24. package/out/types/cache.js +54 -0
  25. package/out/types/cache.js.map +1 -0
  26. package/out/types/cacheData.js.map +1 -1
  27. package/out/types/common/Vertex.d.ts +25 -0
  28. package/out/types/common/Vertex.js +40 -0
  29. package/out/types/common/Vertex.js.map +1 -1
  30. package/out/types/data/Entity.js +1 -0
  31. package/out/types/data/Entity.js.map +1 -1
  32. package/out/types/data/Enum.d.ts +5 -0
  33. package/out/types/data/Enum.js +5 -0
  34. package/out/types/data/Enum.js.map +1 -1
  35. package/out/types/data/Interface.js +5 -3
  36. package/out/types/data/Interface.js.map +1 -1
  37. package/out/types/data/dataTypes.js +1 -1
  38. package/out/types/data/dataTypes.js.map +1 -1
  39. package/out/types/data/genBlock/genCreateBlock.js +5 -5
  40. package/out/types/data/genBlock/genCreateBlock.js.map +1 -1
  41. package/out/types/data/genBlock/genCurdBlock.js +3 -3
  42. package/out/types/data/genBlock/genCurdBlock.js.map +1 -1
  43. package/out/types/data/genBlock/genEnumSelectBlock.d.ts +1 -1
  44. package/out/types/data/genBlock/genEnumSelectBlock.js +2 -2
  45. package/out/types/data/genBlock/genEnumSelectBlock.js.map +1 -1
  46. package/out/types/data/genBlock/genGridViewBlock.js +12 -1
  47. package/out/types/data/genBlock/genGridViewBlock.js.map +1 -1
  48. package/out/types/data/genBlock/genListViewBlock.js +2 -2
  49. package/out/types/data/genBlock/genSelectBlock.js +2 -2
  50. package/out/types/data/genBlock/genTableBlock.js +14 -3
  51. package/out/types/data/genBlock/genTableBlock.js.map +1 -1
  52. package/out/types/data/genBlock/genUpdateBlock.js +5 -5
  53. package/out/types/data/genBlock/genUpdateBlock.js.map +1 -1
  54. package/out/types/data/systemTypes.js +47 -0
  55. package/out/types/data/systemTypes.js.map +1 -1
  56. package/out/types/enum.d.ts +6 -0
  57. package/out/types/enum.js +11 -0
  58. package/out/types/enum.js.map +1 -0
  59. package/out/types/generator/hotReload.d.ts +2 -0
  60. package/out/types/generator/hotReload.js +12 -1
  61. package/out/types/generator/hotReload.js.map +1 -1
  62. package/out/types/index.d.ts +5 -1
  63. package/out/types/index.js +8 -2
  64. package/out/types/index.js.map +1 -1
  65. package/out/types/logic/Logic.d.ts +32 -0
  66. package/out/types/logic/Logic.js +142 -31
  67. package/out/types/logic/Logic.js.map +1 -1
  68. package/out/types/logic/LogicItem.d.ts +1 -0
  69. package/out/types/logic/LogicItem.js +43 -24
  70. package/out/types/logic/LogicItem.js.map +1 -1
  71. package/out/types/logic/Param.d.ts +1 -0
  72. package/out/types/logic/Param.js +40 -20
  73. package/out/types/logic/Param.js.map +1 -1
  74. package/out/types/logic/Return.js +14 -19
  75. package/out/types/logic/Return.js.map +1 -1
  76. package/out/types/logic/Variable.js +14 -19
  77. package/out/types/logic/Variable.js.map +1 -1
  78. package/out/types/logic/translator.js +39 -10
  79. package/out/types/logic/translator.js.map +1 -1
  80. package/out/types/nuims/Nuims.d.ts +1 -1
  81. package/out/types/nuims/Nuims.js +11 -4
  82. package/out/types/nuims/Nuims.js.map +1 -1
  83. package/out/types/page/Element.d.ts +16 -0
  84. package/out/types/page/Element.js +192 -129
  85. package/out/types/page/Element.js.map +1 -1
  86. package/out/types/page/Event.js.map +1 -1
  87. package/out/types/page/Page.d.ts +1 -0
  88. package/out/types/page/Page.js +71 -37
  89. package/out/types/page/Page.js.map +1 -1
  90. package/out/types/page/View.d.ts +9 -1
  91. package/out/types/page/View.js +86 -42
  92. package/out/types/page/View.js.map +1 -1
  93. package/out/types/page/ViewParam.d.ts +1 -0
  94. package/out/types/page/ViewParam.js +23 -4
  95. package/out/types/page/ViewParam.js.map +1 -1
  96. package/out/types/page/ViewVariable.js +13 -18
  97. package/out/types/page/ViewVariable.js.map +1 -1
  98. package/out/types/permission/Permission.d.ts +41 -0
  99. package/out/types/permission/Permission.js +122 -0
  100. package/out/types/permission/Permission.js.map +1 -0
  101. package/out/types/process/ProcessParam.js +3 -1
  102. package/out/types/process/ProcessParam.js.map +1 -1
  103. package/package.json +2 -3
  104. package/src/service/create/errHandles.js +6 -2
  105. package/src/service/developPermission/api.js +37 -0
  106. package/src/service/developPermission/index.js +13 -0
  107. package/src/service/logic/logic.js +26 -0
  108. package/src/service/page/element.js +6 -0
  109. package/src/service/permission/api.js +38 -0
  110. package/src/service/permission/index.js +13 -0
  111. package/src/service/webFile/index.js +6 -1
  112. package/src/types/app/App.ts +36 -1
  113. package/src/types/app/Service.ts +32 -3
  114. package/src/types/cache.ts +50 -0
  115. package/src/types/cacheData.ts +7 -7
  116. package/src/types/common/Vertex.ts +30 -0
  117. package/src/types/data/Entity.ts +1 -0
  118. package/src/types/data/Enum.ts +5 -0
  119. package/src/types/data/Interface.ts +4 -3
  120. package/src/types/data/dataTypes.ts +1 -1
  121. package/src/types/data/genBlock/genCreateBlock.ts +5 -5
  122. package/src/types/data/genBlock/genCurdBlock.ts +3 -3
  123. package/src/types/data/genBlock/genEnumSelectBlock.ts +2 -2
  124. package/src/types/data/genBlock/genGridViewBlock.ts +12 -1
  125. package/src/types/data/genBlock/genListViewBlock.ts +2 -2
  126. package/src/types/data/genBlock/genSelectBlock.ts +2 -2
  127. package/src/types/data/genBlock/genTableBlock.ts +14 -3
  128. package/src/types/data/genBlock/genUpdateBlock.ts +5 -5
  129. package/src/types/data/systemTypes.ts +47 -0
  130. package/src/types/enum.ts +6 -0
  131. package/src/types/generator/hotReload.ts +10 -0
  132. package/src/types/index.ts +5 -1
  133. package/src/types/logic/Logic.ts +138 -28
  134. package/src/types/logic/LogicItem.ts +48 -28
  135. package/src/types/logic/Param.ts +39 -18
  136. package/src/types/logic/Return.ts +4 -9
  137. package/src/types/logic/Variable.ts +4 -8
  138. package/src/types/logic/translator.js +41 -13
  139. package/src/types/logic/translator_backup.js +5 -16
  140. package/src/types/nuims/Nuims.ts +11 -5
  141. package/src/types/page/Element.ts +211 -133
  142. package/src/types/page/Event.ts +0 -3
  143. package/src/types/page/Page.ts +86 -49
  144. package/src/types/page/View.ts +90 -42
  145. package/src/types/page/ViewParam.ts +22 -3
  146. package/src/types/page/ViewVariable.ts +4 -8
  147. package/src/types/page/dist/View.js +727 -0
  148. package/src/types/permission/Permission.ts +112 -0
  149. package/src/types/process/ProcessParam.ts +4 -1
  150. package/out/test/units/config.spec.d.ts +0 -1
  151. package/out/test/units/config.spec.js +0 -12
  152. package/out/test/units/config.spec.js.map +0 -1
@@ -3,6 +3,23 @@ import { config, history, LEVEL_ENUM, Vertex, Entity, Enum, PackageJSON, App, We
3
3
  import pageService from '../../service/page';
4
4
  import { traverse } from '../utils';
5
5
  import { postServiceType } from '../../service/common/preprocess';
6
+ import { refreshPages } from '../cache';
7
+ import { BusinessCode } from '../enum';
8
+
9
+ export function catchFn() {
10
+ return async (err: any) => {
11
+ const code = err?.code;
12
+ // 节点已存在; 节点不存在; 父节点不存在
13
+ if ([BusinessCode.ElementExist, BusinessCode.ElementNotExist, BusinessCode.ParentElementNotExist].includes(code)) {
14
+ await refreshPages();
15
+ } else
16
+ config.defaultApp?.emit('saved', err);
17
+
18
+ config.defaultApp?.history.load();
19
+
20
+ throw err;
21
+ };
22
+ }
6
23
 
7
24
  /**
8
25
  * 页面(入口页)类,后端路由控制
@@ -95,22 +112,12 @@ export class Page extends Vertex {
95
112
  }, { node: this.rootView });
96
113
  const rootView = new View(this.rootView);
97
114
  rootView.assign({ page: this });
98
-
115
+
99
116
  this.assign({ rootView });
100
117
  }
101
118
 
102
119
  addData(res: any) {
103
120
  const microService = this.service.app.firstMicroService;
104
- const interfaces = res.interfaces as Array<Interface>;
105
- if (interfaces && interfaces.length) {
106
- interfaces.forEach((item, index) => {
107
- const itface = interfaces[index] = Interface.from(item, microService);
108
- postServiceType(itface);
109
- });
110
- microService.interfaces.unshift(...interfaces);
111
- microService.globalLogic.globalLogics.unshift(...interfaces);
112
- microService.emit('interfacesChange');
113
- }
114
121
 
115
122
  const enums = res.enums as Array<Enum>;
116
123
  if (enums && enums.length) {
@@ -132,6 +139,19 @@ export class Page extends Vertex {
132
139
  microService.data.structures.unshift(...structures);
133
140
  updateDataTypeList();
134
141
  }
142
+
143
+ const interfaces = res.interfaces as Array<Interface>;
144
+ if (interfaces && interfaces.length) {
145
+ interfaces.forEach((item, index) => {
146
+ const itface = interfaces[index] = Interface.from(item, microService);
147
+ postServiceType(itface);
148
+ });
149
+ microService.interfaces.unshift(...interfaces);
150
+ microService.globalLogic.globalLogics.unshift(...interfaces);
151
+ microService.mountResolverOnEntity();
152
+ microService.mountResolverOnInterface();
153
+ microService.emit('interfacesChange');
154
+ }
135
155
  }
136
156
 
137
157
  /**
@@ -149,8 +169,8 @@ export class Page extends Vertex {
149
169
  operationDesc: actionOptions?.actionDesc || `添加页面"${this.name}${this.title ? `(${this.title})` : ''}"`,
150
170
  },
151
171
  body,
152
- });
153
-
172
+ }).catch(catchFn());
173
+
154
174
  this.deepPick(result.page, ['id']);
155
175
  // 添加数据和接口
156
176
  this.addData(result);
@@ -166,8 +186,8 @@ export class Page extends Vertex {
166
186
  tempPath: `/${rootView.name}`,
167
187
  code: `/ID_${rootView.id}`,
168
188
  });
169
- this.rootView.attachNodePath();
170
- if(result.page.isIndex) {
189
+ this.rootView.attachNodePath();
190
+ if (result.page.isIndex) {
171
191
  const tasks = this.service.pages.filter((page) => page.isIndex && page.id !== result.page.id)
172
192
  .map((page) => {
173
193
  page.assign({ isIndex: false });
@@ -175,7 +195,7 @@ export class Page extends Vertex {
175
195
  });
176
196
  Promise.all(tasks);
177
197
  }
178
-
198
+
179
199
  await then?.();
180
200
  this.service.emit('pageTreeChange');
181
201
 
@@ -183,10 +203,10 @@ export class Page extends Vertex {
183
203
  microService.emit('dataTypesChange');
184
204
  microService.emit('enumsChange');
185
205
  microService.emit('vertexIdToNameChange');
186
-
206
+
187
207
  this.rootView.emit('change');
188
208
  // this.assign(Page.from(this, this.service));
189
-
209
+
190
210
  await config.defaultApp?.history.load();
191
211
  config.defaultApp?.emit('saved');
192
212
  return this;
@@ -211,7 +231,7 @@ export class Page extends Vertex {
211
231
  });
212
232
  this.deepPick(result, ['id']);
213
233
  this.rootView.attachNodePath();
214
- if(result.isIndex) {
234
+ if (result.isIndex) {
215
235
  const tasks = this.service.pages.filter((page) => page.isIndex && page.id !== result.id)
216
236
  .map((page) => {
217
237
  page.assign({ isIndex: false });
@@ -219,12 +239,12 @@ export class Page extends Vertex {
219
239
  });
220
240
  Promise.all(tasks);
221
241
  }
222
-
242
+
223
243
  await then?.();
224
244
  this.service.emit('pageTreeChange');
225
245
  this.rootView.emit('change');
226
246
  // this.assign(Page.from(this, this.service));
227
-
247
+
228
248
  await config.defaultApp?.history.load();
229
249
  config.defaultApp?.emit('saved');
230
250
  return this;
@@ -236,21 +256,16 @@ export class Page extends Vertex {
236
256
  async delete(none?: void, actionOptions?: ActionOptions) {
237
257
  config.defaultApp?.emit('saving');
238
258
 
239
- try {
240
- await pageService.removePage({
241
- headers: {
242
- appId: config.defaultApp?.id,
243
- operationAction: actionOptions?.actionName || 'Page.delete',
244
- operationDesc: actionOptions?.actionDesc || `删除页面"${this.name}${this.title ? `(${this.title})` : ''}"`,
245
- },
246
- path: {
247
- id: this.id,
248
- },
249
- });
250
- } catch(err) {
251
- await config.defaultApp?.history.load();
252
- throw err;
253
- }
259
+ await pageService.removePage({
260
+ headers: {
261
+ appId: config.defaultApp?.id,
262
+ operationAction: actionOptions?.actionName || 'Page.delete',
263
+ operationDesc: actionOptions?.actionDesc || `删除页面"${this.name}${this.title ? `(${this.title})` : ''}"`,
264
+ },
265
+ path: {
266
+ id: this.id,
267
+ },
268
+ }).catch(catchFn());
254
269
 
255
270
  const index = this.service.pages.indexOf(this);
256
271
  ~index && this.service.pages.splice(index, 1);
@@ -275,7 +290,7 @@ export class Page extends Vertex {
275
290
  operationDesc: actionOptions?.actionDesc || `修改页面"${this.name}${this.title ? `(${this.title})` : ''}"`,
276
291
  },
277
292
  body,
278
- });
293
+ }).catch(catchFn());
279
294
 
280
295
  await config.defaultApp?.history.load();
281
296
  config.defaultApp?.emit('saved');
@@ -288,19 +303,41 @@ export class Page extends Vertex {
288
303
  async setAsIndex() {
289
304
  config.defaultApp?.emit('saving');
290
305
 
291
- const tasks = this.service.pages.filter((page) => page.isIndex)
292
- .map((page) => {
293
- page.assign({ isIndex: false });
294
- return page.update();
306
+ const oldIndexPages: Array<Page> = this.service.pages.filter((page) => page.isIndex);
307
+ const rejectedPages: Array<Page> = [];
308
+ const tasks = oldIndexPages.map((page) => {
309
+ page.assign({ isIndex: false });
310
+ return page.update().catch((e) => {
311
+ rejectedPages.push(page);
312
+ return Promise.reject(e);
295
313
  });
296
- this.assign({ isIndex: true });
297
- tasks.push(this.update(undefined, {
298
- actionDesc: `设置页面"${this.name}"为首页`,
299
- }));
300
- await Promise.all(tasks);
314
+ });
301
315
 
302
- this.service.emit('pageTreeChange');
316
+ // 去掉旧首页
317
+ try {
318
+ await Promise.all(tasks);
319
+ } catch (e) {
320
+ // 恢复状态
321
+ rejectedPages.forEach((page) => page.assign({ isIndex: true }));
322
+
323
+ this.service.emit('pageTreeChange');
324
+ await config.defaultApp?.history.load();
325
+ config.defaultApp?.emit('saved');
326
+ return;
327
+ }
303
328
 
329
+ // 设置新首页
330
+ try {
331
+ this.assign({ isIndex: true });
332
+ await this.update(undefined, {
333
+ actionDesc: `设置页面"${this.name}"为首页`,
334
+ });
335
+ } catch (e) {
336
+ // 恢复状态
337
+ this.assign({ isIndex: false });
338
+ }
339
+
340
+ this.service.emit('pageTreeChange');
304
341
  await config.defaultApp?.history.load();
305
342
  config.defaultApp?.emit('saved');
306
343
  }
@@ -352,8 +389,8 @@ export class Page extends Vertex {
352
389
  page.assign({
353
390
  rootView: View.from(page.rootView, null, page),
354
391
  service,
355
- tempPath: page.rootView? `/${page.rootView.name}`: '',
356
- code: page.rootView?`/ID_${page.rootView.id}`: '',
392
+ tempPath: page.rootView ? `/${page.rootView.name}` : '',
393
+ code: page.rootView ? `/ID_${page.rootView.id}` : '',
357
394
  });
358
395
 
359
396
  return page;
@@ -16,6 +16,7 @@ import * as babel from '@babel/core';
16
16
  import view from '@/service/page/view';
17
17
  import Entity from '../data/Entity';
18
18
  import { postServiceType } from '../../service/common/preprocess';
19
+ import { catchFn } from './Page';
19
20
 
20
21
  /**
21
22
  * 子页面类,前端路由控制
@@ -127,6 +128,12 @@ export class View extends Block {
127
128
  */
128
129
  @immutable()
129
130
  public readonly moreChildrenFields: Array<string> = ['$def.params', '$def.variables', '$def.logics'];
131
+ /**
132
+ * 当前View中所有组件名的缓存
133
+ */
134
+ @immutable()
135
+ public readonly componentNameSet: Set<string> = new Set();
136
+
130
137
  /**
131
138
  * @param source 需要合并的部分参数
132
139
  */
@@ -199,26 +206,36 @@ export class View extends Block {
199
206
  } catch (err) { }
200
207
  })().finally(() => this.contentPromise = undefined);
201
208
  }
202
- loadAll() {
209
+ loadAll(enableCache = true) {
203
210
  // 如果有正在进行的 Promise,则直接返回它
204
211
  if (this.contentPromise)
205
212
  return this.contentPromise;
206
213
 
207
214
  return this.contentPromise = (async () => {
208
- try {
209
- const result: View = await viewService.load({
210
- path: {
211
- id: this.id,
212
- },
213
- });
214
-
215
- const temp = View.from(result, this.parent, this.page, this);
216
- this.assign(temp);
217
- utils.traverse((current) => {
218
- current.node.attachNodePath(true);
219
- }, { node: this });
220
- return this;
221
- } catch (err) { }
215
+ const result: View = await viewService.load({
216
+ path: {
217
+ id: this.id,
218
+ },
219
+ query: {
220
+ enableCache,
221
+ },
222
+ config: { noErrorTip: true },
223
+ });
224
+ const oldLogics = this.$def.logics;
225
+ Object.assign(result, {
226
+ children: this.children,
227
+ });
228
+ const temp = View.from(result, this.parent, this.page, this);
229
+ const newLogics = temp.$def.logics;
230
+ oldLogics.forEach((logic) => {
231
+ if (!newLogics.find((item) => item.id === logic.id))
232
+ logic.destroy();
233
+ });
234
+ this.assign(temp);
235
+ utils.traverse((current) => {
236
+ current.node.attachNodePath(true);
237
+ }, { node: this });
238
+ return this;
222
239
  })().finally(() => this.contentPromise = undefined);
223
240
  }
224
241
  isContentLoaded() {
@@ -277,16 +294,6 @@ export class View extends Block {
277
294
  /* 绑定数据结构和接口 */
278
295
  addData(res: any) {
279
296
  const microService = this.parent.page.service.app.firstMicroService;
280
- const interfaces = res.interfaces as Array<Interface>;
281
- if (interfaces && interfaces.length) {
282
- interfaces.forEach((item, index) => {
283
- const itface = interfaces[index] = Interface.from(item, microService);
284
- postServiceType(itface);
285
- });
286
- microService.interfaces.unshift(...interfaces);
287
- microService.emit('interfacesChange');
288
- }
289
-
290
297
  const enums = res.enums as Array<Enum>;
291
298
  if (enums && enums.length) {
292
299
  enums.forEach((item, index) => enums[index] = Enum.from(item, microService));
@@ -307,6 +314,19 @@ export class View extends Block {
307
314
  microService.data.structures.unshift(...structures);
308
315
  updateDataTypeList();
309
316
  }
317
+
318
+ const interfaces = res.interfaces as Array<Interface>;
319
+ if (interfaces && interfaces.length) {
320
+ interfaces.forEach((item, index) => {
321
+ const itface = interfaces[index] = Interface.from(item, microService);
322
+ postServiceType(itface);
323
+ });
324
+ microService.interfaces.unshift(...interfaces);
325
+ microService.globalLogic.globalLogics.unshift(...interfaces);
326
+ microService.mountResolverOnEntity();
327
+ microService.mountResolverOnInterface();
328
+ microService.emit('interfacesChange');
329
+ }
310
330
  }
311
331
 
312
332
  @action('添加子页面')
@@ -322,7 +342,7 @@ export class View extends Block {
322
342
  operationDesc: actionOptions?.actionDesc || `添加子页面"${this.name}${this.title ? `(${this.title})` : ''}"`,
323
343
  },
324
344
  body,
325
- });
345
+ }).catch(catchFn());
326
346
  this.deepPick(result.view, ['id']);
327
347
  // 添加数据
328
348
  this.addData(result);
@@ -403,21 +423,16 @@ export class View extends Block {
403
423
  if (!this.parent)
404
424
  throw Error('该子页面为根节点!');
405
425
 
406
- try {
407
- await viewService.delete({
408
- headers: {
409
- appId: config.defaultApp?.id,
410
- operationAction: actionOptions?.actionName || 'View.delete',
411
- operationDesc: actionOptions?.actionDesc || `删除子页面"${this.name}${this.title ? `(${this.title})` : ''}"`,
412
- },
413
- path: {
414
- id: this.id,
415
- },
416
- });
417
- } catch (err) {
418
- await config.defaultApp?.history.load();
419
- throw err;
420
- }
426
+ await viewService.delete({
427
+ headers: {
428
+ appId: config.defaultApp?.id,
429
+ operationAction: actionOptions?.actionName || 'View.delete',
430
+ operationDesc: actionOptions?.actionDesc || `删除子页面"${this.name}${this.title ? `(${this.title})` : ''}"`,
431
+ },
432
+ path: {
433
+ id: this.id,
434
+ },
435
+ }).catch(catchFn());
421
436
 
422
437
  const index = this.parent.children.indexOf(this);
423
438
  ~index && this.parent.children.splice(index, 1);
@@ -449,7 +464,7 @@ export class View extends Block {
449
464
  operationDesc: actionOptions?.actionDesc || `修改子页面"${this.name}${this.title ? `(${this.title})` : ''}"`,
450
465
  },
451
466
  body,
452
- });
467
+ }).catch(catchFn());
453
468
 
454
469
  await then?.();
455
470
  await config.defaultApp?.history.load();
@@ -898,6 +913,39 @@ export class View extends Block {
898
913
  // config.defaultApp?.emit('saved');
899
914
  }
900
915
 
916
+ // 遍历页面缓存所有组件名
917
+ traverseAllComponentName(): void {
918
+ utils.traverse(({ node }) => {
919
+ node && this.componentNameSet.add(node.name);
920
+ }, { node: this.$html });
921
+ }
922
+
923
+ // 组件名是否有效
924
+ isValidComponentName(name: string): boolean {
925
+ if (name) {
926
+ return !this.componentNameSet.has(name);
927
+ }
928
+ return false;
929
+ }
930
+
931
+ // 保存组件名至缓存
932
+ addComponentName(nameOrElement: string | Element) {
933
+ let name: string = nameOrElement as string;
934
+ if (nameOrElement instanceof Element) {
935
+ name = nameOrElement.name;
936
+ }
937
+ return this.componentNameSet.add(name);
938
+ }
939
+
940
+ // 在缓存中移除组件名
941
+ removeComponentName(nameOrElement: string | Element): void {
942
+ let name: string = nameOrElement as string;
943
+ if (nameOrElement instanceof Element) {
944
+ name = nameOrElement.name;
945
+ }
946
+ this.componentNameSet.delete(name);
947
+ }
948
+
901
949
  _removeDef($def: View['$def']) {
902
950
  const removedParams = this.$def.params.filter((param) => $def.params?.find((item) => param.id === item.id));
903
951
  this.$def.params = this.$def.params.filter((param) => !$def.params?.find((item) => param.id === item.id));
@@ -5,6 +5,25 @@ import { getBasicTypeDefaultValue } from '../data/basicTypes';
5
5
  import { viewService } from '../../service/page';
6
6
  import { View } from './View';
7
7
  import { schemaService } from '../../service/common';
8
+ import { refreshPages, refreshView } from '../cache';
9
+ import { BusinessCode } from '../enum';
10
+
11
+ export function catchFn(view: View) {
12
+ return async (err: any) => {
13
+ const code = err?.code;
14
+ // 节点已存在; 节点不存在
15
+ if([BusinessCode.ElementExist, BusinessCode.ElementNotExist].includes(code)) {
16
+ await refreshView(view);
17
+ } else if(code === BusinessCode.ParentElementNotExist) { // 父节点不存在。视图添加变量,发现视图不存在
18
+ await refreshPages();
19
+ } else
20
+ config.defaultApp?.emit('saved', err);
21
+
22
+ config.defaultApp?.history.load();
23
+
24
+ throw err;
25
+ }
26
+ }
8
27
 
9
28
  /**
10
29
  * 页面输入参数
@@ -56,7 +75,7 @@ export class ViewParam extends Param {
56
75
  operationDesc: actionOptions?.actionDesc || `添加页面"${this.view.name}"输入参数"${this.name}"`,
57
76
  },
58
77
  body,
59
- });
78
+ }).catch(catchFn(this.view));
60
79
  // convert2RefType(result.schema);
61
80
  this.deepPick(result, ['id']);
62
81
  this.assign({ code: this.genCode() });
@@ -88,7 +107,7 @@ export class ViewParam extends Param {
88
107
  query: {
89
108
  id: this.id,
90
109
  },
91
- });
110
+ }).catch(catchFn(this.view));
92
111
  } catch(err) {
93
112
  await config.defaultApp?.history.load();
94
113
  throw err;
@@ -129,7 +148,7 @@ export class ViewParam extends Param {
129
148
  operationDesc: actionOptions?.actionDesc || `修改页面"${this.view.name}"输入参数"${this.name}"`,
130
149
  },
131
150
  body,
132
- });
151
+ }).catch(catchFn(this.view));
133
152
  // convert2RefType(result.schema);
134
153
  // this.plainAssign(result);
135
154
 
@@ -5,6 +5,7 @@ import { viewService } from '../../service/page';
5
5
  import { convert2RefType, convert2SchemaType } from '../data/dataTypeUtils';
6
6
  import { getBasicTypeDefaultValue } from '../data/basicTypes';
7
7
  import { schemaService } from '../../service/common';
8
+ import { catchFn } from './ViewParam';
8
9
 
9
10
  /**
10
11
  * 页面局部变量
@@ -51,7 +52,7 @@ export class ViewVariable extends Variable {
51
52
  operationDesc: actionOptions?.actionDesc || `添加页面"${this.view.name}"局部变量"${this.name}"`,
52
53
  },
53
54
  body,
54
- });
55
+ }).catch(catchFn(this.view));
55
56
  // convert2RefType(result.schema);
56
57
  this.deepPick(result, ['id']);
57
58
  this.assign({ code: this.genCode() });
@@ -73,7 +74,6 @@ export class ViewVariable extends Variable {
73
74
  config.defaultApp?.emit('saving');
74
75
 
75
76
  if (this.id) {
76
- try {
77
77
  await viewService.deleteViewVariable({
78
78
  headers: {
79
79
  appId: config.defaultApp?.id,
@@ -83,11 +83,7 @@ export class ViewVariable extends Variable {
83
83
  query: {
84
84
  id: this.id,
85
85
  },
86
- });
87
- } catch (err) {
88
- await config.defaultApp?.history.load();
89
- throw err;
90
- }
86
+ }).catch(catchFn(this.view));
91
87
  }
92
88
 
93
89
  const { variables } = this.view.$def;
@@ -122,7 +118,7 @@ export class ViewVariable extends Variable {
122
118
  operationDesc: actionOptions?.actionDesc || `修改页面"${this.view.name}"局部变量"${this.name}"`,
123
119
  },
124
120
  body,
125
- });
121
+ }).catch(catchFn(this.view));
126
122
  // convert2RefType(result.schema);
127
123
  // this.plainAssign(result);
128
124