@ibiz-template/runtime 0.2.4 → 0.2.6

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 (77) hide show
  1. package/dist/index.esm.js +134 -35
  2. package/dist/index.system.min.js +1 -1
  3. package/dist/index.system.min.js.map +1 -1
  4. package/out/controller/common/base.controller.js +4 -4
  5. package/out/controller/common/control/control.controller.d.ts +13 -0
  6. package/out/controller/common/control/control.controller.d.ts.map +1 -1
  7. package/out/controller/common/control/control.controller.js +33 -2
  8. package/out/controller/control/dashboard/dashboard.controller.d.ts.map +1 -1
  9. package/out/controller/control/dashboard/dashboard.controller.js +12 -0
  10. package/out/controller/control/dashboard/portlet/actionbar-portlet/actionbar-portlet.controller.d.ts +5 -0
  11. package/out/controller/control/dashboard/portlet/actionbar-portlet/actionbar-portlet.controller.d.ts.map +1 -0
  12. package/out/controller/control/dashboard/portlet/actionbar-portlet/actionbar-portlet.controller.js +3 -0
  13. package/out/controller/control/dashboard/portlet/actionbar-portlet/index.d.ts +2 -0
  14. package/out/controller/control/dashboard/portlet/actionbar-portlet/index.d.ts.map +1 -0
  15. package/out/controller/control/dashboard/portlet/actionbar-portlet/index.js +1 -0
  16. package/out/controller/control/dashboard/portlet/chart-portlet/chart-portlet.controller.d.ts +5 -0
  17. package/out/controller/control/dashboard/portlet/chart-portlet/chart-portlet.controller.d.ts.map +1 -0
  18. package/out/controller/control/dashboard/portlet/chart-portlet/chart-portlet.controller.js +3 -0
  19. package/out/controller/control/dashboard/portlet/chart-portlet/index.d.ts +2 -0
  20. package/out/controller/control/dashboard/portlet/chart-portlet/index.d.ts.map +1 -0
  21. package/out/controller/control/dashboard/portlet/chart-portlet/index.js +1 -0
  22. package/out/controller/control/dashboard/portlet/html-portlet/html-portlet.controller.d.ts +5 -0
  23. package/out/controller/control/dashboard/portlet/html-portlet/html-portlet.controller.d.ts.map +1 -0
  24. package/out/controller/control/dashboard/portlet/html-portlet/html-portlet.controller.js +3 -0
  25. package/out/controller/control/dashboard/portlet/html-portlet/index.d.ts +2 -0
  26. package/out/controller/control/dashboard/portlet/html-portlet/index.d.ts.map +1 -0
  27. package/out/controller/control/dashboard/portlet/html-portlet/index.js +1 -0
  28. package/out/controller/control/dashboard/portlet/index.d.ts +5 -0
  29. package/out/controller/control/dashboard/portlet/index.d.ts.map +1 -1
  30. package/out/controller/control/dashboard/portlet/index.js +5 -0
  31. package/out/controller/control/dashboard/portlet/list-portlet/index.d.ts +2 -0
  32. package/out/controller/control/dashboard/portlet/list-portlet/index.d.ts.map +1 -0
  33. package/out/controller/control/dashboard/portlet/list-portlet/index.js +1 -0
  34. package/out/controller/control/dashboard/portlet/list-portlet/list-portlet.controller.d.ts +5 -0
  35. package/out/controller/control/dashboard/portlet/list-portlet/list-portlet.controller.d.ts.map +1 -0
  36. package/out/controller/control/dashboard/portlet/list-portlet/list-portlet.controller.js +3 -0
  37. package/out/controller/control/dashboard/portlet/rawitem-portlet/index.d.ts +2 -0
  38. package/out/controller/control/dashboard/portlet/rawitem-portlet/index.d.ts.map +1 -0
  39. package/out/controller/control/dashboard/portlet/rawitem-portlet/index.js +1 -0
  40. package/out/controller/control/dashboard/portlet/rawitem-portlet/rawitem-portlet.controller.d.ts +5 -0
  41. package/out/controller/control/dashboard/portlet/rawitem-portlet/rawitem-portlet.controller.d.ts.map +1 -0
  42. package/out/controller/control/dashboard/portlet/rawitem-portlet/rawitem-portlet.controller.js +3 -0
  43. package/out/controller/control/form/form-detail/form-detail/form-detail.controller.d.ts +2 -2
  44. package/out/controller/control/form/form-detail/form-detail/form-detail.controller.d.ts.map +1 -1
  45. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-content-type.controller.d.ts.map +1 -1
  46. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-content-type.controller.js +11 -2
  47. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl.controller.d.ts +2 -8
  48. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl.controller.d.ts.map +1 -1
  49. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl.controller.js +9 -10
  50. package/out/controller/control/grid/grid/grid.controller.d.ts +17 -1
  51. package/out/controller/control/grid/grid/grid.controller.d.ts.map +1 -1
  52. package/out/controller/control/grid/grid/grid.controller.js +37 -9
  53. package/out/interface/controller/controller/control/i-control.controller.d.ts +11 -0
  54. package/out/interface/controller/controller/control/i-control.controller.d.ts.map +1 -1
  55. package/out/service/utils/res-path/res-path.d.ts.map +1 -1
  56. package/out/service/utils/res-path/res-path.js +4 -2
  57. package/package.json +3 -3
  58. package/src/controller/common/base.controller.ts +4 -4
  59. package/src/controller/common/control/control.controller.ts +50 -3
  60. package/src/controller/control/dashboard/dashboard.controller.ts +14 -0
  61. package/src/controller/control/dashboard/portlet/actionbar-portlet/actionbar-portlet.controller.ts +4 -0
  62. package/src/controller/control/dashboard/portlet/actionbar-portlet/index.ts +1 -0
  63. package/src/controller/control/dashboard/portlet/chart-portlet/chart-portlet.controller.ts +4 -0
  64. package/src/controller/control/dashboard/portlet/chart-portlet/index.ts +1 -0
  65. package/src/controller/control/dashboard/portlet/html-portlet/html-portlet.controller.ts +4 -0
  66. package/src/controller/control/dashboard/portlet/html-portlet/index.ts +1 -0
  67. package/src/controller/control/dashboard/portlet/index.ts +5 -0
  68. package/src/controller/control/dashboard/portlet/list-portlet/index.ts +1 -0
  69. package/src/controller/control/dashboard/portlet/list-portlet/list-portlet.controller.ts +4 -0
  70. package/src/controller/control/dashboard/portlet/rawitem-portlet/index.ts +1 -0
  71. package/src/controller/control/dashboard/portlet/rawitem-portlet/rawitem-portlet.controller.ts +4 -0
  72. package/src/controller/control/form/form-detail/form-detail/form-detail.controller.ts +2 -2
  73. package/src/controller/control/form/form-detail/form-mdctrl/form-mdctrl-content-type.controller.ts +9 -2
  74. package/src/controller/control/form/form-detail/form-mdctrl/form-mdctrl.controller.ts +12 -11
  75. package/src/controller/control/grid/grid/grid.controller.ts +46 -15
  76. package/src/interface/controller/controller/control/i-control.controller.ts +9 -0
  77. package/src/service/utils/res-path/res-path.ts +4 -2
