@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.
- package/dist/index.esm.js +664 -170
- package/dist/index.system.min.js +1 -1
- package/out/app-hub.d.ts +1 -0
- package/out/app-hub.d.ts.map +1 -1
- package/out/app-hub.js +5 -0
- package/out/controller/control/app-menu/app-menu.controller.d.ts +34 -1
- package/out/controller/control/app-menu/app-menu.controller.d.ts.map +1 -1
- package/out/controller/control/app-menu/app-menu.controller.js +47 -5
- package/out/controller/control/gantt/gantt.controller.d.ts.map +1 -1
- package/out/controller/control/gantt/gantt.controller.js +3 -3
- package/out/controller/control/grid/grid/entity-schema.d.ts +16 -0
- package/out/controller/control/grid/grid/entity-schema.d.ts.map +1 -0
- package/out/controller/control/grid/grid/entity-schema.js +81 -0
- package/out/controller/control/grid/grid/grid.controller.d.ts +17 -1
- package/out/controller/control/grid/grid/grid.controller.d.ts.map +1 -1
- package/out/controller/control/grid/grid/grid.controller.js +51 -6
- package/out/controller/control/grid/grid/grid.service.js +1 -1
- package/out/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.js +1 -1
- package/out/controller/control/search-bar/entity-schema.d.ts +13 -0
- package/out/controller/control/search-bar/entity-schema.d.ts.map +1 -0
- package/out/controller/control/search-bar/entity-schema.js +151 -0
- package/out/controller/control/search-bar/search-bar-filter.controller.d.ts +9 -0
- package/out/controller/control/search-bar/search-bar-filter.controller.d.ts.map +1 -1
- package/out/controller/control/search-bar/search-bar-filter.controller.js +26 -6
- package/out/controller/control/search-bar/search-bar.controller.d.ts +29 -1
- package/out/controller/control/search-bar/search-bar.controller.d.ts.map +1 -1
- package/out/controller/control/search-bar/search-bar.controller.js +55 -8
- package/out/controller/control/tree/tree.controller.js +1 -1
- package/out/controller/control/tree-grid/tree-grid.controller.d.ts +35 -2
- package/out/controller/control/tree-grid/tree-grid.controller.d.ts.map +1 -1
- package/out/controller/control/tree-grid/tree-grid.controller.js +60 -0
- package/out/controller/control/tree-grid-ex/tree-grid-ex.controller.d.ts.map +1 -1
- package/out/controller/control/tree-grid-ex/tree-grid-ex.controller.js +2 -1
- package/out/controller/utils/index.d.ts +1 -0
- package/out/controller/utils/index.d.ts.map +1 -1
- package/out/controller/utils/index.js +1 -0
- package/out/controller/utils/jsonschema/entity.d.ts +11 -0
- package/out/controller/utils/jsonschema/entity.d.ts.map +1 -0
- package/out/controller/utils/jsonschema/entity.js +16 -0
- package/out/controller/utils/jsonschema/index.d.ts +2 -0
- package/out/controller/utils/jsonschema/index.d.ts.map +1 -0
- package/out/controller/utils/jsonschema/index.js +1 -0
- package/out/interface/common/i-app-hub-service/i-app-hub-service.d.ts +6 -0
- package/out/interface/common/i-app-hub-service/i-app-hub-service.d.ts.map +1 -1
- package/out/interface/controller/controller/control/i-grid.controller.d.ts +1 -1
- package/out/interface/controller/controller/control/i-grid.controller.d.ts.map +1 -1
- package/out/interface/controller/controller/control/i-tree-grid.controller.d.ts +11 -1
- package/out/interface/controller/controller/control/i-tree-grid.controller.d.ts.map +1 -1
- package/out/interface/controller/state/control/i-tree-grid.state.d.ts +5 -0
- package/out/interface/controller/state/control/i-tree-grid.state.d.ts.map +1 -1
- package/out/interface/provider/i-app-menu-item.provider.d.ts +31 -0
- package/out/interface/provider/i-app-menu-item.provider.d.ts.map +1 -0
- package/out/interface/provider/i-app-menu-item.provider.js +1 -0
- package/out/interface/provider/index.d.ts +1 -0
- package/out/interface/provider/index.d.ts.map +1 -1
- package/out/interface/service/i-data-entity/i-data-entity.d.ts +0 -17
- package/out/interface/service/i-data-entity/i-data-entity.d.ts.map +1 -1
- package/out/interface/service/service/i-auth.service.d.ts +23 -0
- package/out/interface/service/service/i-auth.service.d.ts.map +1 -1
- package/out/interface/service/service/index.d.ts +1 -1
- package/out/interface/service/service/index.d.ts.map +1 -1
- package/out/register/helper/app-menu-item-register.d.ts +25 -0
- package/out/register/helper/app-menu-item-register.d.ts.map +1 -0
- package/out/register/helper/app-menu-item-register.js +52 -0
- package/out/register/helper/index.d.ts +1 -0
- package/out/register/helper/index.d.ts.map +1 -1
- package/out/register/helper/index.js +1 -0
- package/out/service/app-data-entity/app-data-entity.d.ts +0 -9
- package/out/service/app-data-entity/app-data-entity.d.ts.map +1 -1
- package/out/service/app-data-entity/app-data-entity.js +11 -41
- package/out/service/de-service-util.js +1 -1
- package/out/service/service/auth/v7-auth.service.d.ts +3 -1
- package/out/service/service/auth/v7-auth.service.d.ts.map +1 -1
- package/out/service/service/auth/v7-auth.service.js +26 -3
- package/out/service/service/entity/method/de-action.d.ts +11 -0
- package/out/service/service/entity/method/de-action.d.ts.map +1 -1
- package/out/service/service/entity/method/de-action.js +34 -6
- package/out/service/utils/de-cache/de-cache.js +3 -3
- package/out/utils/open-redirect-view/open-redirect-view.d.ts +17 -4
- package/out/utils/open-redirect-view/open-redirect-view.d.ts.map +1 -1
- package/out/utils/open-redirect-view/open-redirect-view.js +20 -4
- package/package.json +3 -3
- package/src/app-hub.ts +6 -0
- package/src/controller/control/app-menu/app-menu.controller.ts +64 -6
- package/src/controller/control/gantt/gantt.controller.ts +3 -3
- package/src/controller/control/grid/grid/entity-schema.ts +105 -0
- package/src/controller/control/grid/grid/grid.controller.ts +74 -9
- package/src/controller/control/grid/grid/grid.service.ts +1 -1
- package/src/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.ts +1 -1
- package/src/controller/control/search-bar/entity-schema.ts +178 -0
- package/src/controller/control/search-bar/search-bar-filter.controller.ts +32 -9
- package/src/controller/control/search-bar/search-bar.controller.ts +69 -9
- package/src/controller/control/tree/tree.controller.ts +1 -1
- package/src/controller/control/tree-grid/tree-grid.controller.ts +79 -4
- package/src/controller/control/tree-grid-ex/tree-grid-ex.controller.ts +2 -2
- package/src/controller/utils/index.ts +1 -0
- package/src/controller/utils/jsonschema/entity.ts +19 -0
- package/src/controller/utils/jsonschema/index.ts +1 -0
- package/src/interface/common/i-app-hub-service/i-app-hub-service.ts +7 -0
- package/src/interface/controller/controller/control/i-grid.controller.ts +5 -2
- package/src/interface/controller/controller/control/i-tree-grid.controller.ts +16 -1
- package/src/interface/controller/state/control/i-tree-grid.state.ts +7 -1
- package/src/interface/provider/i-app-menu-item.provider.ts +40 -0
- package/src/interface/provider/index.ts +1 -0
- package/src/interface/service/i-data-entity/i-data-entity.ts +0 -19
- package/src/interface/service/service/i-auth.service.ts +26 -0
- package/src/interface/service/service/index.ts +1 -1
- package/src/register/helper/app-menu-item-register.ts +65 -0
- package/src/register/helper/index.ts +1 -0
- package/src/service/app-data-entity/app-data-entity.ts +11 -46
- package/src/service/de-service-util.ts +1 -1
- package/src/service/service/auth/v7-auth.service.ts +31 -2
- package/src/service/service/entity/method/de-action.ts +47 -6
- package/src/service/utils/de-cache/de-cache.ts +3 -3
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
27
|
-
* @date
|
|
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
|
|
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
|
|
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
|
|
27
|
-
* @date
|
|
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
|
|
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
|
|
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
|
|
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": "
|
|
62
|
+
"gitHead": "84126d4a93b6641962d688ef6d92fce3bea7c2d1"
|
|
63
63
|
}
|
package/src/app-hub.ts
CHANGED
|
@@ -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
|
-
* @
|
|
143
|
-
* @
|
|
144
|
-
* @
|
|
190
|
+
* @author lxm
|
|
191
|
+
* @date 2023-12-29 02:42:39
|
|
192
|
+
* @protected
|
|
145
193
|
*/
|
|
146
|
-
|
|
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
|
-
|
|
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
|
|
126
|
+
const deName = calcDeCodeNameById(nodeModel.appDataEntityId!);
|
|
127
127
|
const tempContext = Object.assign(this.context.clone(), {
|
|
128
|
-
[
|
|
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 {
|
|
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
|
-
|
|
57
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
34
|
+
item => item.id === column.dataItemName,
|
|
35
35
|
);
|
|
36
36
|
if (dataItem) {
|
|
37
37
|
mapField = new UIMapField(uiKey, deFieldKey, {
|
package/src/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.ts
CHANGED
|
@@ -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!;
|