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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/index.esm.js +664 -170
  2. package/dist/index.system.min.js +1 -1
  3. package/out/app-hub.d.ts +1 -0
  4. package/out/app-hub.d.ts.map +1 -1
  5. package/out/app-hub.js +5 -0
  6. package/out/controller/control/app-menu/app-menu.controller.d.ts +34 -1
  7. package/out/controller/control/app-menu/app-menu.controller.d.ts.map +1 -1
  8. package/out/controller/control/app-menu/app-menu.controller.js +47 -5
  9. package/out/controller/control/gantt/gantt.controller.d.ts.map +1 -1
  10. package/out/controller/control/gantt/gantt.controller.js +3 -3
  11. package/out/controller/control/grid/grid/entity-schema.d.ts +16 -0
  12. package/out/controller/control/grid/grid/entity-schema.d.ts.map +1 -0
  13. package/out/controller/control/grid/grid/entity-schema.js +81 -0
  14. package/out/controller/control/grid/grid/grid.controller.d.ts +17 -1
  15. package/out/controller/control/grid/grid/grid.controller.d.ts.map +1 -1
  16. package/out/controller/control/grid/grid/grid.controller.js +51 -6
  17. package/out/controller/control/grid/grid/grid.service.js +1 -1
  18. package/out/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.js +1 -1
  19. package/out/controller/control/search-bar/entity-schema.d.ts +13 -0
  20. package/out/controller/control/search-bar/entity-schema.d.ts.map +1 -0
  21. package/out/controller/control/search-bar/entity-schema.js +151 -0
  22. package/out/controller/control/search-bar/search-bar-filter.controller.d.ts +9 -0
  23. package/out/controller/control/search-bar/search-bar-filter.controller.d.ts.map +1 -1
  24. package/out/controller/control/search-bar/search-bar-filter.controller.js +26 -6
  25. package/out/controller/control/search-bar/search-bar.controller.d.ts +29 -1
  26. package/out/controller/control/search-bar/search-bar.controller.d.ts.map +1 -1
  27. package/out/controller/control/search-bar/search-bar.controller.js +55 -8
  28. package/out/controller/control/tree/tree.controller.js +1 -1
  29. package/out/controller/control/tree-grid/tree-grid.controller.d.ts +35 -2
  30. package/out/controller/control/tree-grid/tree-grid.controller.d.ts.map +1 -1
  31. package/out/controller/control/tree-grid/tree-grid.controller.js +60 -0
  32. package/out/controller/control/tree-grid-ex/tree-grid-ex.controller.d.ts.map +1 -1
  33. package/out/controller/control/tree-grid-ex/tree-grid-ex.controller.js +2 -1
  34. package/out/controller/utils/index.d.ts +1 -0
  35. package/out/controller/utils/index.d.ts.map +1 -1
  36. package/out/controller/utils/index.js +1 -0
  37. package/out/controller/utils/jsonschema/entity.d.ts +11 -0
  38. package/out/controller/utils/jsonschema/entity.d.ts.map +1 -0
  39. package/out/controller/utils/jsonschema/entity.js +16 -0
  40. package/out/controller/utils/jsonschema/index.d.ts +2 -0
  41. package/out/controller/utils/jsonschema/index.d.ts.map +1 -0
  42. package/out/controller/utils/jsonschema/index.js +1 -0
  43. package/out/interface/common/i-app-hub-service/i-app-hub-service.d.ts +6 -0
  44. package/out/interface/common/i-app-hub-service/i-app-hub-service.d.ts.map +1 -1
  45. package/out/interface/controller/controller/control/i-grid.controller.d.ts +1 -1
  46. package/out/interface/controller/controller/control/i-grid.controller.d.ts.map +1 -1
  47. package/out/interface/controller/controller/control/i-tree-grid.controller.d.ts +11 -1
  48. package/out/interface/controller/controller/control/i-tree-grid.controller.d.ts.map +1 -1
  49. package/out/interface/controller/state/control/i-tree-grid.state.d.ts +5 -0
  50. package/out/interface/controller/state/control/i-tree-grid.state.d.ts.map +1 -1
  51. package/out/interface/provider/i-app-menu-item.provider.d.ts +31 -0
  52. package/out/interface/provider/i-app-menu-item.provider.d.ts.map +1 -0
  53. package/out/interface/provider/i-app-menu-item.provider.js +1 -0
  54. package/out/interface/provider/index.d.ts +1 -0
  55. package/out/interface/provider/index.d.ts.map +1 -1
  56. package/out/interface/service/i-data-entity/i-data-entity.d.ts +0 -17
  57. package/out/interface/service/i-data-entity/i-data-entity.d.ts.map +1 -1
  58. package/out/interface/service/service/i-auth.service.d.ts +23 -0
  59. package/out/interface/service/service/i-auth.service.d.ts.map +1 -1
  60. package/out/interface/service/service/index.d.ts +1 -1
  61. package/out/interface/service/service/index.d.ts.map +1 -1
  62. package/out/register/helper/app-menu-item-register.d.ts +25 -0
  63. package/out/register/helper/app-menu-item-register.d.ts.map +1 -0
  64. package/out/register/helper/app-menu-item-register.js +52 -0
  65. package/out/register/helper/index.d.ts +1 -0
  66. package/out/register/helper/index.d.ts.map +1 -1
  67. package/out/register/helper/index.js +1 -0
  68. package/out/service/app-data-entity/app-data-entity.d.ts +0 -9
  69. package/out/service/app-data-entity/app-data-entity.d.ts.map +1 -1
  70. package/out/service/app-data-entity/app-data-entity.js +11 -41
  71. package/out/service/de-service-util.js +1 -1
  72. package/out/service/service/auth/v7-auth.service.d.ts +3 -1
  73. package/out/service/service/auth/v7-auth.service.d.ts.map +1 -1
  74. package/out/service/service/auth/v7-auth.service.js +26 -3
  75. package/out/service/service/entity/method/de-action.d.ts +11 -0
  76. package/out/service/service/entity/method/de-action.d.ts.map +1 -1
  77. package/out/service/service/entity/method/de-action.js +34 -6
  78. package/out/service/utils/de-cache/de-cache.js +3 -3
  79. package/out/utils/open-redirect-view/open-redirect-view.d.ts +17 -4
  80. package/out/utils/open-redirect-view/open-redirect-view.d.ts.map +1 -1
  81. package/out/utils/open-redirect-view/open-redirect-view.js +20 -4
  82. package/package.json +3 -3
  83. package/src/app-hub.ts +6 -0
  84. package/src/controller/control/app-menu/app-menu.controller.ts +64 -6
  85. package/src/controller/control/gantt/gantt.controller.ts +3 -3
  86. package/src/controller/control/grid/grid/entity-schema.ts +105 -0
  87. package/src/controller/control/grid/grid/grid.controller.ts +74 -9
  88. package/src/controller/control/grid/grid/grid.service.ts +1 -1
  89. package/src/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.ts +1 -1
  90. package/src/controller/control/search-bar/entity-schema.ts +178 -0
  91. package/src/controller/control/search-bar/search-bar-filter.controller.ts +32 -9
  92. package/src/controller/control/search-bar/search-bar.controller.ts +69 -9
  93. package/src/controller/control/tree/tree.controller.ts +1 -1
  94. package/src/controller/control/tree-grid/tree-grid.controller.ts +79 -4
  95. package/src/controller/control/tree-grid-ex/tree-grid-ex.controller.ts +2 -2
  96. package/src/controller/utils/index.ts +1 -0
  97. package/src/controller/utils/jsonschema/entity.ts +19 -0
  98. package/src/controller/utils/jsonschema/index.ts +1 -0
  99. package/src/interface/common/i-app-hub-service/i-app-hub-service.ts +7 -0
  100. package/src/interface/controller/controller/control/i-grid.controller.ts +5 -2
  101. package/src/interface/controller/controller/control/i-tree-grid.controller.ts +16 -1
  102. package/src/interface/controller/state/control/i-tree-grid.state.ts +7 -1
  103. package/src/interface/provider/i-app-menu-item.provider.ts +40 -0
  104. package/src/interface/provider/index.ts +1 -0
  105. package/src/interface/service/i-data-entity/i-data-entity.ts +0 -19
  106. package/src/interface/service/service/i-auth.service.ts +26 -0
  107. package/src/interface/service/service/index.ts +1 -1
  108. package/src/register/helper/app-menu-item-register.ts +65 -0
  109. package/src/register/helper/index.ts +1 -0
  110. package/src/service/app-data-entity/app-data-entity.ts +11 -46
  111. package/src/service/de-service-util.ts +1 -1
  112. package/src/service/service/auth/v7-auth.service.ts +31 -2
  113. package/src/service/service/entity/method/de-action.ts +47 -6
  114. package/src/service/utils/de-cache/de-cache.ts +3 -3
  115. package/src/utils/open-redirect-view/open-redirect-view.ts +31 -4
