@ibiz-template/runtime 0.4.12 → 0.4.14

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 (163) hide show
  1. package/dist/index.esm.js +1134 -225
  2. package/dist/index.system.min.js +2 -2
  3. package/out/config/global-config.js +1 -1
  4. package/out/controller/common/base.controller.d.ts +7 -0
  5. package/out/controller/common/base.controller.d.ts.map +1 -1
  6. package/out/controller/common/base.controller.js +10 -0
  7. package/out/controller/common/view/view.controller.d.ts +7 -0
  8. package/out/controller/common/view/view.controller.d.ts.map +1 -1
  9. package/out/controller/common/view/view.controller.js +11 -0
  10. package/out/controller/control/app-menu/app-menu.controller.d.ts +7 -0
  11. package/out/controller/control/app-menu/app-menu.controller.d.ts.map +1 -1
  12. package/out/controller/control/app-menu/app-menu.controller.js +22 -0
  13. package/out/controller/control/caption-bar/caption-bar.controller.d.ts.map +1 -1
  14. package/out/controller/control/caption-bar/caption-bar.controller.js +1 -6
  15. package/out/controller/control/form/form-detail/form-detail/form-detail.controller.d.ts.map +1 -1
  16. package/out/controller/control/form/form-detail/form-detail/form-detail.controller.js +5 -1
  17. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-form.controller.d.ts +13 -0
  18. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-form.controller.d.ts.map +1 -1
  19. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-form.controller.js +24 -3
  20. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-md.controller.d.ts +13 -0
  21. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-md.controller.d.ts.map +1 -1
  22. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-md.controller.js +26 -2
  23. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-repeater.controller.d.ts +0 -8
  24. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-repeater.controller.d.ts.map +1 -1
  25. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl-repeater.controller.js +0 -10
  26. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl.controller.d.ts +8 -0
  27. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl.controller.d.ts.map +1 -1
  28. package/out/controller/control/form/form-detail/form-mdctrl/form-mdctrl.controller.js +10 -0
  29. package/out/controller/control/gantt/gantt.controller.d.ts +146 -2
  30. package/out/controller/control/gantt/gantt.controller.d.ts.map +1 -1
  31. package/out/controller/control/gantt/gantt.controller.js +270 -0
  32. package/out/controller/control/grid/grid/grid-row.state.d.ts +11 -0
  33. package/out/controller/control/grid/grid/grid-row.state.d.ts.map +1 -1
  34. package/out/controller/control/grid/grid/grid-row.state.js +13 -0
  35. package/out/controller/control/grid/grid/grid.controller.d.ts +7 -0
  36. package/out/controller/control/grid/grid/grid.controller.d.ts.map +1 -1
  37. package/out/controller/control/grid/grid/grid.controller.js +27 -0
  38. package/out/controller/control/grid/grid/grid.service.d.ts.map +1 -1
  39. package/out/controller/control/grid/grid/grid.service.js +30 -20
  40. package/out/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.d.ts +21 -1
  41. package/out/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.d.ts.map +1 -1
  42. package/out/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.js +44 -1
  43. package/out/controller/control/kanban/kanban.controller.d.ts +13 -0
  44. package/out/controller/control/kanban/kanban.controller.d.ts.map +1 -1
  45. package/out/controller/control/kanban/kanban.controller.js +72 -0
  46. package/out/controller/control/report-panel/generator/user-generator.js +1 -1
  47. package/out/controller/control/search-bar/search-bar.controller.d.ts.map +1 -1
  48. package/out/controller/control/search-bar/search-bar.controller.js +2 -1
  49. package/out/controller/control/toolbar/toolbar.controllerr.d.ts +7 -0
  50. package/out/controller/control/toolbar/toolbar.controllerr.d.ts.map +1 -1
  51. package/out/controller/control/toolbar/toolbar.controllerr.js +22 -0
  52. package/out/controller/control/tree/tree.controller.d.ts +90 -2
  53. package/out/controller/control/tree/tree.controller.d.ts.map +1 -1
  54. package/out/controller/control/tree/tree.controller.js +295 -2
  55. package/out/interface/common/i-global-config/i-global-view-config.d.ts +1 -1
  56. package/out/interface/common/i-global-config/i-global-view-config.d.ts.map +1 -1
  57. package/out/interface/controller/controller/control/i-tree.controller.d.ts +1 -1
  58. package/out/interface/controller/controller/control/i-tree.controller.d.ts.map +1 -1
  59. package/out/interface/controller/event/control/i-gantt.event.d.ts +42 -0
  60. package/out/interface/controller/event/control/i-gantt.event.d.ts.map +1 -1
  61. package/out/interface/controller/event/control/i-tree.event.d.ts +17 -0
  62. package/out/interface/controller/event/control/i-tree.event.d.ts.map +1 -1
  63. package/out/interface/controller/state/control/i-gantt.state.d.ts +22 -0
  64. package/out/interface/controller/state/control/i-gantt.state.d.ts.map +1 -1
  65. package/out/interface/controller/state/control/i-grid.state.d.ts +11 -0
  66. package/out/interface/controller/state/control/i-grid.state.d.ts.map +1 -1
  67. package/out/interface/controller/state/control/i-kanban.state.d.ts +24 -0
  68. package/out/interface/controller/state/control/i-kanban.state.d.ts.map +1 -1
  69. package/out/interface/controller/state/control/i-tree.state.d.ts +7 -0
  70. package/out/interface/controller/state/control/i-tree.state.d.ts.map +1 -1
  71. package/out/interface/provider/i-grid-column.provider.d.ts +2 -2
  72. package/out/interface/provider/i-grid-column.provider.d.ts.map +1 -1
  73. package/out/interface/service/i-data-entity/i-data-entity.d.ts +8 -0
  74. package/out/interface/service/i-data-entity/i-data-entity.d.ts.map +1 -1
  75. package/out/interface/service/service/i-app-de.service.d.ts +11 -0
  76. package/out/interface/service/service/i-app-de.service.d.ts.map +1 -1
  77. package/out/logic-scheduler/executor/app-ui-logic-executor.d.ts.map +1 -1
  78. package/out/logic-scheduler/executor/app-ui-logic-executor.js +4 -2
  79. package/out/model/index.d.ts +1 -0
  80. package/out/model/index.d.ts.map +1 -1
  81. package/out/model/index.js +1 -0
  82. package/out/model/toolbar/toolbar.d.ts +12 -0
  83. package/out/model/toolbar/toolbar.d.ts.map +1 -0
  84. package/out/model/toolbar/toolbar.js +22 -0
  85. package/out/register/helper/grid-column-register.d.ts +2 -2
  86. package/out/register/helper/grid-column-register.d.ts.map +1 -1
  87. package/out/register/helper/grid-column-register.js +14 -0
  88. package/out/service/dto/method.dto.d.ts.map +1 -1
  89. package/out/service/dto/method.dto.js +8 -1
  90. package/out/service/service/entity/de.service.d.ts +9 -1
  91. package/out/service/service/entity/de.service.d.ts.map +1 -1
  92. package/out/service/service/entity/de.service.js +69 -0
  93. package/out/service/service/entity/method/fetch.d.ts +5 -12
  94. package/out/service/service/entity/method/fetch.d.ts.map +1 -1
  95. package/out/service/service/entity/method/fetch.js +7 -74
  96. package/out/service/vo/gantt-node-data/gantt-code-list-node-data.d.ts +1 -0
  97. package/out/service/vo/gantt-node-data/gantt-code-list-node-data.d.ts.map +1 -1
  98. package/out/service/vo/gantt-node-data/gantt-data-set-node-data.d.ts +2 -0
  99. package/out/service/vo/gantt-node-data/gantt-data-set-node-data.d.ts.map +1 -1
  100. package/out/service/vo/gantt-node-data/gantt-data-set-node-data.js +2 -1
  101. package/out/service/vo/gantt-node-data/gantt-node-data-util.d.ts +7 -0
  102. package/out/service/vo/gantt-node-data/gantt-node-data-util.d.ts.map +1 -1
  103. package/out/service/vo/gantt-node-data/gantt-node-data-util.js +18 -0
  104. package/out/service/vo/gantt-node-data/gantt-static-node-data.d.ts +1 -0
  105. package/out/service/vo/gantt-node-data/gantt-static-node-data.d.ts.map +1 -1
  106. package/out/service/vo/tree-node-data/tree-code-list-node-data.d.ts.map +1 -1
  107. package/out/service/vo/tree-node-data/tree-code-list-node-data.js +8 -4
  108. package/out/service/vo/tree-node-data/tree-data-set-node-data.d.ts.map +1 -1
  109. package/out/service/vo/tree-node-data/tree-data-set-node-data.js +8 -4
  110. package/out/service/vo/tree-node-data/tree-node-data.d.ts +1 -0
  111. package/out/service/vo/tree-node-data/tree-node-data.d.ts.map +1 -1
  112. package/out/service/vo/tree-node-data/tree-node-data.js +2 -0
  113. package/out/service/vo/tree-node-data/tree-static-node-data.d.ts.map +1 -1
  114. package/out/service/vo/tree-node-data/tree-static-node-data.js +8 -2
  115. package/out/utils/layout-panel-util/layout-panel-util.js +1 -1
  116. package/package.json +2 -2
  117. package/src/config/global-config.ts +1 -1
  118. package/src/controller/common/base.controller.ts +11 -0
  119. package/src/controller/common/view/view.controller.ts +15 -0
  120. package/src/controller/control/app-menu/app-menu.controller.ts +25 -0
  121. package/src/controller/control/caption-bar/caption-bar.controller.ts +1 -8
  122. package/src/controller/control/form/form-detail/form-detail/form-detail.controller.ts +9 -1
  123. package/src/controller/control/form/form-detail/form-mdctrl/form-mdctrl-form.controller.ts +27 -3
  124. package/src/controller/control/form/form-detail/form-mdctrl/form-mdctrl-md.controller.ts +26 -2
  125. package/src/controller/control/form/form-detail/form-mdctrl/form-mdctrl-repeater.controller.ts +0 -11
  126. package/src/controller/control/form/form-detail/form-mdctrl/form-mdctrl.controller.ts +11 -0
  127. package/src/controller/control/gantt/gantt.controller.ts +331 -1
  128. package/src/controller/control/grid/grid/grid-row.state.ts +15 -0
  129. package/src/controller/control/grid/grid/grid.controller.ts +34 -0
  130. package/src/controller/control/grid/grid/grid.service.ts +34 -21
  131. package/src/controller/control/grid/grid-column/grid-field-column/grid-field-column.controller.ts +67 -2
  132. package/src/controller/control/kanban/kanban.controller.ts +81 -0
  133. package/src/controller/control/report-panel/generator/user-generator.ts +1 -1
  134. package/src/controller/control/search-bar/search-bar.controller.ts +2 -1
  135. package/src/controller/control/toolbar/toolbar.controllerr.ts +29 -0
  136. package/src/controller/control/tree/tree.controller.ts +371 -3
  137. package/src/interface/common/i-global-config/i-global-view-config.ts +1 -1
  138. package/src/interface/controller/controller/control/i-tree.controller.ts +1 -1
  139. package/src/interface/controller/event/control/i-gantt.event.ts +37 -1
  140. package/src/interface/controller/event/control/i-tree.event.ts +14 -0
  141. package/src/interface/controller/state/control/i-gantt.state.ts +25 -0
  142. package/src/interface/controller/state/control/i-grid.state.ts +10 -0
  143. package/src/interface/controller/state/control/i-kanban.state.ts +26 -0
  144. package/src/interface/controller/state/control/i-tree.state.ts +8 -0
  145. package/src/interface/provider/i-grid-column.provider.ts +2 -2
  146. package/src/interface/service/i-data-entity/i-data-entity.ts +9 -0
  147. package/src/interface/service/service/i-app-de.service.ts +12 -0
  148. package/src/logic-scheduler/executor/app-ui-logic-executor.ts +8 -2
  149. package/src/model/index.ts +1 -0
  150. package/src/model/toolbar/toolbar.ts +35 -0
  151. package/src/register/helper/grid-column-register.ts +17 -2
  152. package/src/service/dto/method.dto.ts +8 -1
  153. package/src/service/service/entity/de.service.ts +74 -1
  154. package/src/service/service/entity/method/fetch.ts +8 -79
  155. package/src/service/vo/gantt-node-data/gantt-code-list-node-data.ts +2 -0
  156. package/src/service/vo/gantt-node-data/gantt-data-set-node-data.ts +6 -1
  157. package/src/service/vo/gantt-node-data/gantt-node-data-util.ts +21 -0
  158. package/src/service/vo/gantt-node-data/gantt-static-node-data.ts +2 -0
  159. package/src/service/vo/tree-node-data/tree-code-list-node-data.ts +10 -5
  160. package/src/service/vo/tree-node-data/tree-data-set-node-data.ts +10 -5
  161. package/src/service/vo/tree-node-data/tree-node-data.ts +3 -0
  162. package/src/service/vo/tree-node-data/tree-static-node-data.ts +10 -3
  163. package/src/utils/layout-panel-util/layout-panel-util.ts +1 -1
