@ibiz-template/runtime 0.5.0-beta.4 → 0.5.0

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 (115) hide show
  1. package/dist/index.esm.js +664 -170
  2. package/dist/index.system.min.js +1 -1
  3. package/out/app-hub.d.ts +1 -0
  4. package/out/app-hub.d.ts.map +1 -1
  5. package/out/app-hub.js +5 -0
  6. package/out/controller/control/app-menu/app-menu.controller.d.ts +34 -1
  7. package/out/controller/control/app-menu/app-menu.controller.d.ts.map +1 -1
  8. package/out/controller/control/app-menu/app-menu.controller.js +47 -5
  9. package/out/controller/control/gantt/gantt.controller.d.ts.map +1 -1
  10. package/out/controller/control/gantt/gantt.controller.js +3 -3
  11. package/out/controller/control/grid/grid/entity-schema.d.ts +16 -0
  12. package/out/controller/control/grid/grid/entity-schema.d.ts.map +1 -0
  13. package/out/controller/control/grid/grid/entity-schema.js +81 -0
  14. package/out/controller/control/grid/grid/grid.controller.d.ts +17 -1
  15. package/out/controller/control/grid/grid/grid.controller.d.ts.map +1 -1
  16. package/out/controller/control/grid/grid/grid.controller.js +51 -6
  17. package/out/controller/control/grid/grid/grid.service.js +1 -1
  18. package/out/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.js +1 -1
  19. package/out/controller/control/search-bar/entity-schema.d.ts +13 -0
  20. package/out/controller/control/search-bar/entity-schema.d.ts.map +1 -0
  21. package/out/controller/control/search-bar/entity-schema.js +151 -0
  22. package/out/controller/control/search-bar/search-bar-filter.controller.d.ts +9 -0
  23. package/out/controller/control/search-bar/search-bar-filter.controller.d.ts.map +1 -1
  24. package/out/controller/control/search-bar/search-bar-filter.controller.js +26 -6
  25. package/out/controller/control/search-bar/search-bar.controller.d.ts +29 -1
  26. package/out/controller/control/search-bar/search-bar.controller.d.ts.map +1 -1
  27. package/out/controller/control/search-bar/search-bar.controller.js +55 -8
  28. package/out/controller/control/tree/tree.controller.js +1 -1
  29. package/out/controller/control/tree-grid/tree-grid.controller.d.ts +35 -2
  30. package/out/controller/control/tree-grid/tree-grid.controller.d.ts.map +1 -1
  31. package/out/controller/control/tree-grid/tree-grid.controller.js +60 -0
  32. package/out/controller/control/tree-grid-ex/tree-grid-ex.controller.d.ts.map +1 -1
  33. package/out/controller/control/tree-grid-ex/tree-grid-ex.controller.js +2 -1
  34. package/out/controller/utils/index.d.ts +1 -0
  35. package/out/controller/utils/index.d.ts.map +1 -1
  36. package/out/controller/utils/index.js +1 -0
  37. package/out/controller/utils/jsonschema/entity.d.ts +11 -0
  38. package/out/controller/utils/jsonschema/entity.d.ts.map +1 -0
  39. package/out/controller/utils/jsonschema/entity.js +16 -0
  40. package/out/controller/utils/jsonschema/index.d.ts +2 -0
  41. package/out/controller/utils/jsonschema/index.d.ts.map +1 -0
  42. package/out/controller/utils/jsonschema/index.js +1 -0
  43. package/out/interface/common/i-app-hub-service/i-app-hub-service.d.ts +6 -0
  44. package/out/interface/common/i-app-hub-service/i-app-hub-service.d.ts.map +1 -1
  45. package/out/interface/controller/controller/control/i-grid.controller.d.ts +1 -1
  46. package/out/interface/controller/controller/control/i-grid.controller.d.ts.map +1 -1
  47. package/out/interface/controller/controller/control/i-tree-grid.controller.d.ts +11 -1
  48. package/out/interface/controller/controller/control/i-tree-grid.controller.d.ts.map +1 -1
  49. package/out/interface/controller/state/control/i-tree-grid.state.d.ts +5 -0
  50. package/out/interface/controller/state/control/i-tree-grid.state.d.ts.map +1 -1
  51. package/out/interface/provider/i-app-menu-item.provider.d.ts +31 -0
  52. package/out/interface/provider/i-app-menu-item.provider.d.ts.map +1 -0
  53. package/out/interface/provider/i-app-menu-item.provider.js +1 -0
  54. package/out/interface/provider/index.d.ts +1 -0
  55. package/out/interface/provider/index.d.ts.map +1 -1
  56. package/out/interface/service/i-data-entity/i-data-entity.d.ts +0 -17
  57. package/out/interface/service/i-data-entity/i-data-entity.d.ts.map +1 -1
  58. package/out/interface/service/service/i-auth.service.d.ts +23 -0
  59. package/out/interface/service/service/i-auth.service.d.ts.map +1 -1
  60. package/out/interface/service/service/index.d.ts +1 -1
  61. package/out/interface/service/service/index.d.ts.map +1 -1
  62. package/out/register/helper/app-menu-item-register.d.ts +25 -0
  63. package/out/register/helper/app-menu-item-register.d.ts.map +1 -0
  64. package/out/register/helper/app-menu-item-register.js +52 -0
  65. package/out/register/helper/index.d.ts +1 -0
  66. package/out/register/helper/index.d.ts.map +1 -1
  67. package/out/register/helper/index.js +1 -0
  68. package/out/service/app-data-entity/app-data-entity.d.ts +0 -9
  69. package/out/service/app-data-entity/app-data-entity.d.ts.map +1 -1
  70. package/out/service/app-data-entity/app-data-entity.js +11 -41
  71. package/out/service/de-service-util.js +1 -1
  72. package/out/service/service/auth/v7-auth.service.d.ts +3 -1
  73. package/out/service/service/auth/v7-auth.service.d.ts.map +1 -1
  74. package/out/service/service/auth/v7-auth.service.js +26 -3
  75. package/out/service/service/entity/method/de-action.d.ts +11 -0
  76. package/out/service/service/entity/method/de-action.d.ts.map +1 -1
  77. package/out/service/service/entity/method/de-action.js +34 -6
  78. package/out/service/utils/de-cache/de-cache.js +3 -3
  79. package/out/utils/open-redirect-view/open-redirect-view.d.ts +17 -4
  80. package/out/utils/open-redirect-view/open-redirect-view.d.ts.map +1 -1
  81. package/out/utils/open-redirect-view/open-redirect-view.js +20 -4
  82. package/package.json +3 -3
  83. package/src/app-hub.ts +6 -0
  84. package/src/controller/control/app-menu/app-menu.controller.ts +64 -6
  85. package/src/controller/control/gantt/gantt.controller.ts +3 -3
  86. package/src/controller/control/grid/grid/entity-schema.ts +105 -0
  87. package/src/controller/control/grid/grid/grid.controller.ts +74 -9
  88. package/src/controller/control/grid/grid/grid.service.ts +1 -1
  89. package/src/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.ts +1 -1
  90. package/src/controller/control/search-bar/entity-schema.ts +178 -0
  91. package/src/controller/control/search-bar/search-bar-filter.controller.ts +32 -9
  92. package/src/controller/control/search-bar/search-bar.controller.ts +69 -9
  93. package/src/controller/control/tree/tree.controller.ts +1 -1
  94. package/src/controller/control/tree-grid/tree-grid.controller.ts +79 -4
  95. package/src/controller/control/tree-grid-ex/tree-grid-ex.controller.ts +2 -2
  96. package/src/controller/utils/index.ts +1 -0
  97. package/src/controller/utils/jsonschema/entity.ts +19 -0
  98. package/src/controller/utils/jsonschema/index.ts +1 -0
  99. package/src/interface/common/i-app-hub-service/i-app-hub-service.ts +7 -0
  100. package/src/interface/controller/controller/control/i-grid.controller.ts +5 -2
  101. package/src/interface/controller/controller/control/i-tree-grid.controller.ts +16 -1
  102. package/src/interface/controller/state/control/i-tree-grid.state.ts +7 -1
  103. package/src/interface/provider/i-app-menu-item.provider.ts +40 -0
  104. package/src/interface/provider/index.ts +1 -0
  105. package/src/interface/service/i-data-entity/i-data-entity.ts +0 -19
  106. package/src/interface/service/service/i-auth.service.ts +26 -0
  107. package/src/interface/service/service/index.ts +1 -1
  108. package/src/register/helper/app-menu-item-register.ts +65 -0
  109. package/src/register/helper/index.ts +1 -0
  110. package/src/service/app-data-entity/app-data-entity.ts +11 -46
  111. package/src/service/de-service-util.ts +1 -1
  112. package/src/service/service/auth/v7-auth.service.ts +31 -2
  113. package/src/service/service/entity/method/de-action.ts +47 -6
  114. package/src/service/utils/de-cache/de-cache.ts +3 -3
  115. package/src/utils/open-redirect-view/open-redirect-view.ts +31 -4
