@ibiz-template/runtime 0.1.21 → 0.1.22
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 +902 -204
- package/dist/index.system.min.js +1 -1
- package/dist/index.system.min.js.map +1 -1
- package/out/constant/view-call-tag.d.ts +9 -1
- package/out/constant/view-call-tag.d.ts.map +1 -1
- package/out/constant/view-call-tag.js +8 -0
- package/out/controller/control/data-view/data-view.controller.d.ts +25 -2
- package/out/controller/control/data-view/data-view.controller.d.ts.map +1 -1
- package/out/controller/control/data-view/data-view.controller.js +70 -30
- package/out/controller/control/data-view/data-view.service.d.ts +1 -1
- package/out/controller/control/data-view/data-view.service.d.ts.map +1 -1
- package/out/controller/control/data-view/data-view.service.js +2 -1
- package/out/controller/control/form/edit-form/edit-form.service.d.ts.map +1 -1
- package/out/controller/control/form/edit-form/edit-form.service.js +1 -0
- package/out/controller/control/form/form-detail/form-druipart/form-druipart.controller.d.ts.map +1 -1
- package/out/controller/control/form/form-detail/form-druipart/form-druipart.controller.js +8 -4
- package/out/controller/control/grid/grid/grid.controller.d.ts.map +1 -1
- package/out/controller/control/grid/grid/grid.controller.js +1 -1
- package/out/controller/control/grid/grid/grid.service.d.ts.map +1 -1
- package/out/controller/control/grid/grid/grid.service.js +1 -0
- package/out/controller/control/index.d.ts +1 -0
- package/out/controller/control/index.d.ts.map +1 -1
- package/out/controller/control/index.js +1 -0
- package/out/controller/control/kanban/index.d.ts +3 -0
- package/out/controller/control/kanban/index.d.ts.map +1 -0
- package/out/controller/control/kanban/index.js +2 -0
- package/out/controller/control/kanban/kanban.controller.d.ts +99 -0
- package/out/controller/control/kanban/kanban.controller.d.ts.map +1 -0
- package/out/controller/control/kanban/kanban.controller.js +310 -0
- package/out/controller/control/kanban/kanban.service.d.ts +24 -0
- package/out/controller/control/kanban/kanban.service.d.ts.map +1 -0
- package/out/controller/control/kanban/kanban.service.js +26 -0
- package/out/controller/control/list/list.controller.d.ts.map +1 -1
- package/out/controller/control/list/list.controller.js +3 -0
- package/out/controller/control/list/list.service.d.ts.map +1 -1
- package/out/controller/control/list/list.service.js +1 -0
- package/out/controller/control/md-ctrl/md-ctrl.service.d.ts.map +1 -1
- package/out/controller/control/md-ctrl/md-ctrl.service.js +1 -0
- package/out/controller/control/pickup-view-panel/pickup-view-panel.controller.d.ts.map +1 -1
- package/out/controller/control/pickup-view-panel/pickup-view-panel.controller.js +3 -2
- package/out/controller/control/toolbar/toolbar.controllerr.js +2 -2
- package/out/controller/ctx/ctx.d.ts +8 -0
- package/out/controller/ctx/ctx.d.ts.map +1 -1
- package/out/controller/ctx/ctx.js +12 -0
- package/out/de-logic/utils/handle-src-val.d.ts.map +1 -1
- package/out/de-logic/utils/handle-src-val.js +6 -4
- package/out/engine/view-base.engine.d.ts.map +1 -1
- package/out/engine/view-base.engine.js +2 -1
- package/out/interface/controller/controller/common/i-drag-change-info.d.ts +38 -0
- package/out/interface/controller/controller/common/i-drag-change-info.d.ts.map +1 -0
- package/out/interface/controller/controller/common/i-drag-change-info.js +1 -0
- package/out/interface/controller/controller/common/index.d.ts +1 -0
- package/out/interface/controller/controller/common/index.d.ts.map +1 -1
- package/out/interface/controller/controller/common/index.js +1 -0
- package/out/interface/controller/controller/control/i-data-view-control.controller.d.ts +1 -1
- package/out/interface/controller/controller/control/i-data-view-control.controller.d.ts.map +1 -1
- package/out/interface/controller/controller/control/i-kanban.controller.d.ts +14 -0
- package/out/interface/controller/controller/control/i-kanban.controller.d.ts.map +1 -0
- package/out/interface/controller/controller/control/i-kanban.controller.js +1 -0
- package/out/interface/controller/controller/control/index.d.ts +1 -0
- package/out/interface/controller/controller/control/index.d.ts.map +1 -1
- package/out/interface/controller/controller/control/index.js +1 -0
- package/out/interface/controller/event/control/i-kanban.event.d.ts +3 -3
- package/out/interface/controller/event/control/i-kanban.event.d.ts.map +1 -1
- package/out/interface/controller/event/view/i-kanban-view.event.d.ts +1 -1
- package/out/interface/controller/state/control/i-kanban.state.d.ts +33 -0
- package/out/interface/controller/state/control/i-kanban.state.d.ts.map +1 -0
- package/out/interface/controller/state/control/i-kanban.state.js +1 -0
- package/out/interface/controller/state/control/i-md-control.state.d.ts +7 -0
- package/out/interface/controller/state/control/i-md-control.state.d.ts.map +1 -1
- package/out/interface/controller/state/control/index.d.ts +1 -0
- package/out/interface/controller/state/control/index.d.ts.map +1 -1
- package/out/interface/controller/state/control/index.js +1 -0
- package/out/interface/controller/state/view/i-kanban-view.state.d.ts +11 -0
- package/out/interface/controller/state/view/i-kanban-view.state.d.ts.map +1 -0
- package/out/interface/controller/state/view/i-kanban-view.state.js +1 -0
- package/out/interface/controller/state/view/index.d.ts +1 -0
- package/out/interface/controller/state/view/index.d.ts.map +1 -1
- package/out/interface/controller/state/view/index.js +1 -0
- package/out/service/dto/method.dto.d.ts.map +1 -1
- package/out/service/dto/method.dto.js +1 -2
- package/out/service/service/entity/method/method.d.ts.map +1 -1
- package/out/service/service/entity/method/method.js +3 -1
- package/out/service/vo/control.vo.d.ts +1 -0
- package/out/service/vo/control.vo.d.ts.map +1 -1
- package/out/service/vo/control.vo.js +18 -5
- package/out/service/vo/ui-map-field.d.ts +8 -0
- package/out/service/vo/ui-map-field.d.ts.map +1 -1
- package/out/service/vo/ui-map-field.js +3 -0
- package/out/ui-logic/ui-logic-link/ui-logic-link-single-cond/ui-logic-link-single-cond.js +1 -1
- package/out/ui-logic/ui-logic-node/append-param-node/append-param-node.d.ts +17 -0
- package/out/ui-logic/ui-logic-node/append-param-node/append-param-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/append-param-node/append-param-node.js +25 -0
- package/out/ui-logic/ui-logic-node/copy-param-node/copy-param-node.d.ts +17 -0
- package/out/ui-logic/ui-logic-node/copy-param-node/copy-param-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/copy-param-node/copy-param-node.js +23 -0
- package/out/ui-logic/ui-logic-node/data-set-node/data-set-node.d.ts +17 -0
- package/out/ui-logic/ui-logic-node/data-set-node/data-set-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/data-set-node/data-set-node.js +21 -0
- package/out/ui-logic/ui-logic-node/execute-de-logic-node/execute-de-logic-node.d.ts +17 -0
- package/out/ui-logic/ui-logic-node/execute-de-logic-node/execute-de-logic-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/execute-de-logic-node/execute-de-logic-node.js +37 -0
- package/out/ui-logic/ui-logic-node/index.d.ts +9 -0
- package/out/ui-logic/ui-logic-node/index.d.ts.map +1 -1
- package/out/ui-logic/ui-logic-node/index.js +9 -0
- package/out/ui-logic/ui-logic-node/prepare-js-param-node/prepare-js-param-node.d.ts +56 -1
- package/out/ui-logic/ui-logic-node/prepare-js-param-node/prepare-js-param-node.d.ts.map +1 -1
- package/out/ui-logic/ui-logic-node/prepare-js-param-node/prepare-js-param-node.js +122 -12
- package/out/ui-logic/ui-logic-node/renew-param-node/renew-param-node.d.ts +17 -0
- package/out/ui-logic/ui-logic-node/renew-param-node/renew-param-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/renew-param-node/renew-param-node.js +20 -0
- package/out/ui-logic/ui-logic-node/reset-param-node/reset-param-node.d.ts +17 -0
- package/out/ui-logic/ui-logic-node/reset-param-node/reset-param-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/reset-param-node/reset-param-node.js +20 -0
- package/out/ui-logic/ui-logic-node/sort-param-node/sort-param-node.d.ts +17 -0
- package/out/ui-logic/ui-logic-node/sort-param-node/sort-param-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/sort-param-node/sort-param-node.js +24 -0
- package/out/ui-logic/ui-logic-node/throw-exception-node/throw-exception-node.d.ts +17 -0
- package/out/ui-logic/ui-logic-node/throw-exception-node/throw-exception-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/throw-exception-node/throw-exception-node.js +17 -0
- package/out/ui-logic/ui-logic-node/view-ctrl-fire-event-node/view-ctrl-fire-event-node.d.ts +16 -0
- package/out/ui-logic/ui-logic-node/view-ctrl-fire-event-node/view-ctrl-fire-event-node.d.ts.map +1 -0
- package/out/ui-logic/ui-logic-node/view-ctrl-fire-event-node/view-ctrl-fire-event-node.js +37 -0
- package/out/ui-logic/ui-logic-param/ui-logic-param.d.ts.map +1 -1
- package/out/ui-logic/ui-logic-param/ui-logic-param.js +2 -2
- package/out/ui-logic/ui-logic.d.ts.map +1 -1
- package/out/ui-logic/ui-logic.js +24 -6
- package/out/ui-logic/utils/handle-src-val.d.ts.map +1 -1
- package/out/ui-logic/utils/handle-src-val.js +7 -5
- package/out/utils/verify/de-rule-verify.js +1 -1
- package/package.json +5 -5
- package/src/constant/view-call-tag.ts +8 -0
- package/src/controller/control/data-view/data-view.controller.ts +93 -43
- package/src/controller/control/data-view/data-view.service.ts +5 -2
- package/src/controller/control/form/edit-form/edit-form.service.ts +1 -0
- package/src/controller/control/form/form-detail/form-druipart/form-druipart.controller.ts +10 -5
- package/src/controller/control/grid/grid/grid.controller.ts +1 -1
- package/src/controller/control/grid/grid/grid.service.ts +1 -0
- package/src/controller/control/index.ts +1 -0
- package/src/controller/control/kanban/index.ts +2 -0
- package/src/controller/control/kanban/kanban.controller.ts +370 -0
- package/src/controller/control/kanban/kanban.service.ts +33 -0
- package/src/controller/control/list/list.controller.ts +3 -0
- package/src/controller/control/list/list.service.ts +1 -0
- package/src/controller/control/md-ctrl/md-ctrl.service.ts +1 -0
- package/src/controller/control/pickup-view-panel/pickup-view-panel.controller.ts +3 -2
- package/src/controller/control/toolbar/toolbar.controllerr.ts +2 -2
- package/src/controller/ctx/ctx.ts +13 -0
- package/src/de-logic/utils/handle-src-val.ts +6 -4
- package/src/engine/view-base.engine.ts +2 -1
- package/src/interface/controller/controller/common/i-drag-change-info.ts +40 -0
- package/src/interface/controller/controller/common/index.ts +1 -0
- package/src/interface/controller/controller/control/i-data-view-control.controller.ts +5 -6
- package/src/interface/controller/controller/control/i-kanban.controller.ts +14 -0
- package/src/interface/controller/controller/control/index.ts +1 -0
- package/src/interface/controller/event/control/i-kanban.event.ts +3 -3
- package/src/interface/controller/event/view/i-kanban-view.event.ts +1 -1
- package/src/interface/controller/state/control/i-kanban.state.ts +35 -0
- package/src/interface/controller/state/control/i-md-control.state.ts +8 -0
- package/src/interface/controller/state/control/index.ts +1 -0
- package/src/interface/controller/state/view/i-kanban-view.state.ts +10 -0
- package/src/interface/controller/state/view/index.ts +1 -0
- package/src/service/dto/method.dto.ts +1 -2
- package/src/service/service/entity/method/method.ts +3 -1
- package/src/service/vo/control.vo.ts +19 -4
- package/src/service/vo/ui-map-field.ts +12 -0
- package/src/ui-logic/ui-logic-link/ui-logic-link-single-cond/ui-logic-link-single-cond.ts +1 -1
- package/src/ui-logic/ui-logic-node/append-param-node/append-param-node.ts +44 -0
- package/src/ui-logic/ui-logic-node/copy-param-node/copy-param-node.ts +31 -0
- package/src/ui-logic/ui-logic-node/data-set-node/data-set-node.ts +37 -0
- package/src/ui-logic/ui-logic-node/execute-de-logic-node/execute-de-logic-node.ts +57 -0
- package/src/ui-logic/ui-logic-node/index.ts +9 -0
- package/src/ui-logic/ui-logic-node/prepare-js-param-node/prepare-js-param-node.ts +153 -17
- package/src/ui-logic/ui-logic-node/renew-param-node/renew-param-node.ts +25 -0
- package/src/ui-logic/ui-logic-node/reset-param-node/reset-param-node.ts +25 -0
- package/src/ui-logic/ui-logic-node/sort-param-node/sort-param-node.ts +29 -0
- package/src/ui-logic/ui-logic-node/throw-exception-node/throw-exception-node.ts +23 -0
- package/src/ui-logic/ui-logic-node/view-ctrl-fire-event-node/view-ctrl-fire-event-node.ts +47 -0
- package/src/ui-logic/ui-logic-param/ui-logic-param.ts +2 -5
- package/src/ui-logic/ui-logic.ts +32 -5
- package/src/ui-logic/utils/handle-src-val.ts +7 -5
- package/src/utils/verify/de-rule-verify.ts +1 -1
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
IDEDataViewItem,
|
|
5
5
|
IUIActionGroupDetail,
|
|
6
6
|
} from '@ibiz/model-core';
|
|
7
|
+
import { isNil } from 'ramda';
|
|
7
8
|
import {
|
|
8
9
|
IDataViewControlState,
|
|
9
10
|
IDataViewControlEvent,
|
|
@@ -17,12 +18,12 @@ import { MDControlController } from '../../common';
|
|
|
17
18
|
import { ButtonContainerState, UIActionButtonState } from '../../utils';
|
|
18
19
|
import { DataViewControlService } from './data-view.service';
|
|
19
20
|
|
|
20
|
-
export class DataViewControlController
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
IDataViewControlEvent
|
|
21
|
+
export class DataViewControlController<
|
|
22
|
+
T extends IDEDataView = IDEDataView,
|
|
23
|
+
S extends IDataViewControlState = IDataViewControlState,
|
|
24
|
+
E extends IDataViewControlEvent = IDataViewControlEvent,
|
|
25
25
|
>
|
|
26
|
+
extends MDControlController<T, S, E>
|
|
26
27
|
implements IDataViewControlController
|
|
27
28
|
{
|
|
28
29
|
/**
|
|
@@ -33,6 +34,14 @@ export class DataViewControlController
|
|
|
33
34
|
*/
|
|
34
35
|
declare service: DataViewControlService;
|
|
35
36
|
|
|
37
|
+
/**
|
|
38
|
+
* 分组代码表项集合
|
|
39
|
+
* @author lxm
|
|
40
|
+
* @date 2023-08-29 04:55:07
|
|
41
|
+
* @type {readonly}
|
|
42
|
+
*/
|
|
43
|
+
groupCodeListItems?: readonly CodeListItem[];
|
|
44
|
+
|
|
36
45
|
/**
|
|
37
46
|
* 初始化State
|
|
38
47
|
*
|
|
@@ -42,6 +51,7 @@ export class DataViewControlController
|
|
|
42
51
|
protected initState(): void {
|
|
43
52
|
super.initState();
|
|
44
53
|
this.state.noSort = this.model.noSort === true;
|
|
54
|
+
this.state.size = this.model.pagingSize || 20;
|
|
45
55
|
}
|
|
46
56
|
|
|
47
57
|
/**
|
|
@@ -53,7 +63,17 @@ export class DataViewControlController
|
|
|
53
63
|
*/
|
|
54
64
|
protected async onCreated(): Promise<void> {
|
|
55
65
|
await super.onCreated();
|
|
56
|
-
|
|
66
|
+
await this.initControlService();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 初始化部件服务
|
|
71
|
+
* @author lxm
|
|
72
|
+
* @date 2023-08-29 04:13:05
|
|
73
|
+
* @protected
|
|
74
|
+
* @return {*} {Promise<void>}
|
|
75
|
+
*/
|
|
76
|
+
protected async initControlService(): Promise<void> {
|
|
57
77
|
this.service = new DataViewControlService(this.model);
|
|
58
78
|
await this.service.init(this.context);
|
|
59
79
|
}
|
|
@@ -158,8 +178,11 @@ export class DataViewControlController
|
|
|
158
178
|
* @memberof DataViewControlController
|
|
159
179
|
*/
|
|
160
180
|
async handleDataGroup(): Promise<void> {
|
|
161
|
-
const { enableGroup, groupMode } = this.model;
|
|
181
|
+
const { enableGroup, groupMode, groupAppDEFieldId } = this.model;
|
|
162
182
|
if (enableGroup && groupMode) {
|
|
183
|
+
if (!groupAppDEFieldId) {
|
|
184
|
+
throw new RuntimeModelError(this.model, '分组属性没有配置');
|
|
185
|
+
}
|
|
163
186
|
if (groupMode === 'AUTO') {
|
|
164
187
|
this.handleAutoGroup();
|
|
165
188
|
} else if (groupMode === 'CODELIST') {
|
|
@@ -177,16 +200,24 @@ export class DataViewControlController
|
|
|
177
200
|
const { groupAppDEFieldId } = this.model;
|
|
178
201
|
if (groupAppDEFieldId) {
|
|
179
202
|
const { items } = this.state;
|
|
180
|
-
const
|
|
203
|
+
const groupMap: Map<string, IData[]> = new Map();
|
|
181
204
|
items.forEach((item: IData) => {
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
205
|
+
const groupVal = item[groupAppDEFieldId];
|
|
206
|
+
if (isNil(groupVal)) {
|
|
207
|
+
// 分组无值的不显示
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (!groupMap.has(groupVal)) {
|
|
212
|
+
groupMap.set(groupVal, []);
|
|
213
|
+
}
|
|
214
|
+
groupMap.get(groupVal)!.push(item);
|
|
185
215
|
});
|
|
186
216
|
const groups: IMDControlGroupState[] = [];
|
|
187
|
-
|
|
217
|
+
groupMap.forEach((value: IData[], key: string) => {
|
|
188
218
|
groups.push({
|
|
189
219
|
caption: key,
|
|
220
|
+
key,
|
|
190
221
|
children: [...value],
|
|
191
222
|
});
|
|
192
223
|
});
|
|
@@ -194,44 +225,63 @@ export class DataViewControlController
|
|
|
194
225
|
}
|
|
195
226
|
}
|
|
196
227
|
|
|
228
|
+
/**
|
|
229
|
+
* 加载并初始化分组代码表项集合
|
|
230
|
+
* @author lxm
|
|
231
|
+
* @date 2023-08-29 05:11:39
|
|
232
|
+
* @protected
|
|
233
|
+
* @return {*} {Promise<void>}
|
|
234
|
+
*/
|
|
235
|
+
protected async initGroupCodeListItems(): Promise<void> {
|
|
236
|
+
const { groupCodeListId } = this.model;
|
|
237
|
+
if (!groupCodeListId) {
|
|
238
|
+
throw new RuntimeModelError(this.model, '分组代码表没有配置');
|
|
239
|
+
}
|
|
240
|
+
const app = ibiz.hub.getApp(this.context.srfappid);
|
|
241
|
+
this.groupCodeListItems = await app.codeList.get(
|
|
242
|
+
groupCodeListId,
|
|
243
|
+
this.context,
|
|
244
|
+
this.params,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
197
248
|
/**
|
|
198
249
|
* 处理代码表分组
|
|
199
250
|
*
|
|
200
251
|
* @memberof DataViewControlController
|
|
201
252
|
*/
|
|
202
253
|
async handleCodeListGroup(): Promise<void> {
|
|
203
|
-
const { groupAppDEFieldId
|
|
204
|
-
if (
|
|
205
|
-
|
|
206
|
-
const groups: IMDControlGroupState[] = [];
|
|
207
|
-
const app = ibiz.hub.getApp(this.context.srfappid);
|
|
208
|
-
const codeList = await app.codeList.get(
|
|
209
|
-
groupCodeListId,
|
|
210
|
-
this.context,
|
|
211
|
-
this.params,
|
|
212
|
-
);
|
|
213
|
-
const keys: string[] = [];
|
|
214
|
-
codeList.forEach((codeListItem: CodeListItem) => {
|
|
215
|
-
const value = items.filter(
|
|
216
|
-
(item: IData) => item[groupAppDEFieldId] === codeListItem.value,
|
|
217
|
-
);
|
|
218
|
-
groups.push({
|
|
219
|
-
caption: codeListItem.text,
|
|
220
|
-
children: [...value],
|
|
221
|
-
});
|
|
222
|
-
keys.push(codeListItem.value as string);
|
|
223
|
-
});
|
|
224
|
-
const otherGroup = items.filter(
|
|
225
|
-
(item: IData) => keys.indexOf(item[groupAppDEFieldId]) === -1,
|
|
226
|
-
);
|
|
227
|
-
if (otherGroup.length > 0) {
|
|
228
|
-
groups.push({
|
|
229
|
-
caption: '其他',
|
|
230
|
-
children: [...otherGroup],
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
this.state.groups = groups;
|
|
254
|
+
const { groupAppDEFieldId } = this.model;
|
|
255
|
+
if (!this.groupCodeListItems) {
|
|
256
|
+
await this.initGroupCodeListItems();
|
|
234
257
|
}
|
|
258
|
+
const { items } = this.state;
|
|
259
|
+
const groupMap: Map<string | number, IData[]> = new Map();
|
|
260
|
+
this.groupCodeListItems!.forEach(item => {
|
|
261
|
+
groupMap.set(item.value, []);
|
|
262
|
+
});
|
|
263
|
+
items.forEach((item: IData) => {
|
|
264
|
+
const groupVal = item[groupAppDEFieldId!];
|
|
265
|
+
const groupArr = groupMap.get(groupVal);
|
|
266
|
+
if (groupArr) {
|
|
267
|
+
groupArr.push(item);
|
|
268
|
+
}
|
|
269
|
+
// 不在代码表里数据忽略
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
const groups: IMDControlGroupState[] = [];
|
|
273
|
+
groupMap.forEach((arr, key) => {
|
|
274
|
+
// 标题
|
|
275
|
+
const codeListItem = this.groupCodeListItems!.find(
|
|
276
|
+
item => item.value === key,
|
|
277
|
+
)!;
|
|
278
|
+
groups.push({
|
|
279
|
+
caption: codeListItem.text,
|
|
280
|
+
key: codeListItem.value,
|
|
281
|
+
children: arr,
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
this.state.groups = groups;
|
|
235
285
|
}
|
|
236
286
|
|
|
237
287
|
/**
|
|
@@ -8,7 +8,9 @@ import { MDControlService, UIMapField } from '../../../service';
|
|
|
8
8
|
* @class DataViewControlService
|
|
9
9
|
* @extends {MDControlService<IDEDataView>}
|
|
10
10
|
*/
|
|
11
|
-
export class DataViewControlService
|
|
11
|
+
export class DataViewControlService<
|
|
12
|
+
T extends IDEDataView = IDEDataView,
|
|
13
|
+
> extends MDControlService<T> {
|
|
12
14
|
/**
|
|
13
15
|
* 初始化属性映射
|
|
14
16
|
*
|
|
@@ -16,7 +18,7 @@ export class DataViewControlService extends MDControlService<IDEDataView> {
|
|
|
16
18
|
*/
|
|
17
19
|
initUIDataMap(): void {
|
|
18
20
|
super.initUIDataMap();
|
|
19
|
-
//
|
|
21
|
+
// *初始化数据项的属性映射
|
|
20
22
|
this.model.dedataViewDataItems?.forEach(item => {
|
|
21
23
|
const uiKey = item.id!.toLowerCase();
|
|
22
24
|
const deField = item.appDEFieldId;
|
|
@@ -26,6 +28,7 @@ export class DataViewControlService extends MDControlService<IDEDataView> {
|
|
|
26
28
|
const deFieldKey = deField.toLowerCase();
|
|
27
29
|
mapField = new UIMapField(uiKey, deFieldKey, {
|
|
28
30
|
isOriginField: true,
|
|
31
|
+
dataType: item.dataType,
|
|
29
32
|
});
|
|
30
33
|
} else {
|
|
31
34
|
// 前台属性
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isOverlap } from '@ibiz-template/core';
|
|
2
2
|
import { IDEFormDRUIPart } from '@ibiz/model-core';
|
|
3
3
|
import { createUUID, notNilEmpty } from 'qx-util';
|
|
4
|
-
import { SysUIActionTag } from '../../../../../constant';
|
|
4
|
+
import { SysUIActionTag, ViewCallTag } from '../../../../../constant';
|
|
5
5
|
import { IViewController } from '../../../../../interface';
|
|
6
6
|
import { convertNavData } from '../../../../../utils';
|
|
7
7
|
import { FormNotifyState } from '../../../../constant';
|
|
@@ -117,9 +117,14 @@ export class FormDRUIPartController extends FormDetailController<IDEFormDRUIPart
|
|
|
117
117
|
await super.formStateNotify(state);
|
|
118
118
|
|
|
119
119
|
this.isNewData = state === FormNotifyState.DRAFT;
|
|
120
|
-
this.
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
if (this.model.maskMode !== 0) {
|
|
121
|
+
this.state.showMask = this.isNewData;
|
|
122
|
+
}
|
|
123
|
+
if (
|
|
124
|
+
state === FormNotifyState.LOAD ||
|
|
125
|
+
state === FormNotifyState.DRAFT ||
|
|
126
|
+
state === FormNotifyState.SAVE
|
|
127
|
+
) {
|
|
123
128
|
// 表单数据加载变更后,计算关系界面参数
|
|
124
129
|
this.calcViewParams();
|
|
125
130
|
}
|
|
@@ -190,7 +195,7 @@ export class FormDRUIPartController extends FormDetailController<IDEFormDRUIPart
|
|
|
190
195
|
this.embedView = view;
|
|
191
196
|
this.embedView.evt.on('onMounted', () => {
|
|
192
197
|
if (!this.isNewData) {
|
|
193
|
-
this.embedView.
|
|
198
|
+
this.embedView.call(ViewCallTag.LOAD);
|
|
194
199
|
}
|
|
195
200
|
});
|
|
196
201
|
this.embedView.evt.on('onDataChange', event => {
|
|
@@ -328,6 +328,7 @@ export class GridController
|
|
|
328
328
|
);
|
|
329
329
|
this.state.groups.push({
|
|
330
330
|
caption: codeListItem?.text || `${key}`,
|
|
331
|
+
key,
|
|
331
332
|
children: value,
|
|
332
333
|
});
|
|
333
334
|
});
|
|
@@ -510,7 +511,6 @@ export class GridController
|
|
|
510
511
|
rowState.data = res.data;
|
|
511
512
|
rowState.modified = false;
|
|
512
513
|
|
|
513
|
-
ibiz.message.success(`${res.data.srfmajortext || ''}保存成功`);
|
|
514
514
|
this.actionNotification(`${isCreate ? 'CREATE' : 'UPDATE'}SUCCESS`, {
|
|
515
515
|
default: `${res.data.srfmajortext || ''}保存成功`,
|
|
516
516
|
data: res.data,
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { RuntimeError, RuntimeModelError } from '@ibiz-template/core';
|
|
2
|
+
import { IDEKanban, IUIActionGroupDetail } from '@ibiz/model-core';
|
|
3
|
+
import { isNil } from 'ramda';
|
|
4
|
+
import {
|
|
5
|
+
IDragChangeInfo,
|
|
6
|
+
IKanbanController,
|
|
7
|
+
IKanbanEvent,
|
|
8
|
+
IKanbanState,
|
|
9
|
+
MDCtrlLoadParams,
|
|
10
|
+
} from '../../../interface';
|
|
11
|
+
import { calcDeCodeNameById } from '../../../model';
|
|
12
|
+
import { ControlVO } from '../../../service';
|
|
13
|
+
import { UIActionUtil } from '../../../ui-action';
|
|
14
|
+
import { ButtonContainerState, UIActionButtonState } from '../../utils';
|
|
15
|
+
import { DataViewControlController } from '../data-view';
|
|
16
|
+
import { KanbanService } from './kanban.service';
|
|
17
|
+
|
|
18
|
+
export class KanbanController
|
|
19
|
+
extends DataViewControlController<IDEKanban, IKanbanState, IKanbanEvent>
|
|
20
|
+
implements IKanbanController
|
|
21
|
+
{
|
|
22
|
+
/**
|
|
23
|
+
* 数据视图(卡片)部件服务
|
|
24
|
+
*
|
|
25
|
+
* @type {KanbanService}
|
|
26
|
+
* @memberof KanbanController
|
|
27
|
+
*/
|
|
28
|
+
declare service: KanbanService;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 允许调整顺序
|
|
32
|
+
* @author lxm
|
|
33
|
+
* @date 2023-09-11 04:02:39
|
|
34
|
+
* @readonly
|
|
35
|
+
* @type {boolean}
|
|
36
|
+
*/
|
|
37
|
+
get enableEditOrder(): boolean {
|
|
38
|
+
return this.model.enableCardEditOrder === true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 是否支持调整分组。
|
|
43
|
+
* @author lxm
|
|
44
|
+
* @date 2023-09-11 04:04:00
|
|
45
|
+
* @readonly
|
|
46
|
+
* @type {boolean}
|
|
47
|
+
*/
|
|
48
|
+
get enableEditGroup(): boolean {
|
|
49
|
+
return this.model.enableCardEditGroup === true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 是否允许新建
|
|
54
|
+
* @author lxm
|
|
55
|
+
* @date 2023-09-11 04:05:25
|
|
56
|
+
* @readonly
|
|
57
|
+
* @type {boolean}
|
|
58
|
+
*/
|
|
59
|
+
get enableNew(): boolean {
|
|
60
|
+
return this.model.enableCardNew === true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
protected async initControlService(): Promise<void> {
|
|
64
|
+
this.service = new KanbanService(this.model);
|
|
65
|
+
await this.service.init(this.context);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected initState(): void {
|
|
69
|
+
super.initState();
|
|
70
|
+
this.state.size = this.model.pagingSize || 1000;
|
|
71
|
+
this.state.updating = false;
|
|
72
|
+
// 支持调整顺序和分组时
|
|
73
|
+
this.state.draggable = this.enableEditOrder || this.enableEditGroup;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 初始化
|
|
78
|
+
*
|
|
79
|
+
* @protected
|
|
80
|
+
* @return {*} {Promise<void>}
|
|
81
|
+
* @memberof KanbanController
|
|
82
|
+
*/
|
|
83
|
+
protected async onCreated(): Promise<void> {
|
|
84
|
+
await super.onCreated();
|
|
85
|
+
await this.initGroupActionStates();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 初始化分组右侧界面行为按钮的状态
|
|
90
|
+
*
|
|
91
|
+
* @author chitanda
|
|
92
|
+
* @date 2023-08-02 17:08:04
|
|
93
|
+
* @return {*} {Promise<void>}
|
|
94
|
+
*/
|
|
95
|
+
async initGroupActionStates(): Promise<void> {
|
|
96
|
+
const { groupUIActionGroup } = this.model;
|
|
97
|
+
if (!groupUIActionGroup?.uiactionGroupDetails?.length) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const containerState = new ButtonContainerState();
|
|
101
|
+
groupUIActionGroup.uiactionGroupDetails.forEach(detail => {
|
|
102
|
+
const actionid = detail.uiactionId;
|
|
103
|
+
if (actionid) {
|
|
104
|
+
const buttonState = new UIActionButtonState(
|
|
105
|
+
detail.id!,
|
|
106
|
+
this.context.srfappid!,
|
|
107
|
+
actionid,
|
|
108
|
+
);
|
|
109
|
+
containerState.addState(detail.id!, buttonState);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
await containerState.update();
|
|
113
|
+
this.state.groupActionGroupState = containerState;
|
|
114
|
+
|
|
115
|
+
this.evt.on('onSelectionChange', event => {
|
|
116
|
+
let data = event.data[0];
|
|
117
|
+
if (data && data instanceof ControlVO) {
|
|
118
|
+
data = data.getOrigin();
|
|
119
|
+
}
|
|
120
|
+
if (data) {
|
|
121
|
+
this.state.groupActionGroupState!.update(
|
|
122
|
+
data,
|
|
123
|
+
this.model.appDataEntityId!,
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* 本地排序items
|
|
131
|
+
* @author lxm
|
|
132
|
+
* @date 2023-09-04 09:30:55
|
|
133
|
+
* @param {IData[]} items
|
|
134
|
+
*/
|
|
135
|
+
sortItems(items: IData[]): void {
|
|
136
|
+
const sortField = this.model.minorSortAppDEFieldId!;
|
|
137
|
+
const { minorSortDir } = this.model!;
|
|
138
|
+
if (!sortField) {
|
|
139
|
+
throw new RuntimeModelError(this.model, '排序属性没配置');
|
|
140
|
+
}
|
|
141
|
+
if (!minorSortDir) {
|
|
142
|
+
throw new RuntimeModelError(this.model, '排序方向没配置');
|
|
143
|
+
}
|
|
144
|
+
const isAsc = minorSortDir === 'ASC';
|
|
145
|
+
|
|
146
|
+
// 格式化排序属性的值
|
|
147
|
+
items.forEach(item => {
|
|
148
|
+
const sortValue = item[sortField];
|
|
149
|
+
if (isNil(sortValue)) {
|
|
150
|
+
item[sortField] = 0;
|
|
151
|
+
} else {
|
|
152
|
+
const toNum = Number(sortValue);
|
|
153
|
+
if (Number.isNaN(toNum)) {
|
|
154
|
+
throw new RuntimeError(
|
|
155
|
+
`${item.srfmajortext}的排序属性无法转换成数值`,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// 排序
|
|
162
|
+
items.sort((a, b) =>
|
|
163
|
+
isAsc ? a[sortField] - b[sortField] : b[sortField] - a[sortField],
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async afterLoad(args: MDCtrlLoadParams, items: IData[]): Promise<IData[]> {
|
|
168
|
+
// 每次加载回来先本地排序,把数据的排序属性规范一下
|
|
169
|
+
this.sortItems(this.state.items);
|
|
170
|
+
return super.afterLoad(args, items);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
handleDataGroup(): Promise<void> {
|
|
174
|
+
if (!this.model.enableGroup || this.model.groupMode === 'NONE') {
|
|
175
|
+
throw new RuntimeError('看板部件必须开启分组');
|
|
176
|
+
}
|
|
177
|
+
return super.handleDataGroup();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* 拖拽变更事件处理回调
|
|
182
|
+
* @author lxm
|
|
183
|
+
* @date 2023-09-11 04:12:58
|
|
184
|
+
* @param {IDragChangeInfo} info
|
|
185
|
+
* @return {*} {Promise<void>}
|
|
186
|
+
*/
|
|
187
|
+
async onDragChange(info: IDragChangeInfo): Promise<void> {
|
|
188
|
+
if (!this.enableEditGroup) {
|
|
189
|
+
if (info.from !== info.to) {
|
|
190
|
+
ibiz.message.warning('当前看板不允许调整分组!');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const isAsc = this.model.minorSortDir === 'ASC';
|
|
196
|
+
const { from, to, fromIndex, toIndex } = info;
|
|
197
|
+
const groupField = this.model.groupAppDEFieldId!;
|
|
198
|
+
const sortField = this.model.minorSortAppDEFieldId!;
|
|
199
|
+
const modifiedItems: IData[] = [];
|
|
200
|
+
const fromGroup = this.state.groups.find(x => x.key === from)!;
|
|
201
|
+
const toGroup = this.state.groups.find(x => x.key === to)!;
|
|
202
|
+
|
|
203
|
+
if (!this.enableEditOrder) {
|
|
204
|
+
if (info.from === info.to) {
|
|
205
|
+
ibiz.message.warning('当前看板不允许调整次序');
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// 只修改分组不管排序
|
|
210
|
+
const draggedItem = fromGroup.children[fromIndex];
|
|
211
|
+
draggedItem[groupField] = info.to; // 变更分组
|
|
212
|
+
return this.updateChangedItems([draggedItem] as ControlVO[]);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* 获取下一个100的倍数
|
|
217
|
+
* @author lxm
|
|
218
|
+
* @date 2023-09-11 10:03:46
|
|
219
|
+
* @param {number} num
|
|
220
|
+
* @return {*} {number}
|
|
221
|
+
*/
|
|
222
|
+
const getNextSort = (num: number): number => {
|
|
223
|
+
return num + (100 - (num % 100));
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
const originArr = [...toGroup.children];
|
|
227
|
+
const changedArr = [...toGroup.children];
|
|
228
|
+
|
|
229
|
+
// 计算出拖拽前和拖拽后的数组
|
|
230
|
+
const draggedItem = fromGroup.children[fromIndex];
|
|
231
|
+
if (info.from !== info.to) {
|
|
232
|
+
draggedItem[groupField] = info.to; // 变更分组
|
|
233
|
+
changedArr.splice(toIndex, 0, draggedItem);
|
|
234
|
+
} else {
|
|
235
|
+
changedArr.splice(fromIndex, 1);
|
|
236
|
+
changedArr.splice(toIndex, 0, draggedItem);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// 前台先改值
|
|
240
|
+
const removeItems = fromGroup.children.splice(fromIndex, 1);
|
|
241
|
+
toGroup.children.splice(toIndex, 0, ...removeItems);
|
|
242
|
+
|
|
243
|
+
// 降序把数组反转,保证两个数组都是从小到大排
|
|
244
|
+
if (!isAsc) {
|
|
245
|
+
originArr.reverse();
|
|
246
|
+
changedArr.reverse();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
let lastSort: number;
|
|
250
|
+
let cacheArr: IData[] = []; // 缓存的不修改数组
|
|
251
|
+
let cacheLastSort: number; // 缓存不修改数组第一个元素上一个排序值
|
|
252
|
+
changedArr.forEach((item, index) => {
|
|
253
|
+
if (lastSort === undefined) {
|
|
254
|
+
// 第一次出现要调整顺序的,如果不是0用原来位置的排序值,否则使用100
|
|
255
|
+
if (item !== originArr[index]) {
|
|
256
|
+
if (!originArr[index]) {
|
|
257
|
+
// 从别的分组挪进来的且处于末尾时使用上一个元素的排序值的后一个100
|
|
258
|
+
lastSort =
|
|
259
|
+
index === 0 ? 100 : getNextSort(originArr[index - 1][sortField]);
|
|
260
|
+
} else {
|
|
261
|
+
lastSort = originArr[index][sortField] || 100; // 如果是0的时候给100否则用原来的
|
|
262
|
+
}
|
|
263
|
+
item[sortField] = lastSort;
|
|
264
|
+
modifiedItems.push(item);
|
|
265
|
+
}
|
|
266
|
+
} else {
|
|
267
|
+
// 如果当前排序值比上一个小,提升它的排序值
|
|
268
|
+
if (lastSort >= item[sortField]) {
|
|
269
|
+
if (cacheArr.length > 0) {
|
|
270
|
+
cacheArr.forEach(cache => {
|
|
271
|
+
cache[sortField] = getNextSort(cacheLastSort);
|
|
272
|
+
modifiedItems.push(cache);
|
|
273
|
+
cacheLastSort = cache[sortField];
|
|
274
|
+
});
|
|
275
|
+
lastSort = cacheLastSort;
|
|
276
|
+
cacheLastSort = 0;
|
|
277
|
+
cacheArr = [];
|
|
278
|
+
}
|
|
279
|
+
item[sortField] = getNextSort(lastSort);
|
|
280
|
+
modifiedItems.push(item);
|
|
281
|
+
} else {
|
|
282
|
+
if (cacheArr.length === 0) {
|
|
283
|
+
cacheLastSort = lastSort;
|
|
284
|
+
}
|
|
285
|
+
cacheArr.push(item);
|
|
286
|
+
}
|
|
287
|
+
lastSort = item[sortField];
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
this.updateChangedItems(modifiedItems as ControlVO[]);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* 批量更新修改的项,并更新后台返回的数据,然后重新计算分组和排序
|
|
296
|
+
* @author lxm
|
|
297
|
+
* @date 2023-09-11 04:13:15
|
|
298
|
+
* @param {ControlVO[]} changedItems
|
|
299
|
+
* @return {*} {Promise<void>}
|
|
300
|
+
*/
|
|
301
|
+
async updateChangedItems(changedItems: ControlVO[]): Promise<void> {
|
|
302
|
+
try {
|
|
303
|
+
this.state.updating = true;
|
|
304
|
+
await Promise.all(
|
|
305
|
+
changedItems.map(async item => {
|
|
306
|
+
// 往上下文添加主键
|
|
307
|
+
const deName = calcDeCodeNameById(this.model.appDataEntityId!);
|
|
308
|
+
const tempContext = this.context.clone();
|
|
309
|
+
tempContext[deName] = item.srfkey;
|
|
310
|
+
|
|
311
|
+
// 调用接口修改数据
|
|
312
|
+
const res = await this.service.updateGroup(tempContext, item);
|
|
313
|
+
|
|
314
|
+
// 更新完之后更新state里的数据。
|
|
315
|
+
if (res.data) {
|
|
316
|
+
const index = this.state.items.findIndex(
|
|
317
|
+
x => x.srfkey === item.srfkey,
|
|
318
|
+
);
|
|
319
|
+
this.state.items.splice(index, 1, res.data);
|
|
320
|
+
}
|
|
321
|
+
}),
|
|
322
|
+
);
|
|
323
|
+
} finally {
|
|
324
|
+
this.state.updating = false;
|
|
325
|
+
await this.afterLoad({}, this.state.items);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* 点击新建
|
|
331
|
+
* @author lxm
|
|
332
|
+
* @date 2023-09-11 07:22:33
|
|
333
|
+
* @param {MouseEvent} event
|
|
334
|
+
* @param {(string | number)} group 分组标识
|
|
335
|
+
*/
|
|
336
|
+
onClickNew(event: MouseEvent, group: string | number): void {
|
|
337
|
+
const params = { ...this.params, srfgroup: group };
|
|
338
|
+
UIActionUtil.execAndResolved('new', {
|
|
339
|
+
context: this.context,
|
|
340
|
+
params,
|
|
341
|
+
data: [],
|
|
342
|
+
view: this.view,
|
|
343
|
+
event,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* 分组工具栏点击处理回调
|
|
349
|
+
* @author lxm
|
|
350
|
+
* @date 2023-09-11 04:48:06
|
|
351
|
+
* @param {IUIActionGroupDetail} detail
|
|
352
|
+
* @param {MouseEvent} event
|
|
353
|
+
* @return {*} {Promise<void>}
|
|
354
|
+
*/
|
|
355
|
+
async onGroupToolbarClick(
|
|
356
|
+
detail: IUIActionGroupDetail,
|
|
357
|
+
event: MouseEvent,
|
|
358
|
+
group: string | number,
|
|
359
|
+
): Promise<void> {
|
|
360
|
+
const actionId = detail.uiactionId;
|
|
361
|
+
const params = { ...this.params, srfgroup: group };
|
|
362
|
+
await UIActionUtil.execAndResolved(actionId!, {
|
|
363
|
+
context: this.context,
|
|
364
|
+
params,
|
|
365
|
+
data: this.state.selectedData,
|
|
366
|
+
view: this.view,
|
|
367
|
+
event,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|