@@ -5,6 +5,7 @@ import {
5
5
  IDragChangeInfo,
6
6
  IKanbanController,
7
7
  IKanbanEvent,
8
+ IKanbanGroupState,
8
9
  IKanbanState,
9
10
  MDCtrlLoadParams,
10
11
  } from '../../../interface';
@@ -122,6 +123,86 @@ export class KanbanController
122
123
  return super.handleDataGroup();
123
124
  }
124
125
 
126
+ /**
127
+ * 处理自动分组
128
+ *
129
+ * @memberof KanbanController
130
+ */
131
+ handleAutoGroup(): void {
132
+ const { groupAppDEFieldId } = this.model;
133
+ if (groupAppDEFieldId) {
134
+ const { items } = this.state;
135
+ const groupMap: Map<string, IData[]> = new Map();
136
+ items.forEach((item: IData) => {
137
+ const groupVal = item[groupAppDEFieldId];
138
+ if (isNil(groupVal)) {
139
+ // 分组无值的不显示
140
+ return;
141
+ }
142
+
143
+ if (!groupMap.has(groupVal)) {
144
+ groupMap.set(groupVal, []);
145
+ }
146
+ groupMap.get(groupVal)!.push(item);
147
+ });
148
+ const groups: IKanbanGroupState[] = [];
149
+ groupMap.forEach((value: IData[], key: string) => {
150
+ // 标题
151
+ const codeListItem = this.groupCodeListItems!.find(
152
+ item => item.value === key,
153
+ )!;
154
+ groups.push({
155
+ caption: codeListItem.text,
156
+ color: codeListItem.color,
157
+ key: codeListItem.value,
158
+ children: [...value],
159
+ });
160
+ });
161
+ this.state.groups = groups;
162
+ }
163
+ }
164
+
165
+ /**
166
+ * 处理代码表分组
167
+ *
168
+ * @return {*} {Promise<void>}
169
+ * @memberof KanbanController
170
+ */
171
+ async handleCodeListGroup(): Promise<void> {
172
+ const { groupAppDEFieldId, groupCodeListId } = this.model;
173
+ if (!groupCodeListId) {
174
+ throw new RuntimeModelError(this.model, '分组代码表没有配置');
175
+ }
176
+ const { items } = this.state;
177
+ const groupMap: Map<string | number, IData[]> = new Map();
178
+ this.groupCodeListItems!.forEach(item => {
179
+ groupMap.set(item.value, []);
180
+ });
181
+ items.forEach((item: IData) => {
182
+ const groupVal = item[groupAppDEFieldId!];
183
+ const groupArr = groupMap.get(groupVal);
184
+ if (groupArr) {
185
+ groupArr.push(item);
186
+ }
187
+ // 不在代码表里数据忽略
188
+ });
189
+
190
+ const groups: IKanbanGroupState[] = [];
191
+ groupMap.forEach((arr, key) => {
192
+ // 标题
193
+ const codeListItem = this.groupCodeListItems!.find(
194
+ item => item.value === key,
195
+ )!;
196
+ groups.push({
197
+ caption: codeListItem.text,
198
+ color: codeListItem.color,
199
+ key: codeListItem.value,
200
+ children: arr,
201
+ });
202
+ });
203
+ this.state.groups = groups;
204
+ }
205
+
125
206
  /**
126
207
  * 拖拽变更事件处理回调
127
208
  * @author lxm
@@ -50,7 +50,7 @@ export class UserReportPanelGenerator extends ReportPanelBaseGenerator {
50
50
  },
51
51
  ],
52
52
  nodeDataHook:
53
- "{{ data.forEach(node => { const type = node.data.source_lables || node.data.target_lables; Object.assign(node, { label: node.data.name, size: 66, style: { fill: node.color },donutAttrs: { prop1: 10000, prop2: 10 },donutColorMap: { prop1: node.color, prop2: node.color },icon: {show: true,img: type === 'NEO4J_ZT' ? resource.dir('/assets/images/user-avatar.png') : resource.dir('/assets/images/phone.png'),width: 40,height: 40}})})}}",
53
+ "{{ data.forEach(node => { const type = node.data.source_lables || node.data.target_lables; Object.assign(node, { label: node.data.name, size: 66, style: { fill: node.color },donutAttrs: { prop1: 10000, prop2: 10 },donutColorMap: { prop1: node.color, prop2: node.color },icon: {show: true,img: type === 'NEO4J_ZT' ? resource.dir('assets/images/user-avatar.png') : resource.dir('assets/images/phone.png'),width: 40,height: 40}})})}}",
54
54
  edgeDataHook:
55
55
  '{{ data.forEach(edge => {Object.assign(edge, { label: edge.name })}) }}',
56
56
  },
@@ -174,6 +174,7 @@ export class SearchBarController
174
174
  children: [{ leaf: true, field: null, valueOP: null, value: null }],
175
175
  },
176
176
  ];
177
+ this.evt.emit('onSearch', undefined);
177
178
  }
178
179
 
179
180
  /**
@@ -236,7 +237,7 @@ export class SearchBarController
236
237
  condtype: 'GROUP',
237
238
  condop: node.logicType,
238
239
  bnotmode: false,
239
- searchcondlist: node.children.map(item => this.formatFilters(item)),
240
+ searchconds: node.children.map(item => this.formatFilters(item)),
240
241
  };
241
242
  }
242
243
 
@@ -4,6 +4,7 @@ import {
4
4
  IDEToolbarItem,
5
5
  IDETBUIActionItem,
6
6
  IControlLogic,
7
+ IDETBGroupItem,
7
8
  } from '@ibiz/model-core';
8
9
  import { ViewCallTag, ViewMode } from '../../../constant';
9
10
  import {
@@ -241,4 +242,32 @@ export class ToolbarController<
241
242
  );
242
243
  super.initControlScheduler(actualLogics);
243
244
  }
245
+
246
+ /**
247
+ * 转换各类多语言
248
+ *
249
+ * @date 2023-05-18 02:57:00
250
+ * @protected
251
+ */
252
+ protected convertMultipleLanguages(): void {
253
+ const convertItemCaption = (items: IDEToolbarItem[]): void => {
254
+ items.forEach(item => {
255
+ if (item.capLanguageRes && item.capLanguageRes.lanResTag) {
256
+ item.caption = ibiz.i18n.t(
257
+ item.capLanguageRes.lanResTag,
258
+ item.caption,
259
+ );
260
+ }
261
+ if (
262
+ item.itemType === 'ITEMS' &&
263
+ (item as IDETBGroupItem).detoolbarItems
264
+ ) {
265
+ convertItemCaption((item as IDETBGroupItem).detoolbarItems!);
266
+ }
267
+ });
268
+ };
269
+ if (this.model.detoolbarItems && this.model.detoolbarItems.length > 0) {
270
+ convertItemCaption(this.model.detoolbarItems);
271
+ }
272
+ }
244
273
  }