@@ -211,10 +211,10 @@ export class DEActionMethod extends Method {
211
211
  const addData = this.createEntity(entity);
212
212
  let resultData;
213
213
  if (isArray(addData)) {
214
- resultData = await Promise.all(addData.map(item => this.service.local.add(context, item)));
214
+ resultData = await Promise.all(addData.map(item => this.service.local.add(context, this.attach(context, item))));
215
215
  }
216
216
  else {
217
- resultData = await this.service.local.add(context, addData);
217
+ resultData = await this.service.local.add(context, this.attach(context, addData));
218
218
  }
219
219
  return new HttpResponse(resultData);
220
220
  }
@@ -257,7 +257,7 @@ export class DEActionMethod extends Method {
257
257
  try {
258
258
  let key = null;
259
259
  if (params) {
260
- // key = params[this.entity.keyName];
260
+ key = params[this.entity.keyAppDEFieldId.toLowerCase()];
261
261
  }
262
262
  if (!key && context) {
263
263
  key = context[this.entity.codeName.toLowerCase()];
@@ -286,10 +286,10 @@ export class DEActionMethod extends Method {
286
286
  const updateData = this.createEntity(entity);
287
287
  let resultData;
288
288
  if (isArray(updateData)) {
289
- resultData = await Promise.all(updateData.map(item => this.service.local.update(context, item)));
289
+ resultData = await Promise.all(updateData.map(item => this.service.local.update(context, this.attach(context, item))));
290
290
  }
291
291
  else {
292
- resultData = await this.service.local.update(context, updateData);
292
+ resultData = await this.service.local.update(context, this.attach(context, updateData));
293
293
  }
294
294
  if (resultData) {
295
295
  return new HttpResponse(resultData);
@@ -313,7 +313,7 @@ export class DEActionMethod extends Method {
313
313
  try {
314
314
  let key = null;
315
315
  if (params) {
316
- // key = params[this.entity.keyName];
316
+ key = params[this.entity.keyAppDEFieldId.toLowerCase()];
317
317
  }
318
318
  if (!key && context) {
319
319
  key = context[this.entity.codeName.toLowerCase()];
@@ -350,4 +350,32 @@ export class DEActionMethod extends Method {
350
350
  // }
351
351
  return new HttpResponse(true);
352
352
  }
353
+ /**
354
+ * 在新建、更新时,根据界面域下的关系,自动填充相关父属性
355
+ *
356
+ * @author chitanda
357
+ * @date 2024-01-02 15:01:30
358
+ * @protected
359
+ * @param {IContext} context
360
+ * @param {IDataEntity} data
361
+ * @return {*} {IDataEntity}
362
+ */
363
+ attach(context, data) {
364
+ const sandboxId = context.srfsessionid;
365
+ const uiDomain = ibiz.uiDomainManager.get(sandboxId);
366
+ const configs = uiDomain.getDERConfig(this.entity.id);
367
+ if (configs.length > 0) {
368
+ configs.forEach(config => {
369
+ const { majorDECodeName, pickupDEFName } = config;
370
+ const majorLowerCodeName = majorDECodeName.toLowerCase();
371
+ const pickupLowerDEFName = pickupDEFName.toLowerCase();
372
+ const majorkey = context[majorLowerCodeName];
373
+ // 父主键不能是自身,否则自关系的时候就改错了
374
+ if (majorkey && majorkey !== data.srfkey) {
375
+ data[pickupLowerDEFName] = majorkey;
376
+ }
377
+ });
378
+ }
379
+ return data;
380
+ }
353
381
  }
@@ -422,9 +422,9 @@ export class DECache {
422
422
  * @date 2023-12-22 13:12:17
423
423
  */
424
424
  clear() {
425
- this.cacheMap.forEach(item => {
426
- item.destroy();
427
- });
425
+ // this.cacheMap.forEach(item => {
426
+ // item.destroy();
427
+ // });
428
428
  this.cacheMap.clear();
429
429
  }
430
430
  /**
@@ -23,14 +23,27 @@ export declare function openRedirectView(appView: IAppRedirectView, context: ICo
23
23
  * 本地打开工作流重定向视图
24
24
  *
25
25
  * @description 工作流 appredirectview 特殊处理,全局通过 appredirectview 跳转工作流重定向,均使用此方法
26
- * @author chitanda
27
- * @date 2023-01-12 11:01:40
26
+ * @author zk
27
+ * @date 2024-01-02 11:01:16
28
+ * @export
29
+ * @param {IContext} context
30
+ * @param {string} linkUrl
31
+ * @param {IOpenViewOptions} [opts={}]
32
+ * @return {*} {Promise<void>}
33
+ */
34
+ export declare function toLocalOpenWFRedirectView(context: IContext, linkUrl: string, opts?: IOpenViewOptions): Promise<void>;
35
+ /**
36
+ * 获取本地打开工作流重定向视图的相关信息
37
+ *
38
+ * @author zk
39
+ * @date 2024-01-02 11:01:38
28
40
  * @export
29
- * @param {IAppDERedirectView} appView
30
41
  * @param {IContext} context
31
42
  * @param {string} linkUrl
43
+ * @param {IOpenViewOptions} [opts={}]
44
+ * @return {*} {Promise<ToViewParams>}
32
45
  */
33
- export declare function toLocalOpenWFRedirectView(context: IContext, linkUrl: string, opts?: IOpenViewOptions): Promise<ToViewParams>;
46
+ export declare function getLocalOpenWFRedirectView(context: IContext, linkUrl: string, opts?: IOpenViewOptions): Promise<ToViewParams>;
34
47
  /**
35
48
  * 获取处理后的重定向视图最终要跳转视图的相关信息
36
49
  * @author lxm
@@ -1 +1 @@
1
- {"version":3,"file":"open-redirect-view.d.ts","sourceRoot":"","sources":["../../../src/utils/open-redirect-view/open-redirect-view.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAK/D,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,QAAQ,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,QAAQ,EACjB,MAAM,GAAE,OAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAoDvB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,QAAQ,EACjB,MAAM,GAAE,OAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAAC,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAsG3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,QAAQ,EACjB,MAAM,GAAE,OAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
1
+ {"version":3,"file":"open-redirect-view.d.ts","sourceRoot":"","sources":["../../../src/utils/open-redirect-view/open-redirect-view.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAK/D,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,QAAQ,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,QAAQ,EACjB,MAAM,GAAE,OAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAoDvB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,QAAQ,EACjB,MAAM,GAAE,OAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAAC,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAsG3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,QAAQ,EACjB,MAAM,GAAE,OAAY,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
@@ -23,14 +23,30 @@ export async function openRedirectView(appView, context, params = {}, opts = {})
23
23
  * 本地打开工作流重定向视图
24
24
  *
25
25
  * @description 工作流 appredirectview 特殊处理,全局通过 appredirectview 跳转工作流重定向,均使用此方法
26
- * @author chitanda
27
- * @date 2023-01-12 11:01:40
26
+ * @author zk
27
+ * @date 2024-01-02 11:01:16
28
28
  * @export
29
- * @param {IAppDERedirectView} appView
30
29
  * @param {IContext} context
31
30
  * @param {string} linkUrl
31
+ * @param {IOpenViewOptions} [opts={}]
32
+ * @return {*} {Promise<void>}
32
33
  */
33
34
  export async function toLocalOpenWFRedirectView(context, linkUrl, opts = {}) {
35
+ const toView = await getLocalOpenWFRedirectView(context, linkUrl, opts);
36
+ await ibiz.commands.execute(OpenAppViewCommand.TAG, toView.viewId, toView.context, toView.params, toView.opts);
37
+ }
38
+ /**
39
+ * 获取本地打开工作流重定向视图的相关信息
40
+ *
41
+ * @author zk
42
+ * @date 2024-01-02 11:01:38
43
+ * @export
44
+ * @param {IContext} context
45
+ * @param {string} linkUrl
46
+ * @param {IOpenViewOptions} [opts={}]
47
+ * @return {*} {Promise<ToViewParams>}
48
+ */
49
+ export async function getLocalOpenWFRedirectView(context, linkUrl, opts = {}) {
34
50
  const i = linkUrl.lastIndexOf('?');
35
51
  const queryStr = decodeURIComponent(linkUrl.substring(i + 1, linkUrl.length));
36
52
  const params = qs.parse(queryStr, { delimiter: ';' });
@@ -123,7 +139,7 @@ export async function getDERedirectToView(appView, context, params = {}, opts =
123
139
  return { type: 'url', url: linkUrl };
124
140
  }
125
141
  if (linkUrl.startsWith('appredirectview?')) {
126
- const toView = await toLocalOpenWFRedirectView(context, linkUrl, opts);
142
+ const toView = await getLocalOpenWFRedirectView(context, linkUrl, opts);
127
143
  return Object.assign({ type: 'view' }, toView);
128
144
  }
129
145
  throw new RuntimeError(`未支持的linkUrl格式:${linkUrl}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibiz-template/runtime",
3
- "version": "0.5.0-beta.4",
3
+ "version": "0.5.0",
4
4
  "description": "控制器包",
5
5
  "type": "module",
6
6
  "main": "out/index.js",
@@ -29,7 +29,7 @@
29
29
  "author": "chitanda",
30
30
  "license": "MIT",
31
31
  "devDependencies": {
32
- "@ibiz-template/core": "^0.5.0-beta.4",
32
+ "@ibiz-template/core": "^0.5.0",
33
33
  "@ibiz/model-core": "^0.1.0",
34
34
  "@types/path-browserify": "^1.0.2",
35
35
  "@types/qs": "^6.9.11",
@@ -59,5 +59,5 @@
59
59
  "qx-util": "^0.4.8",
60
60
  "ramda": "^0.29.0"
61
61
  },
62
- "gitHead": "5ae4c48f5f1ade5134d8fc90b3fd176fbe102149"
62
+ "gitHead": "84126d4a93b6641962d688ef6d92fce3bea7c2d1"
63
63
  }
package/src/app-hub.ts CHANGED
@@ -345,4 +345,10 @@ export class AppHub implements IAppHubService {
345
345
  }
346
346
  return [];
347
347
  }
348
+
349
+ reset(): void {
350
+ this.appMap.clear();
351
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
352
+ (this.configCache as any) = undefined;
353
+ }
348
354
  }
@@ -10,9 +10,12 @@ import {
10
10
  IAppMenuEvent,
11
11
  IAppMenuController,
12
12
  IAppService,
13
+ IAppMenuItemProvider,
13
14
  } from '../../../interface';
14
15
  import { AppCounter } from '../../../service';
15
16
  import { ControlController } from '../../common';
17
+ import { getAppMenuItemProvider } from '../../../register';
18
+ import { CTX } from '../../ctx';
16
19
 
17
20
  /**
18
21
  * 应用菜单控制器
@@ -34,6 +37,22 @@ export class AppMenuController
34
37
  this.state.menuItemsState = {};
35
38
  }
36
39
 
40
+ /**
41
+ * 所有菜单项,平铺开
42
+ * @author lxm
43
+ * @date 2023-12-29 02:43:35
44
+ * @type {IAppMenuItem[]}
45
+ */
46
+ allAppMenuItems!: IAppMenuItem[];
47
+
48
+ /**
49
+ * 菜单项适配器集合
50
+ * @author lxm
51
+ * @date 2023-07-19 04:14:50
52
+ * @type {{ [key: string]: IProvider }}
53
+ */
54
+ itemProviders: { [key: string]: IAppMenuItemProvider } = {};
55
+
37
56
  /**
38
57
  * 视图层级
39
58
  *
@@ -45,10 +64,15 @@ export class AppMenuController
45
64
  return this.view.modal.routeDepth;
46
65
  }
47
66
 
67
+ constructor(model: IAppMenu, context: IContext, params: IParams, ctx: CTX) {
68
+ super(model, context, params, ctx);
69
+ this.flattenAllItems();
70
+ }
71
+
48
72
  protected async onCreated(): Promise<void> {
49
73
  await super.onCreated();
50
-
51
74
  this.app = await ibiz.hub.getApp(this.context.srfappid);
75
+ await this.initAppMenuItemProviders();
52
76
 
53
77
  // 初始化菜单项状态
54
78
  this.model.appMenuItems?.forEach(item => {
@@ -56,6 +80,24 @@ export class AppMenuController
56
80
  });
57
81
  }
58
82
 
83
+ /**
84
+ * 初始化菜单项的适配器
85
+ * @author lxm
86
+ * @date 2023-12-29 02:50:20
87
+ * @protected
88
+ * @return {*} {Promise<void>}
89
+ */
90
+ protected async initAppMenuItemProviders(): Promise<void> {
91
+ await Promise.all(
92
+ this.allAppMenuItems.map(async item => {
93
+ const provider = await getAppMenuItemProvider(item);
94
+ if (provider) {
95
+ this.itemProviders[item.id!] = provider;
96
+ }
97
+ }),
98
+ );
99
+ }
100
+
59
101
  /**
60
102
  * 菜单项点击回调,触发对应的应用功能
61
103
  *
@@ -82,6 +124,12 @@ export class AppMenuController
82
124
  event,
83
125
  });
84
126
 
127
+ // 如果有适配器,走适配器的点击处理
128
+ const provider = this.itemProviders[id];
129
+ if (provider && provider.onClick) {
130
+ return provider.onClick(menuItem, event as MouseEvent, this);
131
+ }
132
+
85
133
  if (!menuItem.appFuncId) {
86
134
  throw new RuntimeModelError(menuItem, '没有配置应用功能');
87
135
  }
@@ -139,11 +187,11 @@ export class AppMenuController
139
187
 
140
188
  /**
141
189
  * 所有项平铺
142
- * @return {*}
143
- * @author: zhujiamin
144
- * @Date: 2022-09-09 16:48:21
190
+ * @author lxm
191
+ * @date 2023-12-29 02:42:39
192
+ * @protected
145
193
  */
146
- getAllItems(): IAppMenuItem[] {
194
+ protected flattenAllItems(): void {
147
195
  const result: IAppMenuItem[] = [];
148
196
  const flattenMenus = (menuItems: IAppMenuItem[]): void => {
149
197
  menuItems.forEach(item => {
@@ -154,7 +202,17 @@ export class AppMenuController
154
202
  });
155
203
  };
156
204
  flattenMenus(this.model.appMenuItems!);
157
- return result;
205
+ this.allAppMenuItems = result;
206
+ }
207
+
208
+ /**
209
+ * 所有项平铺
210
+ * @return {*}
211
+ * @author: zhujiamin
212
+ * @Date: 2022-09-09 16:48:21
213
+ */
214
+ getAllItems(): IAppMenuItem[] {
215
+ return this.allAppMenuItems;
158
216
  }
159
217
 
160
218
  /**
@@ -11,6 +11,7 @@ import {
11
11
  } from '../../../interface';
12
12
  import { GanttService } from './gantt.service';
13
13
  import { TreeGridExController } from '../tree-grid-ex';
14
+ import { calcDeCodeNameById } from '../../../model';
14
15
 
15
16
  /**
16
17
  * 甘特图控制器
@@ -37,7 +38,6 @@ export class GanttController
37
38
  */
38
39
  protected initState(): void {
39
40
  super.initState();
40
- this.state.rootNodes = [];
41
41
  this.state.ganttStyle = {};
42
42
  }
43
43
 
@@ -123,9 +123,9 @@ export class GanttController
123
123
  ? this.transformNodeDataItem(nodeModel, data)
124
124
  : data;
125
125
  if (Object.keys(newData).length > 0) {
126
- const [, entityCodename] = nodeModel.appDataEntityId!.split('.');
126
+ const deName = calcDeCodeNameById(nodeModel.appDataEntityId!);
127
127
  const tempContext = Object.assign(this.context.clone(), {
128
- [entityCodename]: currentNode.srfkey,
128
+ [deName]: currentNode.srfkey,
129
129
  });
130
130
  const response = await this.service.execDeService(
131
131
  nodeModel.appDataEntityId!,
@@ -0,0 +1,105 @@
1
+ import { IDEGridDataItem, IDEGridFieldColumn } from '@ibiz/model-core';
2
+ import { GridController } from './grid.controller';
3
+
4
+ const TypeToDataType: { [p: string]: number } = {
5
+ string: 25,
6
+ number: 6,
7
+ integer: 9,
8
+ date: 5,
9
+ } as const;
10
+
11
+ /**
12
+ * 根据json模型计算出表格列模型
13
+ * @author lxm
14
+ * @date 2024-01-02 10:27:40
15
+ * @export
16
+ * @param {IData} json
17
+ * @param {SearchBarController} c
18
+ * @return {*} {ISearchBarFilter[]}
19
+ */
20
+ export async function calcColumnModelBySchema(
21
+ json: IData,
22
+ c: GridController,
23
+ ): Promise<
24
+ | { degridColumns: IDEGridFieldColumn[]; degridDataItems: IDEGridDataItem[] }
25
+ | undefined
26
+ > {
27
+ if (!json.properties) {
28
+ return;
29
+ }
30
+ const { properties } = json;
31
+ if (!(Object.keys(properties).length > 0)) {
32
+ return;
33
+ }
34
+
35
+ const addFields: {
36
+ key: string;
37
+ description: string;
38
+ type: string;
39
+ }[] = [];
40
+ Object.keys(properties).forEach((key: string) => {
41
+ let type: string;
42
+
43
+ switch (properties[key].type) {
44
+ case 'string':
45
+ type = 'string';
46
+ if (properties[key].format === 'date-time') {
47
+ type = 'date';
48
+ }
49
+ break;
50
+ case 'integer':
51
+ type = 'integer';
52
+ break;
53
+ case 'number':
54
+ type = 'number';
55
+ break;
56
+ default:
57
+ ibiz.log.error(`未支持的类型${properties[key].type}`);
58
+ return;
59
+ }
60
+
61
+ addFields.push({
62
+ key,
63
+ description: properties[key].description,
64
+ type,
65
+ });
66
+ });
67
+
68
+ // 属性codeName对应的属性id
69
+ const codeNameToId: { [p: string]: string } = {};
70
+ const dataEntity = await ibiz.hub.getAppDataEntity(
71
+ c.model.appDataEntityId!,
72
+ c.model.appId,
73
+ );
74
+ dataEntity.appDEFields?.forEach(field => {
75
+ codeNameToId[field.codeName!.toLowerCase()] = field.id!;
76
+ });
77
+
78
+ const addColumns: IDEGridFieldColumn[] = [];
79
+ const addDataItems: IDEGridDataItem[] = [];
80
+
81
+ addFields.forEach(item => {
82
+ addColumns.push({
83
+ appId: c.model.appId,
84
+ appDEFieldId: codeNameToId[item.key],
85
+ id: item.key,
86
+ codeName: item.key,
87
+ columnType: 'DEFGRIDCOLUMN',
88
+ width: 150,
89
+ widthUnit: 'PX',
90
+ valueType: 'SIMPLE',
91
+ caption: item.description,
92
+ dataItemName: item.key,
93
+ });
94
+
95
+ addDataItems.push({
96
+ appId: c.model.appId,
97
+ appDEFieldId: codeNameToId[item.key],
98
+ id: item.key,
99
+ valueType: 'SIMPLE',
100
+ dataType: TypeToDataType[item.type],
101
+ });
102
+ });
103
+
104
+ return { degridColumns: addColumns, degridDataItems: addDataItems };
105
+ }
@@ -40,8 +40,15 @@ import { getGridColumnProvider } from '../../../../register';
40
40
  import { ControlVO, Srfuf } from '../../../../service';
41
41
  import { MDControlController } from '../../../common';
42
42
  import { GridNotifyState } from '../../../constant';
43
- import { exportData, getDefaultValue, isValueChange } from '../../../utils';
43
+ import {
44
+ ControllerEvent,
45
+ exportData,
46
+ getDefaultValue,
47
+ getEntitySchema,
48
+ isValueChange,
49
+ } from '../../../utils';
44
50
  import { handleAllSettled, ScriptFactory } from '../../../../utils';
51
+ import { calcColumnModelBySchema } from './entity-schema';
45
52
 
46
53
  /**
47
54
  * 表格控制器
@@ -52,9 +59,13 @@ import { handleAllSettled, ScriptFactory } from '../../../../utils';
52
59
  * @class GridController
53
60
  * @extends {MDControlController<GridModel>}
54
61
  */
55
- export class GridController
56
- extends MDControlController<IDEGrid, IGridState, IGridEvent>
57
- implements IGridController
62
+ export class GridController<
63
+ T extends IDEGrid = IDEGrid,
64
+ S extends IGridState = IGridState,
65
+ E extends IGridEvent = IGridEvent,
66
+ >
67
+ extends MDControlController<T, S, E>
68
+ implements IGridController<T, S, E>
58
69
  {
59
70
  /**
60
71
  * 表格部件服务
@@ -65,6 +76,10 @@ export class GridController
65
76
  */
66
77
  declare service: GridService;
67
78
 
79
+ protected get _evt(): ControllerEvent<IGridEvent> {
80
+ return this.evt;
81
+ }
82
+
68
83
  /**
69
84
  * 是否有配置宽度自适应列
70
85
  *
@@ -81,6 +96,14 @@ export class GridController
81
96
  */
82
97
  isMultistageHeader: boolean = false;
83
98
 
99
+ /**
100
+ * 是否添加jsonschema里定义的表格列
101
+ * @author lxm
102
+ * @date 2024-01-02 05:27:16
103
+ * @type {boolean}
104
+ */
105
+ addSchemaColumn: boolean = false;
106
+
84
107
  /**
85
108
  * 所有表格列控制器集合
86
109
  *
@@ -221,6 +244,8 @@ export class GridController
221
244
  * @returns {*} {Promise<void>}
222
245
  */
223
246
  protected async onCreated(): Promise<void> {
247
+ await this.initByEntitySchema();
248
+
224
249
  await super.onCreated();
225
250
 
226
251
  this.service = new GridService(this.model);
@@ -241,6 +266,46 @@ export class GridController
241
266
  await this.initGroup();
242
267
  }
243
268
 
269
+ /**
270
+ * 根据jsonschema初始化自定义表格列
271
+ * @author lxm
272
+ * @date 2024-01-02 04:41:23
273
+ * @return {*} {Promise<void>}
274
+ */
275
+ async initByEntitySchema(): Promise<void> {
276
+ if (!this.addSchemaColumn) {
277
+ return;
278
+ }
279
+
280
+ const json = await getEntitySchema(
281
+ this.model.appDataEntityId!,
282
+ this.context,
283
+ );
284
+ if (!json) {
285
+ return;
286
+ }
287
+
288
+ const result = await calcColumnModelBySchema(json, this);
289
+ if (result && result.degridColumns.length > 0) {
290
+ const { degridColumns, degridDataItems } = result;
291
+ // 修改模型之前拷贝一份,避免污染原始数据
292
+ (this as IData).model = clone(this.model);
293
+ this.model.degridColumns = [
294
+ ...(this.model.degridColumns || []).filter(item => {
295
+ return degridColumns.findIndex(x => x.id === item.id) === -1;
296
+ }),
297
+ ...degridColumns,
298
+ ];
299
+
300
+ this.model.degridDataItems = [
301
+ ...(this.model.degridDataItems || []).filter(item => {
302
+ return degridDataItems.findIndex(x => x.id === item.id) === -1;
303
+ }),
304
+ ...degridDataItems!,
305
+ ];
306
+ }
307
+ }
308
+
244
309
  /**
245
310
  * 初始化表格分组
246
311
  * @author lxm
@@ -550,7 +615,7 @@ export class GridController
550
615
  ? await this.service.create(tempContext, data)
551
616
  : await this.service.update(tempContext, data);
552
617
  } catch (error) {
553
- await this.evt.emit('onSaveError', undefined);
618
+ await this._evt.emit('onSaveError', undefined);
554
619
  this.actionNotification(`${isCreate ? 'CREATE' : 'UPDATE'}ERROR`, {
555
620
  error: error as Error,
556
621
  data: rowState.data,
@@ -564,7 +629,7 @@ export class GridController
564
629
  rowState.modified = false;
565
630
 
566
631
  this.gridStateNotify(rowState, GridNotifyState.SAVE);
567
- await this.evt.emit('onSaveSuccess', undefined);
632
+ await this._evt.emit('onSaveSuccess', undefined);
568
633
  }
569
634
 
570
635
  async saveAll(): Promise<void> {
@@ -717,7 +782,7 @@ export class GridController
717
782
 
718
783
  try {
719
784
  await this.dataChangeNotify(row, [name]);
720
- await this.evt.emit('onGridDataChange', {
785
+ await this._evt.emit('onGridDataChange', {
721
786
  data: this.state.rows.map(_row => {
722
787
  return _row.data;
723
788
  }),
@@ -810,7 +875,7 @@ export class GridController
810
875
  } else if (row.data.srfuf === Srfuf.CREATE) {
811
876
  // 新建的行取消时删除这一行的数据
812
877
  row.showRowEdit = false;
813
- this.evt.emit('onRowEditChange', { row });
878
+ this._evt.emit('onRowEditChange', { row });
814
879
  return this.remove({ data: [row.data], silent: true });
815
880
  } else if (row.cacheData) {
816
881
  // 取消的时候,还原编辑前的数据
@@ -841,7 +906,7 @@ export class GridController
841
906
  row.editColStates[column.fieldName].editable = toState;
842
907
  });
843
908
 
844
- this.evt.emit('onRowEditChange', { row });
909
+ this._evt.emit('onRowEditChange', { row });
845
910
  }
846
911
 
847
912
  /**
@@ -31,7 +31,7 @@ export class GridService extends MDControlService<IDEGrid> {
31
31
  if (deField) {
32
32
  const deFieldKey = deField.toLowerCase();
33
33
  const dataItem = dataItems.find(
34
- item => item.appDEFieldId === deField,
34
+ item => item.id === column.dataItemName,
35
35
  );
36
36
  if (dataItem) {
37
37
  mapField = new UIMapField(uiKey, deFieldKey, {
@@ -261,7 +261,7 @@ export class GridFieldColumnController extends GridColumnController<IDEGridField
261
261
  calcFieldAgg(items: IData[]): string | undefined {
262
262
  const { aggField, aggMode, aggValueFormat, unitName } = this.model;
263
263
  // 无聚合配置的列,返回undefined
264
- if (aggMode === 'NONE') {
264
+ if (isNil(aggMode) || aggMode === 'NONE') {
265
265
  return;
266
266
  }
267
267
  const fieldName = aggField || this.model.id!;