@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
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { IEditor, ISearchBarFilter } from '@ibiz/model-core';
|
|
2
|
+
import { ValueOP } from '../../../constant';
|
|
3
|
+
import { SearchBarController } from './search-bar.controller';
|
|
4
|
+
import { ExcludeOPs } from './search-bar-filter.controller';
|
|
5
|
+
|
|
6
|
+
const appId = '';
|
|
7
|
+
|
|
8
|
+
/** 数据类型映射操作符号 */
|
|
9
|
+
const typeToOPs: {
|
|
10
|
+
[p: string]: ValueOP[];
|
|
11
|
+
} = {
|
|
12
|
+
string: [
|
|
13
|
+
ValueOP.EQ,
|
|
14
|
+
ValueOP.NOT_EQ,
|
|
15
|
+
ValueOP.IS_NULL,
|
|
16
|
+
ValueOP.IS_NOT_NULL,
|
|
17
|
+
ValueOP.USER_LIKE,
|
|
18
|
+
ValueOP.LIKE,
|
|
19
|
+
ValueOP.LIFT_LIKE,
|
|
20
|
+
ValueOP.RIGHT_LIKE,
|
|
21
|
+
],
|
|
22
|
+
number: [
|
|
23
|
+
ValueOP.EQ,
|
|
24
|
+
ValueOP.GT,
|
|
25
|
+
ValueOP.GT_AND_EQ,
|
|
26
|
+
ValueOP.LT,
|
|
27
|
+
ValueOP.LT_AND_EQ,
|
|
28
|
+
ValueOP.NOT_EQ,
|
|
29
|
+
ValueOP.IS_NULL,
|
|
30
|
+
ValueOP.IS_NOT_NULL,
|
|
31
|
+
ValueOP.IN,
|
|
32
|
+
ValueOP.NOT_IN,
|
|
33
|
+
],
|
|
34
|
+
date: [
|
|
35
|
+
ValueOP.EQ,
|
|
36
|
+
ValueOP.GT,
|
|
37
|
+
ValueOP.GT_AND_EQ,
|
|
38
|
+
ValueOP.LT,
|
|
39
|
+
ValueOP.LT_AND_EQ,
|
|
40
|
+
ValueOP.NOT_EQ,
|
|
41
|
+
ValueOP.IS_NULL,
|
|
42
|
+
ValueOP.IS_NOT_NULL,
|
|
43
|
+
ValueOP.IN,
|
|
44
|
+
ValueOP.NOT_IN,
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** 数据类型和操作符映射的编辑器模型 */
|
|
49
|
+
const EditorsMap: {
|
|
50
|
+
[p: string]: IEditor;
|
|
51
|
+
} = {};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* 初始化默认映射的编辑器模型
|
|
55
|
+
* @author lxm
|
|
56
|
+
* @date 2024-01-02 10:32:05
|
|
57
|
+
* @param {string} type
|
|
58
|
+
* @param {string} op
|
|
59
|
+
* @return {*} {IEditor}
|
|
60
|
+
*/
|
|
61
|
+
function initDefaultEditor(): void {
|
|
62
|
+
Object.keys(typeToOPs).forEach(type => {
|
|
63
|
+
const allowOPs = typeToOPs[type];
|
|
64
|
+
allowOPs.forEach(op => {
|
|
65
|
+
if (ExcludeOPs.includes(op)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const key = `${type}_${op}`;
|
|
70
|
+
if (EditorsMap[key]) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (type === 'date' && ![ValueOP.IN, ValueOP.NOT_IN].includes(op)) {
|
|
75
|
+
EditorsMap[key] = {
|
|
76
|
+
appId,
|
|
77
|
+
editorType: 'DATEPICKER',
|
|
78
|
+
id: key,
|
|
79
|
+
};
|
|
80
|
+
} else {
|
|
81
|
+
// 都可以给字符串类型
|
|
82
|
+
EditorsMap[key] = {
|
|
83
|
+
appId,
|
|
84
|
+
editorType: 'TEXTBOX',
|
|
85
|
+
id: key,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
initDefaultEditor();
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* 根据json模型计算出过滤项模型
|
|
96
|
+
* @author lxm
|
|
97
|
+
* @date 2024-01-02 10:27:40
|
|
98
|
+
* @export
|
|
99
|
+
* @param {IData} json
|
|
100
|
+
* @param {SearchBarController} c
|
|
101
|
+
* @return {*} {ISearchBarFilter[]}
|
|
102
|
+
*/
|
|
103
|
+
export function calcFilterModelBySchema(
|
|
104
|
+
json: IData,
|
|
105
|
+
c: SearchBarController,
|
|
106
|
+
): ISearchBarFilter[] {
|
|
107
|
+
if (!json.properties) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
const { properties } = json;
|
|
111
|
+
if (!(Object.keys(properties).length > 0)) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const addFields: {
|
|
116
|
+
key: string;
|
|
117
|
+
description: string;
|
|
118
|
+
type: string;
|
|
119
|
+
}[] = [];
|
|
120
|
+
|
|
121
|
+
Object.keys(properties).forEach((key: string) => {
|
|
122
|
+
let type: string;
|
|
123
|
+
|
|
124
|
+
switch (properties[key].type) {
|
|
125
|
+
case 'string':
|
|
126
|
+
type = 'string';
|
|
127
|
+
if (properties[key].format === 'date-time') {
|
|
128
|
+
type = 'date';
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
case 'integer':
|
|
132
|
+
case 'number':
|
|
133
|
+
type = 'number';
|
|
134
|
+
break;
|
|
135
|
+
default:
|
|
136
|
+
ibiz.log.error(`未支持的类型${properties[key].type}`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
addFields.push({
|
|
141
|
+
key,
|
|
142
|
+
description: properties[key].description,
|
|
143
|
+
type,
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// 属性codeName对应的属性id
|
|
148
|
+
const codeNameToId: { [p: string]: string } = {};
|
|
149
|
+
c.appDataEntity.appDEFields?.forEach(field => {
|
|
150
|
+
codeNameToId[field.codeName!.toLowerCase()] = field.id!;
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const addSearchBarFilters: ISearchBarFilter[] = [];
|
|
154
|
+
|
|
155
|
+
addFields.forEach(item => {
|
|
156
|
+
const ops = typeToOPs[item.type];
|
|
157
|
+
if (!ops) {
|
|
158
|
+
ibiz.log.error('未支持的类型', item.type);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
ops.forEach(op => {
|
|
162
|
+
const editorModel = EditorsMap[`${item.type}_${op}`];
|
|
163
|
+
addSearchBarFilters.push({
|
|
164
|
+
appId,
|
|
165
|
+
appDEFieldId: codeNameToId[item.key],
|
|
166
|
+
id: item.key,
|
|
167
|
+
caption: item.description,
|
|
168
|
+
defsearchMode: {
|
|
169
|
+
appId,
|
|
170
|
+
valueOP: op,
|
|
171
|
+
},
|
|
172
|
+
editor: editorModel,
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
return addSearchBarFilters;
|
|
178
|
+
}
|
|
@@ -8,6 +8,13 @@ import {
|
|
|
8
8
|
import { findFieldById } from '../../../model';
|
|
9
9
|
import { getEditorProvider } from '../../../register';
|
|
10
10
|
import { SearchBarController } from './search-bar.controller';
|
|
11
|
+
import { ValueOP } from '../../../constant';
|
|
12
|
+
|
|
13
|
+
/** 不需要编辑器的OP */
|
|
14
|
+
export const ExcludeOPs: string[] = [
|
|
15
|
+
ValueOP.IS_NULL,
|
|
16
|
+
ValueOP.IS_NOT_NULL,
|
|
17
|
+
] as const;
|
|
11
18
|
|
|
12
19
|
/**
|
|
13
20
|
* 搜索栏过滤项控制器
|
|
@@ -73,6 +80,14 @@ export class SearchBarFilterController implements IEditorContainerController {
|
|
|
73
80
|
*/
|
|
74
81
|
valueOP?: string;
|
|
75
82
|
|
|
83
|
+
/**
|
|
84
|
+
* 不需要编辑器
|
|
85
|
+
* @author lxm
|
|
86
|
+
* @date 2024-01-02 11:08:45
|
|
87
|
+
* @type {boolean}
|
|
88
|
+
*/
|
|
89
|
+
noEditor: boolean = false;
|
|
90
|
+
|
|
76
91
|
constructor(
|
|
77
92
|
public model: ISearchBarFilter,
|
|
78
93
|
public searchBar: SearchBarController,
|
|
@@ -88,6 +103,12 @@ export class SearchBarFilterController implements IEditorContainerController {
|
|
|
88
103
|
this.label = model.caption || field?.logicName || model.id!;
|
|
89
104
|
|
|
90
105
|
this.valueOP = model.defsearchMode?.valueOP;
|
|
106
|
+
|
|
107
|
+
// 有操作符的,如果是isnull,isnotnull这种,就是无编辑器
|
|
108
|
+
// 没有操作符的如果没有配置编辑器,就是无编辑器
|
|
109
|
+
this.noEditor = this.valueOP
|
|
110
|
+
? ExcludeOPs.includes(this.valueOP)
|
|
111
|
+
: !this.model.editor;
|
|
91
112
|
}
|
|
92
113
|
|
|
93
114
|
/**
|
|
@@ -97,16 +118,18 @@ export class SearchBarFilterController implements IEditorContainerController {
|
|
|
97
118
|
* @return {*} {Promise<void>}
|
|
98
119
|
*/
|
|
99
120
|
async init(): Promise<void> {
|
|
100
|
-
if (!this.
|
|
101
|
-
|
|
102
|
-
|
|
121
|
+
if (!this.noEditor) {
|
|
122
|
+
if (!this.model.editor) {
|
|
123
|
+
throw new RuntimeModelError(this.model, '缺少编辑器模型');
|
|
124
|
+
}
|
|
103
125
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
126
|
+
this.editorProvider = await getEditorProvider(this.model.editor);
|
|
127
|
+
if (this.editorProvider) {
|
|
128
|
+
this.editor = await this.editorProvider.createController(
|
|
129
|
+
this.model.editor,
|
|
130
|
+
this,
|
|
131
|
+
);
|
|
132
|
+
}
|
|
110
133
|
}
|
|
111
134
|
}
|
|
112
135
|
}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
mergeInLeft,
|
|
4
4
|
recursiveIterate,
|
|
5
5
|
} from '@ibiz-template/core';
|
|
6
|
-
import { IAppDataEntity, ISearchBar } from '@ibiz/model-core';
|
|
6
|
+
import { IAppDataEntity, ISearchBar, ISearchBarFilter } from '@ibiz/model-core';
|
|
7
7
|
import { isNil } from 'ramda';
|
|
8
8
|
import {
|
|
9
9
|
ISearchBarState,
|
|
@@ -17,6 +17,8 @@ import { convertNavData, ScriptFactory } from '../../../utils';
|
|
|
17
17
|
import { ControlController } from '../../common';
|
|
18
18
|
import { SearchBarFilterController } from './search-bar-filter.controller';
|
|
19
19
|
import { SearchBarService } from './search-bar.service';
|
|
20
|
+
import { getEntitySchema } from '../../utils';
|
|
21
|
+
import { calcFilterModelBySchema } from './entity-schema';
|
|
20
22
|
|
|
21
23
|
/**
|
|
22
24
|
* 搜索栏控制器
|
|
@@ -71,6 +73,22 @@ export class SearchBarController
|
|
|
71
73
|
*/
|
|
72
74
|
isBackendSearchGroup = this.model.searchBarStyle === 'SEARCHBAR2';
|
|
73
75
|
|
|
76
|
+
/**
|
|
77
|
+
* 启用自定义过滤项
|
|
78
|
+
* @author lxm
|
|
79
|
+
* @date 2023-12-29 04:15:34
|
|
80
|
+
* @type {boolean}
|
|
81
|
+
*/
|
|
82
|
+
enableFilter: boolean = this.model.enableFilter === true;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 最终使用的searchBarFilters
|
|
86
|
+
* @author lxm
|
|
87
|
+
* @date 2023-12-29 06:55:13
|
|
88
|
+
* @type {ISearchBarFilter[]}
|
|
89
|
+
*/
|
|
90
|
+
searchBarFilters!: ISearchBarFilter[];
|
|
91
|
+
|
|
74
92
|
/**
|
|
75
93
|
* 表格控制器
|
|
76
94
|
* @return {*}
|
|
@@ -93,16 +111,24 @@ export class SearchBarController
|
|
|
93
111
|
super.initState();
|
|
94
112
|
this.state.query = '';
|
|
95
113
|
this.state.selectedGroupItem = null;
|
|
114
|
+
this.state.searchBarGroups = [];
|
|
115
|
+
this.state.selectedSearchGroupItem = null;
|
|
116
|
+
this.initFilterState();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 初始化Filter相关的属性
|
|
121
|
+
* @author lxm
|
|
122
|
+
* @date 2023-12-29 04:18:02
|
|
123
|
+
* @protected
|
|
124
|
+
*/
|
|
125
|
+
protected initFilterState(): void {
|
|
126
|
+
this.resetFilter();
|
|
96
127
|
this.state.visible = !!(
|
|
97
128
|
this.model.enableQuickSearch ||
|
|
98
129
|
this.model.enableGroup ||
|
|
99
|
-
this.
|
|
130
|
+
this.enableFilter
|
|
100
131
|
);
|
|
101
|
-
if (this.model.enableFilter) {
|
|
102
|
-
this.resetFilter();
|
|
103
|
-
}
|
|
104
|
-
this.state.searchBarGroups = [];
|
|
105
|
-
this.state.selectedSearchGroupItem = null;
|
|
106
132
|
}
|
|
107
133
|
|
|
108
134
|
protected async onCreated(): Promise<void> {
|
|
@@ -123,10 +149,44 @@ export class SearchBarController
|
|
|
123
149
|
await this.service.init(this.context);
|
|
124
150
|
}
|
|
125
151
|
|
|
152
|
+
await this.initByEntitySchema();
|
|
126
153
|
await this.initSearchBarFilters();
|
|
127
154
|
await this.initSearBarGroups();
|
|
128
155
|
}
|
|
129
156
|
|
|
157
|
+
/**
|
|
158
|
+
* 根据实体jsonschema初始化
|
|
159
|
+
* @author lxm
|
|
160
|
+
* @date 2023-12-29 04:21:31
|
|
161
|
+
* @return {*} {Promise<void>}
|
|
162
|
+
*/
|
|
163
|
+
async initByEntitySchema(): Promise<void> {
|
|
164
|
+
this.enableFilter = true;
|
|
165
|
+
const json = await getEntitySchema(this.appDataEntity.id!, this.context);
|
|
166
|
+
if (!json) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const addSearchBarFilters = calcFilterModelBySchema(json, this);
|
|
170
|
+
|
|
171
|
+
const mergeFilters: ISearchBarFilter[] = [];
|
|
172
|
+
this.model.searchBarFilters?.forEach(filter => {
|
|
173
|
+
const findindex = addSearchBarFilters.findIndex(
|
|
174
|
+
item =>
|
|
175
|
+
item.appDEFieldId === filter.appDEFieldId &&
|
|
176
|
+
(filter.defsearchMode?.valueOP
|
|
177
|
+
? item.defsearchMode!.valueOP === filter.defsearchMode.valueOP
|
|
178
|
+
: true),
|
|
179
|
+
);
|
|
180
|
+
if (findindex === -1) {
|
|
181
|
+
mergeFilters.push(filter);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
addSearchBarFilters.push(...mergeFilters);
|
|
186
|
+
|
|
187
|
+
this.searchBarFilters = addSearchBarFilters;
|
|
188
|
+
}
|
|
189
|
+
|
|
130
190
|
/**
|
|
131
191
|
* 计算快速搜索的占位
|
|
132
192
|
* @author lxm
|
|
@@ -233,8 +293,8 @@ export class SearchBarController
|
|
|
233
293
|
* @return {*} {Promise<void>}
|
|
234
294
|
*/
|
|
235
295
|
protected async initSearchBarFilters(): Promise<void> {
|
|
236
|
-
if (this.
|
|
237
|
-
this.
|
|
296
|
+
if (this.searchBarFilters?.length) {
|
|
297
|
+
this.searchBarFilters.forEach(item => {
|
|
238
298
|
const filterController = new SearchBarFilterController(item, this);
|
|
239
299
|
this.filterControllers.push(filterController);
|
|
240
300
|
});
|
|
@@ -1,6 +1,81 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IDEGridFieldColumn, IDETreeGrid } from '@ibiz/model-core';
|
|
2
|
+
import { RuntimeModelError } from '@ibiz-template/core';
|
|
3
|
+
import {
|
|
4
|
+
ITreeGridController,
|
|
5
|
+
ITreeGridEvent,
|
|
6
|
+
ITreeGridState,
|
|
7
|
+
} from '../../../interface';
|
|
2
8
|
import { GridController } from '../grid';
|
|
3
9
|
|
|
4
|
-
export class TreeGridController
|
|
5
|
-
|
|
6
|
-
|
|
10
|
+
export class TreeGridController<
|
|
11
|
+
T extends IDETreeGrid = IDETreeGrid,
|
|
12
|
+
S extends ITreeGridState = ITreeGridState,
|
|
13
|
+
E extends ITreeGridEvent = ITreeGridEvent,
|
|
14
|
+
>
|
|
15
|
+
extends GridController<T, S, E>
|
|
16
|
+
implements ITreeGridController<T, S, E>
|
|
17
|
+
{
|
|
18
|
+
/**
|
|
19
|
+
* 树表格值属性名称
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
treeGridValueField: string = '';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 树表格父属性名称
|
|
26
|
+
*
|
|
27
|
+
*/
|
|
28
|
+
treeGridParentField: string = '';
|
|
29
|
+
|
|
30
|
+
protected initState(): void {
|
|
31
|
+
super.initState();
|
|
32
|
+
this.state.showTreeGrid = true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 初始化方法
|
|
37
|
+
*
|
|
38
|
+
* @author lxm
|
|
39
|
+
* @date 2022-08-18 22:08:17
|
|
40
|
+
* @protected
|
|
41
|
+
* @returns {*} {Promise<void>}
|
|
42
|
+
*/
|
|
43
|
+
protected async onCreated(): Promise<void> {
|
|
44
|
+
await super.onCreated();
|
|
45
|
+
|
|
46
|
+
this.initTreeGridField();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 初始化树表格字段
|
|
51
|
+
* @return {*}
|
|
52
|
+
* @author: zhujiamin
|
|
53
|
+
*/
|
|
54
|
+
protected initTreeGridField(): void {
|
|
55
|
+
const treeGridParent: IDEGridFieldColumn | undefined =
|
|
56
|
+
this.model.degridColumns?.find((item: IDEGridFieldColumn) => {
|
|
57
|
+
return item.treeColumnMode === 4 || item.treeColumnMode === 12;
|
|
58
|
+
});
|
|
59
|
+
const treeGridValue: IDEGridFieldColumn | undefined =
|
|
60
|
+
this.model.degridColumns?.find((item: IDEGridFieldColumn) => {
|
|
61
|
+
return item.treeColumnMode === 2 || item.treeColumnMode === 3;
|
|
62
|
+
});
|
|
63
|
+
if (!treeGridParent) {
|
|
64
|
+
throw new RuntimeModelError(this.model, '树表格无值列模式');
|
|
65
|
+
}
|
|
66
|
+
if (!treeGridValue) {
|
|
67
|
+
throw new RuntimeModelError(this.model, '树表格无父值列模式');
|
|
68
|
+
}
|
|
69
|
+
this.treeGridValueField = treeGridValue.appDEFieldId!.toLowerCase();
|
|
70
|
+
this.treeGridParentField = treeGridParent.appDEFieldId!.toLowerCase();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 切换树表格显示
|
|
75
|
+
* @return {*}
|
|
76
|
+
* @author: zhujiamin
|
|
77
|
+
*/
|
|
78
|
+
switchTreeGridShow(): void {
|
|
79
|
+
this.state.showTreeGrid = !this.state.showTreeGrid;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
ITreeNodeData,
|
|
10
10
|
} from '../../../interface';
|
|
11
11
|
import { getTreeGridExColumnProvider } from '../../../register';
|
|
12
|
-
|
|
13
12
|
import { TreeGridExService } from './tree-grid-ex.service';
|
|
14
13
|
import { TreeController } from '../tree/tree.controller';
|
|
15
14
|
import {
|
|
@@ -103,14 +102,15 @@ export class TreeGridExController<
|
|
|
103
102
|
protected initState(): void {
|
|
104
103
|
super.initState();
|
|
105
104
|
this.state.columnStates = [];
|
|
105
|
+
this.state.rootNodes = [];
|
|
106
106
|
this.state.rows = {};
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
protected async onCreated(): Promise<void> {
|
|
110
110
|
await super.onCreated();
|
|
111
111
|
|
|
112
|
-
this.initColumnStates();
|
|
113
112
|
await this.initGridColumns();
|
|
113
|
+
this.initColumnStates();
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
protected async initService(): Promise<void> {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取实体的jsonschema
|
|
3
|
+
* @author lxm
|
|
4
|
+
* @date 2023-12-29 04:03:58
|
|
5
|
+
* @export
|
|
6
|
+
* @param {string} entityId
|
|
7
|
+
* @param {IContext} context
|
|
8
|
+
* @return {*} {Promise<IData>}
|
|
9
|
+
*/
|
|
10
|
+
export async function getEntitySchema(
|
|
11
|
+
entityId: string,
|
|
12
|
+
context: IContext,
|
|
13
|
+
): Promise<IData> {
|
|
14
|
+
const app = ibiz.hub.getApp(context.srfappid);
|
|
15
|
+
const entity = await ibiz.hub.getAppDataEntity(entityId, context.srfappid);
|
|
16
|
+
const url = `/jsonschema/${entity.name}`;
|
|
17
|
+
const res = await app.net.get(url);
|
|
18
|
+
return res.data;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './entity';
|
|
@@ -13,8 +13,11 @@ import { CodeListItem } from '../../../service';
|
|
|
13
13
|
* @interface IGridController
|
|
14
14
|
* @extends {IMDControlController}
|
|
15
15
|
*/
|
|
16
|
-
export interface IGridController
|
|
17
|
-
extends
|
|
16
|
+
export interface IGridController<
|
|
17
|
+
T extends IDEGrid = IDEGrid,
|
|
18
|
+
S extends IGridState = IGridState,
|
|
19
|
+
E extends IGridEvent = IGridEvent,
|
|
20
|
+
> extends IMDControlController<T, S, E> {
|
|
18
21
|
/**
|
|
19
22
|
* 新建行
|
|
20
23
|
*
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { IDETreeGrid } from '@ibiz/model-core';
|
|
1
2
|
import { IGridController } from './i-grid.controller';
|
|
3
|
+
import { ITreeGridState } from '../../state';
|
|
4
|
+
import { ITreeGridEvent } from '../../event';
|
|
2
5
|
|
|
3
6
|
/**
|
|
4
7
|
* 树表格部件控制器
|
|
@@ -9,4 +12,16 @@ import { IGridController } from './i-grid.controller';
|
|
|
9
12
|
* @interface ITreeGridController
|
|
10
13
|
* @extends {IMDControlController<IDETreeGrid, ITreeGridState, ITreeGridEvent>}
|
|
11
14
|
*/
|
|
12
|
-
export interface ITreeGridController
|
|
15
|
+
export interface ITreeGridController<
|
|
16
|
+
T extends IDETreeGrid = IDETreeGrid,
|
|
17
|
+
S extends ITreeGridState = ITreeGridState,
|
|
18
|
+
E extends ITreeGridEvent = ITreeGridEvent,
|
|
19
|
+
> extends IGridController<T, S, E> {
|
|
20
|
+
/**
|
|
21
|
+
* 切换树表格显示
|
|
22
|
+
* @return {*}
|
|
23
|
+
* @author: zhujiamin
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
switchTreeGridShow(): void;
|
|
27
|
+
}
|
|
@@ -9,4 +9,10 @@ import { IGridState } from './i-grid.state';
|
|
|
9
9
|
* @interface ITreeGridState
|
|
10
10
|
* @extends {IMDControlState}
|
|
11
11
|
*/
|
|
12
|
-
export interface ITreeGridState extends IGridState {
|
|
12
|
+
export interface ITreeGridState extends IGridState {
|
|
13
|
+
/**
|
|
14
|
+
* 树表格是否显示树形结构(默认为true)
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
showTreeGrid: boolean;
|
|
18
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { IAppMenuItem } from '@ibiz/model-core';
|
|
2
|
+
import { IAppMenuController } from '../controller';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 应用菜单项适配器的接口
|
|
6
|
+
*
|
|
7
|
+
* @author lxm
|
|
8
|
+
* @date 2022-10-25 13:10:45
|
|
9
|
+
* @export
|
|
10
|
+
* @interface IAppMenuItemProvider
|
|
11
|
+
*/
|
|
12
|
+
export interface IAppMenuItemProvider {
|
|
13
|
+
/**
|
|
14
|
+
* 执行界面行为
|
|
15
|
+
* @author lxm
|
|
16
|
+
* @date 2023-05-08 09:55:06
|
|
17
|
+
* @param {IAppDEUIAction} action
|
|
18
|
+
* @param {IUILogicParams} params
|
|
19
|
+
* @return {*} {Promise<IUIActionResult>}
|
|
20
|
+
*/
|
|
21
|
+
onClick?(
|
|
22
|
+
menuItem: IAppMenuItem,
|
|
23
|
+
event: MouseEvent,
|
|
24
|
+
AppMenuController: IAppMenuController,
|
|
25
|
+
): Promise<void>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 绘制菜单项文本
|
|
29
|
+
* @author lxm
|
|
30
|
+
* @date 2023-12-29 03:05:22
|
|
31
|
+
* @param {IAppMenuItem} menuItem
|
|
32
|
+
* @param {IAppMenuController} AppMenuController
|
|
33
|
+
* @return {*} {*}
|
|
34
|
+
*/
|
|
35
|
+
renderText?(
|
|
36
|
+
menuItem: IAppMenuItem,
|
|
37
|
+
AppMenuController: IAppMenuController,
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
|
+
): any;
|
|
40
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { HistoryList } from '@ibiz-template/core';
|
|
2
1
|
import { Srfuf } from '../../../service';
|
|
3
2
|
|
|
4
3
|
/**
|
|
@@ -94,15 +93,6 @@ export interface IDataEntity {
|
|
|
94
93
|
*/
|
|
95
94
|
srfuf: Srfuf;
|
|
96
95
|
|
|
97
|
-
/**
|
|
98
|
-
* 数据历史记录,可用于撤销操作
|
|
99
|
-
*
|
|
100
|
-
* @author chitanda
|
|
101
|
-
* @date 2023-12-28 21:12:08
|
|
102
|
-
* @type {HistoryList<IData>}
|
|
103
|
-
*/
|
|
104
|
-
readonly history: HistoryList<IData>;
|
|
105
|
-
|
|
106
96
|
/**
|
|
107
97
|
* 提供当前数据克隆操作,返回克隆后的当前实例
|
|
108
98
|
*
|
|
@@ -115,19 +105,10 @@ export interface IDataEntity {
|
|
|
115
105
|
/**
|
|
116
106
|
* 将指定的数据对象或者实体数据对象的属性值赋值到当前实体
|
|
117
107
|
*
|
|
118
|
-
* @description 该方法会先创建一次历史记录,销毁此对象时必须调用 history.destroy() 方法
|
|
119
108
|
* @author chitanda
|
|
120
109
|
* @date 2023-05-16 17:05:26
|
|
121
110
|
* @param {(IData | IDataEntity)} data
|
|
122
111
|
* @return {*} {IDataEntity}
|
|
123
112
|
*/
|
|
124
113
|
assign(data: IData | IDataEntity): IDataEntity;
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* 销毁当前实体对象
|
|
128
|
-
*
|
|
129
|
-
* @author chitanda
|
|
130
|
-
* @date 2023-12-28 21:12:40
|
|
131
|
-
*/
|
|
132
|
-
destroy(): void;
|
|
133
114
|
}
|