@@ -1,6 +1,15 @@
1
1
  /* eslint-disable no-param-reassign */
2
- import { recursiveIterate } from '@ibiz-template/core';
3
- import { IDETree, IDETreeNode } from '@ibiz/model-core';
2
+ import {
3
+ RuntimeError,
4
+ RuntimeModelError,
5
+ recursiveIterate,
6
+ } from '@ibiz-template/core';
7
+ import {
8
+ IDETBUIActionItem,
9
+ IDETree,
10
+ IDETreeDataSetNode,
11
+ IDETreeNode,
12
+ } from '@ibiz/model-core';
4
13
  import {
5
14
  ITreeState,
6
15
  ITreeEvent,
@@ -12,6 +21,17 @@ import { UIActionUtil } from '../../../ui-action';
12
21
  import { MDControlController } from '../../common';
13
22
  import { ContextMenuController } from '../context-menu';
14
23
  import { TreeService } from './tree.service';
24
+ import {
25
+ calcDeCodeNameById,
26
+ getChildNodeRSs,
27
+ getUIActionItemsByActionLevel,
28
+ } from '../../../model';
29
+
30
+ export type DropNodeRS = {
31
+ minorEntityId: string;
32
+ pickupDEFName: string;
33
+ childDETreeNodeId: string;
34
+ };
15
35
 
16
36
  /**
17
37
  * 树部件控制器
@@ -44,6 +64,20 @@ export class TreeController
44
64
  */
45
65
  enableQuickSearch: boolean = false;
46
66
 
67
+ /**
68
+ * 拖入节点关系处理
69
+ * @author lxm
70
+ * @date 2023-12-14 03:05:38
71
+ */
72
+ dropNodeRss = new Map<string, DropNodeRS[]>();
73
+
74
+ /**
75
+ * 节点对应的上下文菜单里第一个行为级别为常用操作的项
76
+ * @author lxm
77
+ * @date 2023-12-19 03:14:03
78
+ */
79
+ nodeClickTBUIActionItem = new Map<string, IDETBUIActionItem>();
80
+
47
81
  protected initState(): void {
48
82
  super.initState();
49
83
  // 根节点初始化
@@ -87,6 +121,9 @@ export class TreeController
87
121
  }
88
122
  }