@@ -294,7 +294,7 @@ export class GridController extends MDControlController {
294
294
  afterRemove(data) {
295
295
  super.afterRemove(data);
296
296
  // 删除this.state.rows里的表格行数据
297
- const index = this.state.rows.findIndex(item => item.data.srfkey === data.srfkey);
297
+ const index = this.findRowStateIndex(data);
298
298
  this.state.rows.splice(index, 1);
299
299
  // 删除分组里的那条数据
300
300
  this.state.groups.forEach(item => {
@@ -314,15 +314,18 @@ export class GridController extends MDControlController {
314
314
  */
315
315
  async newRow() {
316
316
  const { enableRowEdit, enableRowNew } = this.model;
317
+ const { editShowMode } = ibiz.config.grid;
317
318
  if (!enableRowEdit ||
318
319
  !enableRowNew ||
319
- ibiz.config.grid.editShowMode !== 'row') {
320
+ !['row', 'all'].includes(editShowMode)) {
320
321
  ibiz.log.error('不支持新建行');
321
322
  return;
322
323
  }
323
- const editingRow = this.state.rows.find(item => item.showRowEdit);
324
- if (editingRow) {
325
- throw new RuntimeError('请先完成当前行编辑中的行的操作');
324
+ if (editShowMode === 'row') {
325
+ const editingRow = this.state.rows.find(item => item.showRowEdit);
326
+ if (editingRow) {
327
+ throw new RuntimeError('请先完成当前行编辑中的行的操作');
328
+ }
326
329
  }
327
330
  const queryParams = Object.assign({}, this.params);
328
331
  const defaultData = this.calcDefaultValue({}, true); // 新建默认值
@@ -345,7 +348,9 @@ export class GridController extends MDControlController {
345
348
  const newRow = new GridRowState(draftData, this);
346
349
  this.state.rows.unshift(newRow);
347
350
  this.gridStateNotify(newRow, GridNotifyState.DRAFT);
348
- this.switchRowEdit(this.state.rows[0], true);
351
+ if (editShowMode === 'row') {
352
+ this.switchRowEdit(this.state.rows[0], true);
353
+ }
349
354
  this.actionNotification('GETDRAFTSUCCESS', { data: draftData });
350
355
  }
351
356
  /**
@@ -360,7 +365,8 @@ export class GridController extends MDControlController {
360
365
  if (this.state.isSimple) {
361
366
  return;
362
367
  }
363
- const rowState = this.state.rows.find(item => item.data.srfkey === data.srfkey);
368
+ const isCreate = data.srfuf === Srfuf.CREATE;
369
+ const rowState = this.findRowState(data);
364
370
  if (!rowState) {
365
371
  throw new RuntimeError('行数据不存在');
366
372
  }
@@ -379,7 +385,6 @@ export class GridController extends MDControlController {
379
385
  }
380
386
  await this.startLoading();
381
387
  let res;
382
- const isCreate = data.srfuf === Srfuf.CREATE;
383
388
  const deName = calcDeCodeNameById(this.model.appDataEntityId);
384
389
  const tempContext = this.context.clone();
385
390
  tempContext[deName] = data.srfkey;
@@ -400,7 +405,7 @@ export class GridController extends MDControlController {
400
405
  await this.endLoading();
401
406
  }
402
407
  // 后续处理
403
- const index = this.state.items.findIndex(item => item.srfkey === data.srfkey);
408
+ const index = this.findRowStateIndex(data);
404
409
  this.state.items.splice(index, 1, res.data);
405
410
  rowState.data = res.data;
406
411
  rowState.modified = false;
@@ -848,4 +853,27 @@ export class GridController extends MDControlController {
848
853
  });
849
854
  return result;
850
855
  }
856
+ /**
857
+ * 查找rowState
858
+ * @author lxm
859
+ * @date 2023-10-27 07:27:48
860
+ * @param {IData} data
861
+ * @return {*} {(IGridRowState)}
862
+ */
863
+ findRowStateIndex(data) {
864
+ const isCreate = data.srfuf === Srfuf.CREATE;
865
+ const compareKey = isCreate ? 'tempsrfkey' : 'srfkey';
866
+ return this.state.rows.findIndex(item => item.data[compareKey] === data[compareKey]);
867
+ }
868
+ /**
869
+ * 查找rowState
870
+ * @author lxm
871
+ * @date 2023-10-27 07:27:48
872
+ * @param {IData} data
873
+ * @return {*} {(IGridRowState | undefined)}
874
+ */
875
+ findRowState(data) {
876
+ const index = this.findRowStateIndex(data);
877
+ return index !== -1 ? this.state.rows[index] : undefined;
878
+ }
851
879
  }
@@ -41,5 +41,16 @@ export interface IControlController<T extends IControl = IControl, S extends ICo
41
41
  * @date 2022-09-19 14:09:09
42
42
  */
43
43
  endLoading(): Promise<void>;
44
+ /**
45
+ * 在不改变引用的前提下,更新上下文和导航参数
46
+ * 并处理如自定义导航参数的后续处理
47
+ * @author lxm
48
+ * @date 2023-10-27 01:47:59
49
+ * @param {{ context?: IContext; params?: IParams }} opts
50
+ */
51
+ updateContextParams(opts: {
52
+ context?: IContext;
53
+ params?: IParams;
54
+ }): void;
44
55
  }
45
56
  //# sourceMappingURL=i-control.controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"i-control.controller.d.ts","sourceRoot":"","sources":["../../../../../src/interface/controller/controller/control/i-control.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAC7B,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5B;;;;;OAKG;IACH,IAAI,EAAE,eAAe,CAAC;IAEtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,0BAA0B,CAAC;IAEzC;;;;;OAKG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B;;;;;OAKG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B"}
1
+ {"version":3,"file":"i-control.controller.d.ts","sourceRoot":"","sources":["../../../../../src/interface/controller/controller/control/i-control.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAC7B,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5B;;;;;OAKG;IACH,IAAI,EAAE,eAAe,CAAC;IAEtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,0BAA0B,CAAC;IAEzC;;;;;OAKG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B;;;;;OAKG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;;OAMG;IACH,mBAAmB,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,QAAQ,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3E"}
@@ -1 +1 @@
1
- {"version":3,"file":"res-path.d.ts","sourceRoot":"","sources":["../../../../src/service/utils/res-path/res-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKlD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,cAAc,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAgC9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAkB5E"}
1
+ {"version":3,"file":"res-path.d.ts","sourceRoot":"","sources":["../../../../src/service/utils/res-path/res-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKlD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,cAAc,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAkC9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAkB5E"}
@@ -1,5 +1,5 @@
1
1
  // 匹配 ${} 中间的内容
2
- const reg = /(?<=\$\{)(.*?)(?=\})/g;
2
+ const reg = /\$\{(.*?)\}/g;
3
3
  /**
4
4
  * 获取匹配的资源路径
5
5
  * - 没匹配返回undefined
@@ -17,9 +17,11 @@ export function getMatchResPath(context, entity) {
17
17
  const pathItems = entity.requestPaths || [];
18
18
  // 获取所有的路径需要匹配的参数
19
19
  const items = pathItems.map(str => {
20
+ const match = str.match(reg);
21
+ const keys = (match === null || match === void 0 ? void 0 : match.map(item => item.substring(2, item.length - 1))) || [];
20
22
  return {
21
23
  path: str,
22
- keys: str.match(reg) || [],
24
+ keys,
23
25
  };
24
26
  });
25
27
  // 过滤掉所有不能满足填充的路径, 并且按照填充参数个数排序,填充参数最多的优先依次递减排序
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibiz-template/runtime",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
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.2.4",
32
+ "@ibiz-template/core": "^0.2.6",
33
33
  "@ibiz/model-core": "^0.0.19",
34
34
  "@types/path-browserify": "^1.0.0",
35
35
  "@types/qs": "^6.9.8",
@@ -59,5 +59,5 @@
59
59
  "qx-util": "^0.4.8",
60
60
  "ramda": "^0.29.0"
61
61
  },
62
- "gitHead": "6aac74058a5bb708860cb9d40afe5640e53662e4"
62
+ "gitHead": "9e2ff8788567c10c7f048f95797e1a533b0027e8"
63
63
  }
@@ -126,12 +126,12 @@ export class BaseController<
126
126
  // 登记自身
127
127
  this.mountCounter.enroll(SELF_KEY);
128
128
  await this.onCreated();
129
+ this.state.isCreated = true;
129
130
  this.force(() => {
130
131
  this.mountSelf();
131
132
  });
132
- await this._evt.emit('onCreated', undefined);
133
- this.state.isCreated = true;
134
133
  ibiz.log.debug(`${this.constructor.name}:${this.name} onCreated`);
134
+ this._evt.emit('onCreated', undefined);
135
135
  }
136
136
 
137
137
  /**
@@ -178,9 +178,9 @@ export class BaseController<
178
178
  */
179
179
  protected async mounted(): Promise<void> {
180
180
  await this.onMounted();
181
- await this._evt.emit('onMounted', undefined);
182
181
  this.state.isMounted = true;
183
182
  ibiz.log.debug(`${this.constructor.name}:${this.name} onMounted`);
183
+ this._evt.emit('onMounted', undefined);
184
184
  }
185
185
 
186
186
  /**
@@ -200,9 +200,9 @@ export class BaseController<
200
200
  */
201
201
  async destroyed(): Promise<void> {
202
202
  await this.onDestroyed();
203
- await this._evt.emit('onDestroyed', undefined);
204
203
  this.state.isDestroyed = true;
205
204
  ibiz.log.debug(`${this.constructor.name}:${this.name} onDestroyed`);
205
+ await this._evt.emit('onDestroyed', undefined);
206
206
  this.evt.destroy();
207
207
  }
208
208
 
@@ -1,5 +1,10 @@
1
- import { IControl, IControlLogic, IViewLayoutPanel } from '@ibiz/model-core';
2
- import { NoticeError } from '@ibiz-template/core';
1
+ import {
2
+ IControl,
3
+ IControlLogic,
4
+ IMDControl,
5
+ IViewLayoutPanel,
6
+ } from '@ibiz/model-core';
7
+ import { IBizContext, IBizParams, NoticeError } from '@ibiz-template/core';
3
8
  import { isNil } from 'ramda';
4
9
  import { notNilEmpty } from 'qx-util';
5
10
  import { BaseController } from '..';
@@ -82,6 +87,8 @@ export class ControlController<
82
87
  */
83
88
  providers: { [key: string]: IProvider } = {};
84
89
 
90
+ declare params: IBizParams;
91
+
85
92
  /**
86
93
  * Creates an instance of ControlController.
87
94
  *
@@ -92,7 +99,12 @@ export class ControlController<
92
99
  * @param {IParams} [params={}]
93
100
  */
94
101
  constructor(model: T, context: IContext, params: IParams, ctx: CTX) {
95
- super(model, context, params, ctx);
102
+ super(
103
+ model,
104
+ IBizContext.create({}, context),
105
+ new IBizParams({}, params),
106
+ ctx,
107
+ );
96
108
  this.registerToCtx();
97
109
  const panelModel = ibiz.util.layoutPanel.get(
98
110
  `${model.controlType}_DEFAULT`,
@@ -100,6 +112,8 @@ export class ControlController<
100
112
  if (panelModel) {
101
113
  this.controlPanel = panelModel;
102
114
  }
115
+
116
+ this.updateContextParams({});
103
117
  }
104
118
 
105
119
  /**
@@ -170,6 +184,39 @@ export class ControlController<
170
184
  if (this.scheduler) {
171
185
  this.scheduler.destroy();
172
186
  }
187
+ this.params.destroy();
188
+ }
189
+
190
+ /**
191
+ * 处理上下文和导航参数相关的,如自定义导航参数的处理
192
+ *
193
+ * @author lxm
194
+ * @date 2022-09-08 15:09:47
195
+ * @protected
196
+ */
197
+ updateContextParams(opts: { context?: IContext; params?: IParams }): void {
198
+ // 不改变引用的情况下,重置控制器里的上下文和视图参数。
199
+ if (opts.context) {
200
+ this.context.reset({}, opts.context);
201
+ }
202
+ if (opts.params) {
203
+ this.params.reset({}, opts.params);
204
+ }
205
+
206
+ const { controlNavContexts, controlNavParams } = this.model as IMDControl;
207
+ // 处理自定义导航上下文
208
+ let context = {};
209
+ if (notNilEmpty(controlNavContexts)) {
210
+ context = convertNavData(controlNavContexts!, this.params, this.context);
211
+ }
212
+ Object.assign(this.context, context);
213
+
214
+ // 处理自定义视图参数
215
+ let params = {};
216
+ if (notNilEmpty(controlNavParams)) {
217
+ params = convertNavData(controlNavParams!, this.params, this.context);
218
+ }
219
+ Object.assign(this.params, params);
173
220
  }
174
221
 
175
222
  /**
@@ -3,6 +3,7 @@ import {
3
3
  IDBContainerPortletPart,
4
4
  IDBPortletPart,
5
5
  } from '@ibiz/model-core';
6
+ import { ControlType } from '../../../constant';
6
7
  import {
7
8
  IDashboardState,
8
9
  IDashboardEvent,
@@ -83,8 +84,21 @@ export class DashboardController
83
84
  if (!portletModels?.length) {
84
85
  return;
85
86
  }
87
+ // 这块只初始化子门户部件,忽略子门户部件里面嵌入的部件
88
+ const ignorePortletTypes: string[] = [
89
+ ControlType.CHART,
90
+ ControlType.APP_MENU,
91
+ ControlType.TOOLBAR,
92
+ ControlType.LIST,
93
+ ];
86
94
  await Promise.all(
87
95
  portletModels.map(async portlet => {
96
+ if (
97
+ portlet.controlType &&
98
+ ignorePortletTypes.includes(portlet.controlType)
99
+ ) {
100
+ return;
101
+ }
88
102
  const provider = await getPortletProvider(portlet);
89
103
  if (provider) {
90
104
  this.providers[portlet.id!] = provider;
@@ -0,0 +1,4 @@
1
+ import { IDBToolbarPortlet } from '@ibiz/model-core';
2
+ import { PortletPartController } from '../portlet-part/portlet-part.controller';
3
+
4
+ export class ActionBarPortletController extends PortletPartController<IDBToolbarPortlet> {}
@@ -0,0 +1 @@
1
+ export * from './actionbar-portlet.controller';
@@ -0,0 +1,4 @@
1
+ import { IDBChartPortlet } from '@ibiz/model-core';
2
+ import { PortletPartController } from '../portlet-part/portlet-part.controller';
3
+
4
+ export class ChartPortletController extends PortletPartController<IDBChartPortlet> {}
@@ -0,0 +1 @@
1
+ export * from './chart-portlet.controller';
@@ -0,0 +1,4 @@
1
+ import { IDBHtmlPortletPart } from '@ibiz/model-core';
2
+ import { PortletPartController } from '../portlet-part/portlet-part.controller';
3
+
4
+ export class HtmlPortletController extends PortletPartController<IDBHtmlPortletPart> {}
@@ -0,0 +1 @@
1
+ export * from './html-portlet.controller';
@@ -2,3 +2,8 @@ export * from './portlet-part';
2
2
  export * from './container-portlet';
3
3
  export * from './view-portlet';
4
4
  export * from './menu-portlet';
5
+ export * from './chart-portlet';
6
+ export * from './actionbar-portlet';
7
+ export * from './html-portlet';
8
+ export * from './list-portlet';
9
+ export * from './rawitem-portlet';
@@ -0,0 +1 @@
1
+ export * from './list-portlet.controller';
@@ -0,0 +1,4 @@
1
+ import { IDBListPortletPart } from '@ibiz/model-core';
2
+ import { PortletPartController } from '../portlet-part/portlet-part.controller';
3
+
4
+ export class ListPortletController extends PortletPartController<IDBListPortletPart> {}
@@ -0,0 +1 @@
1
+ export * from './rawitem-portlet.controller';
@@ -0,0 +1,4 @@
1
+ import { IDBRawItemPortletPart } from '@ibiz/model-core';
2
+ import { PortletPartController } from '../portlet-part/portlet-part.controller';
3
+
4
+ export class RawItemPortletController extends PortletPartController<IDBRawItemPortletPart> {}
@@ -7,8 +7,8 @@ import {
7
7
  import { calcLayoutHeightWidth, calcDynaClass } from '../../../../../model';
8
8
  import { verifyFormGroupLogic } from '../../../../../utils';
9
9
  import { FormNotifyState } from '../../../../constant';
10
- import { FormController } from '../../form/form.controller';
11
10
  import { FormDetailState } from './form-detail.state';
11
+ import { FormController } from '../../form';
12
12
 
13
13
  export class FormDetailController<T extends IDEFormDetail = IDEFormDetail>
14
14
  implements IFormDetailController
@@ -45,7 +45,7 @@ export class FormDetailController<T extends IDEFormDetail = IDEFormDetail>
45
45
  *
46
46
  * @author lxm
47
47
  * @date 2022-08-24 22:08:59
48
- * @type {FormController}
48
+ * @type {IFormDetailContainerController}
49
49
  */
50
50
  readonly parent?: IFormDetailContainerController;
51
51
 
@@ -114,13 +114,20 @@ export class FormMDCtrlContentTypeController {
114
114
  const name =
115
115
  this.model.appDEFieldId || this.model.fieldName || this.model.id;
116
116
  if (name) {
117
+ const data = this.parent.data[name];
117
118
  if (
118
119
  this.model.contentType === 'REPEATER' &&
119
120
  this.model.detailStyle === 'STYLE3'
120
121
  ) {
121
- this.parent.state.contentCtrlData = this.parent.data[name] || {};
122
+ if (Array.isArray(data)) {
123
+ this.parent.state.contentCtrlData = {};
124
+ } else {
125
+ this.parent.state.contentCtrlData = data || {};
126
+ }
127
+ } else if (!Array.isArray(data)) {
128
+ this.parent.state.contentCtrlData = [];
122
129
  } else {
123
- this.parent.state.contentCtrlData = this.parent.data[name] || [];
130
+ this.parent.state.contentCtrlData = data || [];
124
131
  }
125
132
  }
126
133
  }
@@ -9,6 +9,7 @@ import { FormMDCtrlRepeaterFormOneController } from './form-mdctrl-repeater/form
9
9
  import { FormMDCtrlRepeaterFormController } from './form-mdctrl-repeater/form-mdctrl-repeater-form/form-mdctrl-repeater-form.controller';
10
10
  import { FormMDCtrlRepeaterGridController } from './form-mdctrl-repeater/form-mdctrl-repeater-grid/form-mdctrl-repeater-grid.controller';
11
11
  import { FormMDCtrlState } from './form-mdctrl.state';
12
+ import { EditFormController } from '../../edit-form';
12
13
 
13
14
  /**
14
15
  * 表单多数据部件控制器
@@ -30,6 +31,8 @@ export class FormMDCtrlController extends FormDetailController<IDEFormMDCtrl> {
30
31
  */
31
32
  declare state: FormMDCtrlState;
32
33
 
34
+ declare form: EditFormController;
35
+
33
36
  /**
34
37
  * Creates an instance of FormMDCtrlController.
35
38
  *
@@ -101,6 +104,15 @@ export class FormMDCtrlController extends FormDetailController<IDEFormMDCtrl> {
101
104
  if (this.mdCtrlContentController) {
102
105
  await this.mdCtrlContentController.onInit();
103
106
  }
107
+ if (this.form.state.isLoaded) {
108
+ this.mdCtrlContentController.initData();
109
+ }
110
+ this.form.evt.on('onLoadDraftSuccess', () => {
111
+ this.mdCtrlContentController.initData();
112
+ });
113
+ this.form.evt.on('onLoadSuccess', () => {
114
+ this.mdCtrlContentController.initData();
115
+ });
104
116
  }
105
117
 
106
118
  /**
@@ -118,17 +130,6 @@ export class FormMDCtrlController extends FormDetailController<IDEFormMDCtrl> {
118
130
  }
119
131
  }
120
132
 
121
- /**
122
- * 加载数据,要在表单加载完成之后再去加载
123
- *
124
- * @author zk
125
- * @date 2023-07-28 11:07:09
126
- * @memberof FormMDCtrlController
127
- */
128
- async loadData(): Promise<void> {
129
- await this.mdCtrlContentController.initData();
130
- }
131
-
132
133
  /**
133
134
  * 表单校验,通知子表单进行校验
134
135
  *
@@ -25,6 +25,7 @@ import {
25
25
  IGridColumnProvider,
26
26
  CodeListItem,
27
27
  MDCtrlLoadParams,
28
+ IGridRowState,
28
29
  } from '../../../../interface';
29
30
  import { calcDeCodeNameById } from '../../../../model';
30
31
  import { getGridColumnProvider } from '../../../../register';
@@ -393,9 +394,7 @@ export class GridController
393
394
  afterRemove(data: IData): void {
394
395
  super.afterRemove(data);
395
396
  // 删除this.state.rows里的表格行数据
396
- const index = this.state.rows.findIndex(
397
- item => item.data.srfkey === data.srfkey,
398
- );
397
+ const index = this.findRowStateIndex(data);
399
398
  this.state.rows.splice(index, 1);
400
399
 
401
400
  // 删除分组里的那条数据
@@ -419,18 +418,21 @@ export class GridController
419
418
  */
420
419
  async newRow(): Promise<void> {
421
420
  const { enableRowEdit, enableRowNew } = this.model;
421
+ const { editShowMode } = ibiz.config.grid;
422
422
  if (
423
423
  !enableRowEdit ||
424
424
  !enableRowNew ||
425
- ibiz.config.grid.editShowMode !== 'row'
425
+ !['row', 'all'].includes(editShowMode)
426
426
  ) {
427
427
  ibiz.log.error('不支持新建行');
428
428
  return;
429
429
  }
430
430
 
431
- const editingRow = this.state.rows.find(item => item.showRowEdit);
432
- if (editingRow) {
433
- throw new RuntimeError('请先完成当前行编辑中的行的操作');
431
+ if (editShowMode === 'row') {
432
+ const editingRow = this.state.rows.find(item => item.showRowEdit);
433
+ if (editingRow) {
434
+ throw new RuntimeError('请先完成当前行编辑中的行的操作');
435
+ }
434
436
  }
435
437
 
436
438
  const queryParams = { ...this.params };
@@ -456,7 +458,11 @@ export class GridController
456
458
  const newRow = new GridRowState(draftData, this);
457
459
  this.state.rows.unshift(newRow);
458
460
  this.gridStateNotify(newRow, GridNotifyState.DRAFT);
459
- this.switchRowEdit(this.state.rows[0], true);
461
+
462
+ if (editShowMode === 'row') {
463
+ this.switchRowEdit(this.state.rows[0], true);
464
+ }
465
+
460
466
  this.actionNotification('GETDRAFTSUCCESS', { data: draftData });
461
467
  }
462
468
 
@@ -472,9 +478,10 @@ export class GridController
472
478
  if (this.state.isSimple) {
473
479
  return;
474
480
  }
475
- const rowState = this.state.rows.find(
476
- item => item.data.srfkey === data.srfkey,
477
- );
481
+
482
+ const isCreate = data.srfuf === Srfuf.CREATE;
483
+
484
+ const rowState = this.findRowState(data);
478
485
  if (!rowState) {
479
486
  throw new RuntimeError('行数据不存在');
480
487
  }
@@ -495,7 +502,6 @@ export class GridController
495
502
  }
496
503
  await this.startLoading();
497
504
  let res;
498
- const isCreate = data.srfuf === Srfuf.CREATE;
499
505
  const deName = calcDeCodeNameById(this.model.appDataEntityId!);
500
506
  const tempContext = this.context.clone();
501
507
  tempContext[deName] = data.srfkey;
@@ -514,9 +520,7 @@ export class GridController
514
520
  await this.endLoading();
515
521
  }
516
522
  // 后续处理
517
- const index = this.state.items.findIndex(
518
- item => item.srfkey === data.srfkey,
519
- );
523
+ const index = this.findRowStateIndex(data);
520
524
  this.state.items.splice(index, 1, res.data);
521
525
  rowState.data = res.data;
522
526
  rowState.modified = false;
@@ -1035,4 +1039,31 @@ export class GridController
1035
1039
  });
1036
1040
  return result;
1037
1041
  }
1042
+
1043
+ /**
1044
+ * 查找rowState
1045
+ * @author lxm
1046
+ * @date 2023-10-27 07:27:48
1047
+ * @param {IData} data
1048
+ * @return {*} {(IGridRowState)}
1049
+ */
1050
+ findRowStateIndex(data: IData): number {
1051
+ const isCreate = data.srfuf === Srfuf.CREATE;
1052
+ const compareKey = isCreate ? 'tempsrfkey' : 'srfkey';
1053
+ return this.state.rows.findIndex(
1054
+ item => item.data[compareKey] === data[compareKey],
1055
+ );
1056
+ }
1057
+
1058
+ /**
1059
+ * 查找rowState
1060
+ * @author lxm
1061
+ * @date 2023-10-27 07:27:48
1062
+ * @param {IData} data
1063
+ * @return {*} {(IGridRowState | undefined)}
1064
+ */
1065
+ findRowState(data: IData): IGridRowState | undefined {
1066
+ const index = this.findRowStateIndex(data);
1067
+ return index !== -1 ? this.state.rows[index] : undefined;
1068
+ }
1038
1069
  }
@@ -49,4 +49,13 @@ export interface IControlController<
49
49
  * @date 2022-09-19 14:09:09
50
50
  */
51
51
  endLoading(): Promise<void>;
52
+
53
+ /**
54
+ * 在不改变引用的前提下,更新上下文和导航参数
55
+ * 并处理如自定义导航参数的后续处理
56
+ * @author lxm
57
+ * @date 2023-10-27 01:47:59
58
+ * @param {{ context?: IContext; params?: IParams }} opts
59
+ */
60
+ updateContextParams(opts: { context?: IContext; params?: IParams }): void;
52
61
  }
@@ -1,7 +1,7 @@
1
1
  import { IAppDataEntity } from '@ibiz/model-core';
2
2
 
3
3
  // 匹配 ${} 中间的内容
4
- const reg = /(?<=\$\{)(.*?)(?=\})/g;
4
+ const reg = /\$\{(.*?)\}/g;
5
5
 
6
6
  /**
7
7
  * 获取匹配的资源路径
@@ -23,9 +23,11 @@ export function getMatchResPath(
23
23
  const pathItems = entity.requestPaths || [];
24
24
  // 获取所有的路径需要匹配的参数
25
25
  const items: { path: string; keys: string[] }[] = pathItems.map(str => {
26
+ const match = str.match(reg);
27
+ const keys = match?.map(item => item.substring(2, item.length - 1)) || [];
26
28
  return {
27
29
  path: str,
28
- keys: str.match(reg) || [],
30
+ keys,
29
31
  };
30
32
  });
31
33
  // 过滤掉所有不能满足填充的路径, 并且按照填充参数个数排序,填充参数最多的优先依次递减排序