@@ -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.model.editor) {
101
- throw new RuntimeModelError(this.model, '缺少编辑器模型');
102
- }
121
+ if (!this.noEditor) {
122
+ if (!this.model.editor) {
123
+ throw new RuntimeModelError(this.model, '缺少编辑器模型');
124
+ }
103
125
 
104
- this.editorProvider = await getEditorProvider(this.model.editor);
105
- if (this.editorProvider) {
106
- this.editor = await this.editorProvider.createController(
107
- this.model.editor,
108
- this,
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.model.enableFilter
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.model.searchBarFilters?.length) {
237
- this.model.searchBarFilters.forEach(item => {
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
  });
@@ -585,7 +585,7 @@ export class TreeController<
585
585
  !parent ||
586
586
  (!this.model.rootVisible && this.state.rootNodes.includes(parent))
587
587
  ) {
588
- this.refresh();
588
+ await this.refresh();
589
589
  return;
590
590
  }
591
591
  }
@@ -1,6 +1,81 @@
1
- import { ITreeGridController } from '../../../interface';
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
- extends GridController
6
- implements ITreeGridController {}
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> {
@@ -8,3 +8,4 @@ export * from './value-rule/value-rule';
8
8
  export * from './value-ex/value-ex';
9
9
  export * from './value-default/value-default';
10
10
  export * from './data-file-util/data-file-util';
11
+ export * from './jsonschema/index';
@@ -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';
@@ -165,4 +165,11 @@ export interface IAppHubService {
165
165
  * @return {*} {IAppService[]}
166
166
  */
167
167
  getAllApps(): IAppService[];
168
+
169
+ /**
170
+ * 重置清空基座
171
+ * @author lxm
172
+ * @date 2024-01-03 06:46:57
173
+ */
174
+ reset(): void;
168
175
  }
@@ -13,8 +13,11 @@ import { CodeListItem } from '../../../service';
13
13
  * @interface IGridController
14
14
  * @extends {IMDControlController}
15
15
  */
16
- export interface IGridController
17
- extends IMDControlController<IDEGrid, IGridState, IGridEvent> {
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 extends IGridController {}
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
+ }
@@ -17,3 +17,4 @@ export type {
17
17
  IDEMethodCreateOptions,
18
18
  } from './i-de-method.provider';
19
19
  export type { ITreeGridExColumnProvider } from './i-tree-grid-ex-column.provider';
20
+ export type { IAppMenuItemProvider } from './i-app-menu-item.provider';
@@ -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
  }