89
123
 
124
+ this.initDropNodeRss();
125
+ this.initNodeClickTBUIActionItem();
126
+
90
127
  this.service = new TreeService(this.model);
91
128
  await this.service.init(this.context);
92
129
 
@@ -108,6 +145,58 @@ export class TreeController
108
145
  );
109
146
  }
110
147
 
148
+ /**
149
+ * 初始化节点拖入关系处理
150
+ * @author lxm
151
+ * @date 2023-12-14 03:13:42
152
+ * @protected
153
+ */
154
+ protected initDropNodeRss(): void {
155
+ this.model.detreeNodes?.forEach(node => {
156
+ if (!node.allowDrop) {
157
+ return;
158
+ }
159
+ const infos: Array<DropNodeRS> = [];
160
+ const nodeRSs = getChildNodeRSs(this.model, {
161
+ parentId: node.id,
162
+ hasQuery: false,
163
+ });
164
+ nodeRSs.forEach(nodeRS => {
165
+ if (nodeRS.parentDER1N?.pickupDEFName) {
166
+ const childNode = this.getNodeModel(nodeRS.childDETreeNodeId!);
167
+ if (childNode?.treeNodeType === 'DE' && childNode.appDataEntityId) {
168
+ infos.push({
169
+ minorEntityId: childNode.appDataEntityId,
170
+ pickupDEFName: nodeRS.parentDER1N.pickupDEFName.toLowerCase(),
171
+ childDETreeNodeId: nodeRS.childDETreeNodeId!,
172
+ });
173
+ }
174
+ }
175
+ });
176
+
177
+ if (infos.length > 0) {
178
+ this.dropNodeRss.set(node.id!, infos);
179
+ }
180
+ });
181
+ }
182
+
183
+ /**
184
+ * 初始化节点点击后触发的第一个常用操作的上下文菜单项
185
+ * @author lxm
186
+ * @date 2023-12-19 03:18:43
187
+ * @protected
188
+ */
189
+ protected initNodeClickTBUIActionItem(): void {
190
+ this.model.detreeNodes?.forEach(node => {
191
+ if (node.decontextMenu?.detoolbarItems?.length) {
192
+ const items = getUIActionItemsByActionLevel(node.decontextMenu, 200);
193
+ if (items.length > 0) {
194
+ this.nodeClickTBUIActionItem.set(node.id!, items[0]);
195
+ }
196
+ }
197
+ });
198
+ }
199
+
111
200
  /**
112
201
  * 树部件加载,从根节点开始重新加载
113
202
  *
@@ -199,7 +288,16 @@ export class TreeController
199
288
  * @returns {*} {Promise<void>}
200
289
  * @memberof TreeController
201
290
  */
202
- async onTreeNodeClick(nodeData: ITreeNodeData): Promise<void> {
291
+ async onTreeNodeClick(
292
+ nodeData: ITreeNodeData,
293
+ event: MouseEvent,
294
+ ): Promise<void> {
295
+ // 节点有配置常用操作的上下文菜单时,触发界面行为,后续逻辑都不走
296
+ if (this.nodeClickTBUIActionItem.has(nodeData.nodeId)) {
297
+ const item = this.nodeClickTBUIActionItem.get(nodeData.nodeId)!;
298
+ return this.doUIAction(item.uiactionId!, nodeData, event, item.appId);
299
+ }
300
+
203
301
  // 导航的时候,没有导航视图的时候,节点后续点击逻辑都不走,也不选中
204
302
  if (this.state.navigational) {
205
303
  const nodeModel = this.getNodeModel(nodeData.nodeId);
@@ -451,4 +549,274 @@ export class TreeController
451
549
  }),
452
550
  );
453
551
  }
552
+
553
+ /**
554
+ * 计算是否允许拖动
555
+ * @author lxm
556
+ * @date 2023-12-14 11:28:07
557
+ * @param {ITreeNodeData} draggingNode
558
+ * @return {*} {boolean}
559
+ */
560
+ calcAllowDrag(draggingNode: ITreeNodeData): boolean {
561
+ const nodeModel = this.getNodeModel(draggingNode.nodeId);
562
+ return nodeModel?.allowDrag === true;
563
+ }
564
+
565
+ /**
566
+ * 计算是否允许拖入
567
+ * @author lxm
568
+ * @date 2023-12-14 02:04:15
569
+ * @param {ITreeNodeData} draggingNode
570
+ * @param {ITreeNodeData} dropNode
571
+ * @param {('inner' | 'prev' | 'next')} type
572
+ * @return {*} {boolean}
573
+ */
574
+ calcAllowDrop(
575
+ draggingNode: ITreeNodeData,
576
+ dropNode: ITreeNodeData,
577
+ type: 'inner' | 'prev' | 'next',
578
+ ): boolean {
579
+ const draggingNodeModel = this.getNodeModel(draggingNode.nodeId)!;
580
+ // * 移入的情况
581
+ if (type === 'inner') {
582
+ return !!this.findDropNodeRS(
583
+ dropNode.nodeId!,
584
+ draggingNodeModel.appDataEntityId!,
585
+ );
586
+ }
587
+ // * 前后的情况
588
+ if (draggingNode.parent?.id !== dropNode.parent?.id) {
589
+ // 父不一样的时候需要判断能否移入到对方的父节点内
590
+ return !!this.findDropNodeRS(
591
+ dropNode.parent!.nodeId!,
592
+ draggingNodeModel.appDataEntityId!,
593
+ );
594
+ }
595
+ // 父相同的情况下,就是排序,看是否能排序
596
+ const parentNodeModel = this.getNodeModel(dropNode.nodeId)!;
597
+ return parentNodeModel?.allowOrder === true;
598
+ }
599
+
600
+ /**
601
+ * 找到指定父节点下的节点关系里面
602
+ * 配置的实体关系的子实体是指定实体的
603
+ * @author lxm
604
+ * @date 2023-12-14 01:43:41
605
+ * @protected
606
+ * @param {string} parentId 父节点模型id
607
+ * @param {string} appDataEntityId
608
+ * @return {*} {(IDETreeNodeRS | undefined)}
609
+ */
610
+ protected findDropNodeRS(
611
+ parentId: string,
612
+ appDataEntityId: string,
613
+ ): DropNodeRS | undefined {
614
+ const nodeRSs = this.dropNodeRss.get(parentId);
615
+ return nodeRSs?.find(item => item.minorEntityId === appDataEntityId);
616
+ }
617
+
618
+ /**
619
+ * 处理节点拖入事件
620
+ * @author lxm
621
+ * @date 2023-12-15 04:23:29
622
+ * @param {ITreeNodeData} draggingNode
623
+ * @param {ITreeNodeData} dropNode
624
+ * @param {('inner' | 'prev' | 'next')} dropType
625
+ * @return {*} {Promise<void>}
626
+ */
627
+ async onNodeDrop(
628
+ draggingNode: ITreeNodeData,
629
+ dropNode: ITreeNodeData,
630
+ dropType: 'inner' | 'prev' | 'next',
631
+ ): Promise<void> {
632
+ if (
633
+ dropType === 'inner' &&
634
+ !dropNode.leaf &&
635
+ dropNode.children === undefined
636
+ ) {
637
+ await this.expandNodeByKey([dropNode.id]);
638
+ }
639
+
640
+ /** 修改的树节点数据 */
641
+ const modifiedNodeDatas: ITreeNodeData[] = [];
642
+ const draggingNodeModel = this.getNodeModel(draggingNode.nodeId)!;
643
+ const dropInNode = dropType === 'inner' ? dropNode : dropNode.parent!;
644
+ const isChangedParent = dropNode.parent?.id !== draggingNode.parent?.id;
645
+ let orderNodeModel = this.getNodeModel(dropNode.nodeId)!;
646
+
647
+ // * 处理切换父节点
648
+ if (
649
+ dropType === 'inner' ||
650
+ dropNode.parent?.id !== draggingNode.parent?.id
651
+ ) {
652
+ const dropNodeRs = this.findDropNodeRS(
653
+ dropInNode.nodeId,
654
+ draggingNodeModel.appDataEntityId!,
655
+ );
656
+ if (dropNodeRs) {
657
+ // 修改关系属性的值为父节点的主键和树节点id
658
+ draggingNode.deData![dropNodeRs.pickupDEFName] = dropInNode.value;
659
+ modifiedNodeDatas.push(draggingNode);
660
+ orderNodeModel = this.getNodeModel(dropNodeRs.childDETreeNodeId)!;
661
+ }
662
+ }
663
+
664
+ // *修改节点数据
665
+ // 所有情况都先从原来的父的子集合里删除自己
666
+ const originArr = draggingNode.parent!.children!;
667
+ originArr.splice(originArr.indexOf(draggingNode), 1);
668
+
669
+ if (dropType === 'inner') {
670
+ // 移入时放到最后
671
+ if (!dropNode.children) {
672
+ dropNode.children = [];
673
+ dropNode.leaf = true;
674
+ this.state.expandedKeys.push(dropNode.id);
675
+ }
676
+
677
+ dropNode.children.push(draggingNode);
678
+ } else {
679
+ // 非插入时,放入指定节点前后
680
+ let insertIndex = dropInNode.children!.indexOf(dropNode);
681
+ if (dropType === 'next') {
682
+ insertIndex += 1;
683
+ }
684
+ dropInNode.children!.splice(insertIndex, 0, draggingNode);
685
+ }
686
+
687
+ //* 变更父节点后的,拖动节点调整
688
+ if (dropType === 'inner' || isChangedParent) {
689
+ // 更改父节点
690
+ draggingNode.parent = dropInNode;
691
+ // 修改指向的节点模型
692
+ draggingNode.nodeId = orderNodeModel.id!;
693
+ // 维护拖拽的节点和其子孙的展开,维护拖入节点的展开
694
+ this.state.expandedKeys = this.calcExpandedKeys([dropInNode]);
695
+ }
696
+
697
+ // *处理排序
698
+ const { sortAppDEFieldId, sortDir, allowOrder } =
699
+ orderNodeModel as IDETreeDataSetNode;
700
+ if (allowOrder === true) {
701
+ // 有排序属性才处理排序
702
+ if (!sortAppDEFieldId) {
703
+ throw new RuntimeModelError(orderNodeModel, '缺少配置排序属性');
704
+ }
705
+ const sortField = sortAppDEFieldId.toLowerCase();
706
+ const isAsc = sortDir === 'ASC';
707
+
708
+ const changedArr = [...dropInNode.children!];
709
+
710
+ // 降序把数组反转,保证两个数组都是从小到大排
711
+ if (!isAsc) {
712
+ changedArr.reverse();
713
+ }
714
+
715
+ /**
716
+ * 获取下一个100的倍数
717
+ * @author lxm
718
+ * @date 2023-09-11 10:03:46
719
+ * @param {number} num
720
+ * @return {*} {number}
721
+ */
722
+ const getNextSort = (num: number): number => {
723
+ return num + (100 - (num % 100));
724
+ };
725
+
726
+ const getSort = (deData: IData): number => {
727
+ return (deData[sortField] as number) || 0;
728
+ };
729
+
730
+ let lastSort: number;
731
+ changedArr.forEach((item, index) => {
732
+ const deData = item.deData!;
733
+ if (lastSort === undefined) {
734
+ // 第一次出现要调整顺序的时候一定是从拖拽节点开始
735
+ if (item === draggingNode) {
736
+ // 如果时第一个,则排序值为100
737
+ if (index === 0) {
738
+ lastSort = 100;
739
+ } else {
740
+ // 最后一个时,把前一个的排序值加100
741
+ lastSort = getNextSort(getSort(changedArr[index - 1].deData!));
742
+ }
743
+ deData[sortField] = lastSort;
744
+
745
+ // 修改父的时候可能已经加入进去了
746
+ if (modifiedNodeDatas.indexOf(item) === -1) {
747
+ modifiedNodeDatas.push(item);
748
+ }
749
+ }
750
+ } else {
751
+ if (lastSort >= getSort(deData)) {
752
+ deData[sortField] = getNextSort(lastSort);
753
+ modifiedNodeDatas.push(item);
754
+ }
755
+ // 更新上一个排序值
756
+ lastSort = getSort(deData);
757
+ }
758
+ });
759
+ }
760
+
761
+ await this.updateDeNodeData(modifiedNodeDatas);
762
+
763
+ // *通知界面修改移入的父节点的子节点数据
764
+ this.evt.emit('onAfterNodeDrop', { isChangedParent });
765
+ }
766
+
767
+ /**
768
+ * 更新实体节点数据
769
+ * @author lxm
770
+ * @date 2023-12-15 04:19:36
771
+ * @protected
772
+ * @param {ITreeNodeData[]} nodeDatas 节点数据集合
773
+ * @return {*} {Promise<void>}
774
+ */
775
+ async updateDeNodeData(nodeDatas: ITreeNodeData[]): Promise<void> {
776
+ const app = ibiz.hub.getApp(this.context.srfappid);
777
+ await Promise.all(
778
+ nodeDatas.map(async node => {
779
+ const model = this.getNodeModel(node.nodeId)!;
780
+ const deData = node.deData!;
781
+ // 往上下文添加主键
782
+ const deName = calcDeCodeNameById(model.appDataEntityId!);
783
+ const tempContext = this.context.clone();
784
+ tempContext[deName] = deData.srfkey;
785
+
786
+ // 调用接口修改数据
787
+ const res = await app.deService.exec(
788
+ model.appDataEntityId!,
789
+ 'update',
790
+ tempContext,
791
+ deData,
792
+ );
793
+
794
+ // 更新完之后更新state里的数据。
795
+ if (res.data) {
796
+ node.deData = res.data;
797
+ }
798
+ }),
799
+ );
800
+ }
801
+
802
+ /**
803
+ * 修改节点文本
804
+ * @author lxm
805
+ * @date 2023-12-15 04:32:52
806
+ * @param {ITreeNodeData} nodeData
807
+ * @param {string} text
808
+ * @return {*} {Promise<void>}
809
+ */
810
+ async modifyNodeText(nodeData: ITreeNodeData, text: string): Promise<void> {
811
+ const model = this.getNodeModel(nodeData.nodeId)! as IDETreeDataSetNode;
812
+ if (!model.allowEditText) {
813
+ throw new RuntimeModelError(model, '树节点没有配置编辑模式:名称');
814
+ }
815
+ if (!nodeData.deData) {
816
+ throw new RuntimeError('不是实体树节点数据');
817
+ }
818
+ nodeData.text = text;
819
+ nodeData.deData[model.textAppDEFieldId!] = text;
820
+ await this.updateDeNodeData([nodeData]);
821
+ }
454
822
  }
@@ -36,5 +36,5 @@ export interface IGlobalViewConfig {
36
36
  * @author: zhujiamin
37
37
  * @Date: 2023-12-12 17:40:44
38
38
  */
39
- noNavTabs: boolean;
39
+ disableHomeTabs: boolean;
40
40
  }
@@ -20,7 +20,7 @@ export interface ITreeController
20
20
  * @returns {*} {Promise<void>}
21
21
  * @memberof ITreeController
22
22
  */
23
- onTreeNodeClick(nodeData: ITreeNodeData): Promise<void>;
23
+ onTreeNodeClick(nodeData: ITreeNodeData, event: MouseEvent): Promise<void>;
24
24
 
25
25
  /**
26
26
  * 树节点双击事件
@@ -1,3 +1,5 @@
1
+ import { IGanttNodeData } from '../../state';
2
+ import { EventBase } from '../argument';
1
3
  import { IMDControlEvent } from './i-md-control.event';
2
4
 
3
5
  /**
@@ -9,4 +11,38 @@ import { IMDControlEvent } from './i-md-control.event';
9
11
  * @interface IGanttEvent
10
12
  * @extends {IMDControlEvent}
11
13
  */
12
- export interface IGanttEvent extends IMDControlEvent {}
14
+ export interface IGanttEvent extends IMDControlEvent {
15
+ /**
16
+ * 数据激活事件
17
+ *
18
+ * @type {({
19
+ * event: EventBase & { nodeData: IGanttNodeData };
20
+ * emitArgs: { data: IData[]; nodeData: IGanttNodeData };
21
+ * })}
22
+ * @memberof IGanttEvent
23
+ */
24
+ onActive: {
25
+ event: EventBase & { nodeData: IGanttNodeData };
26
+ emitArgs: { data: IData[]; nodeData: IGanttNodeData };
27
+ };
28
+
29
+ /**
30
+ * 父节点刷新结束之后事件
31
+ *
32
+ * @type {({
33
+ * event: EventBase & {
34
+ * parentNode: IGanttNodeData;
35
+ * children: IGanttNodeData[];
36
+ * };
37
+ * emitArgs: { parentNode: IGanttNodeData; children: IGanttNodeData[] };
38
+ * })}
39
+ * @memberof IGanttEvent
40
+ */
41
+ onAfterRefreshParent: {
42
+ event: EventBase & {
43
+ parentNode: IGanttNodeData;
44
+ children: IGanttNodeData[];
45
+ };
46
+ emitArgs: { parentNode: IGanttNodeData; children: IGanttNodeData[] };
47
+ };
48
+ }
@@ -35,4 +35,18 @@ export interface ITreeEvent extends IMDControlEvent {
35
35
  event: EventBase & { parentNode: ITreeNodeData; children: ITreeNodeData[] };
36
36
  emitArgs: { parentNode: ITreeNodeData; children: ITreeNodeData[] };
37
37
  };
38
+
39
+ /**
40
+ * 树节点拖入变更处理完成后事件
41
+ * @author lxm
42
+ * @date 2023-12-15 03:18:10
43
+ * @type {({
44
+ * event: EventBase & { isChangedParent: boolean };
45
+ * emitArgs: { isChangedParent: boolean };
46
+ * })}
47
+ */
48
+ onAfterNodeDrop: {
49
+ event: EventBase & { isChangedParent: boolean };
50
+ emitArgs: { isChangedParent: boolean };
51
+ };
38
52
  }
@@ -1,3 +1,4 @@
1
+ import { IColumnState } from './i-grid.state';
1
2
  import { IMDControlState } from './i-md-control.state';
2
3
  import { ITreeNodeData } from './i-tree.state';
3
4
 
@@ -13,6 +14,14 @@ import { ITreeNodeData } from './i-tree.state';
13
14
  export interface IGanttState extends IMDControlState {
14
15
  items: IGanttNodeData[];
15
16
 
17
+ /**
18
+ * 表格列状态数组
19
+ *
20
+ * @type {IColumnState[]}
21
+ * @memberof IGanttState
22
+ */
23
+ columnStates: IColumnState[];
24
+
16
25
  /**
17
26
  * 树的根节点
18
27
  *
@@ -111,4 +120,20 @@ export interface IGanttNodeData extends ITreeNodeData {
111
120
  * @type {(IGanttNodeData[] | undefined)}
112
121
  */
113
122
  children?: IGanttNodeData[] | undefined;
123
+
124
+ /**
125
+ * 父节点数据对象
126
+ *
127
+ * @type {IGanttNodeData}
128
+ * @memberof IGanttNodeData
129
+ */
130
+ parent?: IGanttNodeData;
131
+
132
+ /**
133
+ * 节点数据项
134
+ *
135
+ * @type {IData}
136
+ * @memberof IGanttNodeData
137
+ */
138
+ nodeDataItem?: IData;
114
139
  }