@ibiz-template/model-helper 0.7.41-alpha.104 → 0.7.41-alpha.106
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/package.json +5 -4
- package/src/index.ts +7 -0
- package/src/locale/en/index.ts +16 -0
- package/src/locale/index.ts +2 -0
- package/src/locale/zh-CN/index.ts +14 -0
- package/src/model/PSSYSAPP.ts +12 -0
- package/src/model-helper.ts +804 -0
- package/src/model-loader.ts +95 -0
- package/src/model-util.ts +467 -0
- package/src/utils/format-path/format-path.ts +9 -0
- package/src/utils/index.ts +9 -0
- package/src/utils/merge-model/merge-app-codelist.ts +42 -0
- package/src/utils/merge-model/merge-app-menu.ts +136 -0
- package/src/utils/merge-model/merge-app-uiaction-group.ts +85 -0
- package/src/utils/merge-model/merge-de-drcontrol.ts +175 -0
- package/src/utils/merge-model/merge-de-form.ts +326 -0
- package/src/utils/merge-model/merge-model-helper.ts +602 -0
- package/src/utils/merge-model/merge-model.ts +20 -0
- package/src/utils/merge-model/merge-treeview.ts +197 -0
- package/src/utils/plural/plural.ts +30 -0
- package/src/utils/service-path-util/service-path-util.ts +361 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { IAppMenuItem, IAppMenuModel } from '@ibiz/model-core';
|
|
3
|
+
import { clone } from 'ramda';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 递归合并主菜单项和子菜单项
|
|
7
|
+
* @author lxm
|
|
8
|
+
* @date 2023-12-07 03:16:13
|
|
9
|
+
* @param {IAppMenuItem} mainItem
|
|
10
|
+
* @param {IAppMenuItem} subItem
|
|
11
|
+
*/
|
|
12
|
+
function mergeMenuItem(
|
|
13
|
+
mainItem: IAppMenuItem,
|
|
14
|
+
subItem: IAppMenuItem,
|
|
15
|
+
isReverse: boolean = false,
|
|
16
|
+
): void {
|
|
17
|
+
// 主菜单项没有子菜单项直接合并替换
|
|
18
|
+
if (!mainItem.appMenuItems?.length) {
|
|
19
|
+
if (subItem.appMenuItems?.length) {
|
|
20
|
+
// 子菜单有下级菜单的时候只是添加下级菜单
|
|
21
|
+
mainItem.appMenuItems = subItem.appMenuItems;
|
|
22
|
+
} else {
|
|
23
|
+
// 子菜单项也没有下级菜单的时候覆盖(不应合并,场景:主菜单项隐藏,有hidden:true的数据,子菜单项显示,无hidden字段,合并还是会隐藏)
|
|
24
|
+
Object.keys(mainItem).forEach((key: string) => {
|
|
25
|
+
// 1.合并动态字段场景:如,accessKey,子应用有的话以子应用为准,子应用没有的话,主应用数据为准
|
|
26
|
+
if (key === 'accessKey' && !subItem[key]) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// 2. 常规场景:以子应用为准即可
|
|
30
|
+
delete (mainItem as any)[key];
|
|
31
|
+
});
|
|
32
|
+
Object.assign(mainItem, subItem);
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
const addItems: IAppMenuItem[] = [];
|
|
36
|
+
subItem.appMenuItems?.forEach(item => {
|
|
37
|
+
const sameMenu = mainItem.appMenuItems?.find(x => x.id === item.id);
|
|
38
|
+
if (sameMenu) {
|
|
39
|
+
mergeMenuItem(sameMenu, item);
|
|
40
|
+
} else {
|
|
41
|
+
addItems.push(item);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
if (isReverse) {
|
|
45
|
+
mainItem.appMenuItems = addItems.concat(mainItem.appMenuItems);
|
|
46
|
+
} else {
|
|
47
|
+
mainItem.appMenuItems.push(...addItems);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 合并切分菜单
|
|
54
|
+
*
|
|
55
|
+
* @author tony001
|
|
56
|
+
* @date 2024-09-26 18:09:31
|
|
57
|
+
* @export
|
|
58
|
+
* @param {IAppMenuModel} main
|
|
59
|
+
* @param {IAppMenuModel} sub
|
|
60
|
+
*/
|
|
61
|
+
export function mergeSplitAppMenu(
|
|
62
|
+
main: IAppMenuModel,
|
|
63
|
+
sub: IAppMenuModel,
|
|
64
|
+
isReverse: boolean = false,
|
|
65
|
+
): void {
|
|
66
|
+
const addItems: IAppMenuItem[] = [];
|
|
67
|
+
sub.appMenuItems?.forEach(item => {
|
|
68
|
+
const sameMenu = main.appMenuItems?.find(x => x.id === item.id);
|
|
69
|
+
if (sameMenu) {
|
|
70
|
+
mergeMenuItem(sameMenu, item, isReverse);
|
|
71
|
+
} else {
|
|
72
|
+
addItems.push(item);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (!main.appMenuItems) {
|
|
77
|
+
main.appMenuItems = [];
|
|
78
|
+
}
|
|
79
|
+
if (isReverse) {
|
|
80
|
+
main.appMenuItems = addItems.concat(main.appMenuItems);
|
|
81
|
+
} else {
|
|
82
|
+
main.appMenuItems.push(...addItems);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 合并主菜单和子菜单
|
|
88
|
+
* @author lxm
|
|
89
|
+
* @date 2023-12-07 03:15:54
|
|
90
|
+
* @param {IAppMenuModel} main
|
|
91
|
+
* @param {IAppMenuModel} sub
|
|
92
|
+
*/
|
|
93
|
+
export function mergeAppMenu(main: IAppMenuModel, sub: IAppMenuModel): void {
|
|
94
|
+
if (!main.appMenuItems) {
|
|
95
|
+
main.appMenuItems = [];
|
|
96
|
+
}
|
|
97
|
+
if (!sub.appMenuItems) {
|
|
98
|
+
sub.appMenuItems = [];
|
|
99
|
+
}
|
|
100
|
+
// 主菜单分割下标
|
|
101
|
+
const mainSplitIndex = main.appMenuItems.findIndex(item => {
|
|
102
|
+
return item.itemType === 'SEPERATOR' && item.spanMode;
|
|
103
|
+
});
|
|
104
|
+
// 子菜单分割下标
|
|
105
|
+
const subSplitIndex = sub.appMenuItems.findIndex(item => {
|
|
106
|
+
return item.itemType === 'SEPERATOR' && item.spanMode;
|
|
107
|
+
});
|
|
108
|
+
// 主菜单无分割,子菜单有or无分割,全整添加到主菜单
|
|
109
|
+
if (mainSplitIndex === -1) {
|
|
110
|
+
mergeSplitAppMenu(main, sub);
|
|
111
|
+
} else {
|
|
112
|
+
const topMainAppMenu = clone(main);
|
|
113
|
+
const bottomMainAppMenu = clone(main);
|
|
114
|
+
topMainAppMenu.appMenuItems =
|
|
115
|
+
topMainAppMenu.appMenuItems?.slice(0, mainSplitIndex) || [];
|
|
116
|
+
bottomMainAppMenu.appMenuItems =
|
|
117
|
+
bottomMainAppMenu.appMenuItems?.slice(mainSplitIndex + 1) || [];
|
|
118
|
+
if (subSplitIndex === -1) {
|
|
119
|
+
// 主菜单有分割,子菜单无分割,添加到主菜单头部上
|
|
120
|
+
mergeSplitAppMenu(topMainAppMenu, sub);
|
|
121
|
+
} else {
|
|
122
|
+
// 主菜单有分割,子菜单有分割,隐射添加到主菜单
|
|
123
|
+
const topSubAppMenu = clone(sub);
|
|
124
|
+
const bottomSubAppMenu = clone(sub);
|
|
125
|
+
topSubAppMenu.appMenuItems =
|
|
126
|
+
topSubAppMenu.appMenuItems?.slice(0, subSplitIndex) || [];
|
|
127
|
+
bottomSubAppMenu.appMenuItems =
|
|
128
|
+
bottomSubAppMenu.appMenuItems?.slice(subSplitIndex + 1) || [];
|
|
129
|
+
mergeSplitAppMenu(topMainAppMenu, topSubAppMenu);
|
|
130
|
+
mergeSplitAppMenu(bottomMainAppMenu, bottomSubAppMenu, true);
|
|
131
|
+
}
|
|
132
|
+
main.appMenuItems = topMainAppMenu.appMenuItems
|
|
133
|
+
.concat(main.appMenuItems[mainSplitIndex])
|
|
134
|
+
.concat(bottomMainAppMenu.appMenuItems || []);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* eslint-disable no-useless-return */
|
|
2
|
+
import { IUIActionGroup, IUIActionGroupDetail } from '@ibiz/model-core';
|
|
3
|
+
// dynamic_overlay:before|after|replace|delete:detailid
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 解析动态覆盖标签字符串,提取位置信息和目标ID
|
|
7
|
+
*
|
|
8
|
+
* @param tag - 要解析的标签字符串,格式应为 "dynamic_overlay:position:targetId"
|
|
9
|
+
* @returns 如果解析成功,返回包含position和targetId的对象;否则返回null
|
|
10
|
+
*/
|
|
11
|
+
function parseDynamicOverlay(
|
|
12
|
+
tag: string,
|
|
13
|
+
): { position: string; targetId: string } | null {
|
|
14
|
+
if (!tag) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const match = tag.match(
|
|
18
|
+
/^dynamic_overlay:(before|after|replace|delete):(.+)$/,
|
|
19
|
+
);
|
|
20
|
+
if (match) {
|
|
21
|
+
return { position: match[1], targetId: match[2] };
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 合并两个界面行为组
|
|
28
|
+
*
|
|
29
|
+
* @param dst 目标界面行为组,用于接收合并结果
|
|
30
|
+
* @param src 源界面行为组,提供要合并的数据
|
|
31
|
+
* @returns 无返回值,直接修改目标对象
|
|
32
|
+
*/
|
|
33
|
+
export function mergeAppDEUIActionGroup(
|
|
34
|
+
dst: IUIActionGroup | undefined,
|
|
35
|
+
src: IUIActionGroup | undefined,
|
|
36
|
+
): void {
|
|
37
|
+
if (!dst || !src) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// 合并界面行为组项,根据界面行为组成员用户标记(格式如:dynamic_overlay:before|after|replace|delete:detailid)进行合并,如格式不满足则添加到末尾,如没有用户标记,则直接添加到末尾
|
|
41
|
+
if (src.uiactionGroupDetails) {
|
|
42
|
+
if (!dst.uiactionGroupDetails) {
|
|
43
|
+
dst.uiactionGroupDetails = [];
|
|
44
|
+
}
|
|
45
|
+
src.uiactionGroupDetails.forEach((item: IModel) => {
|
|
46
|
+
const overlayInfo = parseDynamicOverlay(item.userTag);
|
|
47
|
+
if (overlayInfo && overlayInfo.position && overlayInfo.targetId) {
|
|
48
|
+
const targetIndex = dst.uiactionGroupDetails!.findIndex(
|
|
49
|
+
(x: IModel) => x.id === overlayInfo.targetId,
|
|
50
|
+
);
|
|
51
|
+
if (targetIndex !== -1) {
|
|
52
|
+
switch (overlayInfo.position) {
|
|
53
|
+
case 'before':
|
|
54
|
+
dst.uiactionGroupDetails!.splice(
|
|
55
|
+
targetIndex,
|
|
56
|
+
0,
|
|
57
|
+
item as IUIActionGroupDetail,
|
|
58
|
+
);
|
|
59
|
+
break;
|
|
60
|
+
case 'after':
|
|
61
|
+
dst.uiactionGroupDetails!.splice(
|
|
62
|
+
targetIndex + 1,
|
|
63
|
+
0,
|
|
64
|
+
item as IUIActionGroupDetail,
|
|
65
|
+
);
|
|
66
|
+
break;
|
|
67
|
+
case 'replace':
|
|
68
|
+
dst.uiactionGroupDetails![targetIndex] = item as IUIActionGroup;
|
|
69
|
+
break;
|
|
70
|
+
case 'delete':
|
|
71
|
+
dst.uiactionGroupDetails!.splice(targetIndex, 1);
|
|
72
|
+
break;
|
|
73
|
+
default:
|
|
74
|
+
dst.uiactionGroupDetails!.push(item as IUIActionGroupDetail);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
dst.uiactionGroupDetails!.push(item as IUIActionGroupDetail);
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
dst.uiactionGroupDetails!.push(item as IUIActionGroupDetail);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/* eslint-disable prefer-destructuring */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
3
|
+
|
|
4
|
+
import { IAppViewRef, IControl, ITabExpPanel } from '@ibiz/model-core';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 合并DrCtrl控件
|
|
8
|
+
*
|
|
9
|
+
* @author tony001
|
|
10
|
+
* @date 2024-04-29 19:04:44
|
|
11
|
+
* @export
|
|
12
|
+
* @param {IModel} dstDRCtrl
|
|
13
|
+
* @param {IModel} srcDRCtrl
|
|
14
|
+
* @return {*} {void}
|
|
15
|
+
*/
|
|
16
|
+
export function mergeDEDrControl(dstDRCtrl: IModel, srcDRCtrl: IModel): void {
|
|
17
|
+
if (!srcDRCtrl) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// 合并分组(相同id替换,如果分组项定义用户标记(格式如:dynamic_overlay:BEFORE/AFTER:目标分组id),则需要找到目标分组,则根据位置在目标项前后附加,没有则附加)
|
|
21
|
+
if (srcDRCtrl.dedrbarGroups) {
|
|
22
|
+
srcDRCtrl.dedrbarGroups.forEach((item1: IModel) => {
|
|
23
|
+
let index: number = 0;
|
|
24
|
+
const result = dstDRCtrl.dedrbarGroups?.find(
|
|
25
|
+
(item2: IModel, index2: number) => {
|
|
26
|
+
index = index2;
|
|
27
|
+
return item1.name === item2.name;
|
|
28
|
+
},
|
|
29
|
+
);
|
|
30
|
+
if (result) {
|
|
31
|
+
dstDRCtrl.dedrbarGroups[index] = item1;
|
|
32
|
+
} else if (item1.userTag && item1.userTag.startsWith('dynamic_overlay')) {
|
|
33
|
+
const [dynaTag, targetPosition, targetTag] = item1.userTag.split(':');
|
|
34
|
+
const targetIndex = dstDRCtrl.dedrbarGroups.findIndex(
|
|
35
|
+
(item3: IModel) => item3.id === targetTag,
|
|
36
|
+
);
|
|
37
|
+
if (targetIndex !== -1) {
|
|
38
|
+
if (targetPosition === 'BEFORE') {
|
|
39
|
+
dstDRCtrl.dedrbarGroups.splice(targetIndex, 0, item1);
|
|
40
|
+
} else if (targetPosition === 'AFTER') {
|
|
41
|
+
dstDRCtrl.dedrbarGroups.splice(targetIndex + 1, 0, item1);
|
|
42
|
+
} else {
|
|
43
|
+
dstDRCtrl.dedrbarGroups.push(item1);
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
dstDRCtrl.dedrbarGroups.push(item1);
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
dstDRCtrl.dedrbarGroups.push(item1);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// 合并分组项(相同id替换,如果项成员项定义成员标记(格式如:dynamic_overlay:BEFORE/AFTER:目标项id),则需要找到目标项,则根据位置在目标项前后附加,没有则附加)
|
|
54
|
+
if (srcDRCtrl.dedrctrlItems) {
|
|
55
|
+
srcDRCtrl.dedrctrlItems.forEach((item1: IModel) => {
|
|
56
|
+
let index: number = 0;
|
|
57
|
+
const result = dstDRCtrl.dedrctrlItems.find(
|
|
58
|
+
(item2: IModel, index2: number) => {
|
|
59
|
+
index = index2;
|
|
60
|
+
return item1.id === item2.id;
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
if (result) {
|
|
64
|
+
dstDRCtrl.dedrctrlItems[index] = item1;
|
|
65
|
+
} else if (item1.itemTag && item1.itemTag.startsWith('dynamic_overlay')) {
|
|
66
|
+
const [dynaTag, targetPosition, targetTag] = item1.itemTag.split(':');
|
|
67
|
+
const targetIndex = dstDRCtrl.dedrctrlItems.findIndex(
|
|
68
|
+
(item3: IModel) => item3.id === targetTag,
|
|
69
|
+
);
|
|
70
|
+
if (targetIndex !== -1) {
|
|
71
|
+
if (targetPosition === 'BEFORE') {
|
|
72
|
+
dstDRCtrl.dedrctrlItems.splice(targetIndex, 0, item1);
|
|
73
|
+
} else if (targetPosition === 'AFTER') {
|
|
74
|
+
dstDRCtrl.dedrctrlItems.splice(targetIndex + 1, 0, item1);
|
|
75
|
+
} else {
|
|
76
|
+
dstDRCtrl.dedrctrlItems.push(item1);
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
dstDRCtrl.dedrctrlItems.push(item1);
|
|
80
|
+
}
|
|
81
|
+
} else {
|
|
82
|
+
dstDRCtrl.dedrctrlItems.push(item1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 合并分组项(相同id替换,如果tab成员项定义成员标记(格式如:BEFORE/AFTER:目标项id或者dynamic_overlay:BEFORE/AFTER:目标项id),则需要找到目标项,则根据位置在目标项前后附加),没有则附加到尾部
|
|
88
|
+
if (srcDRCtrl.dedrtabPages) {
|
|
89
|
+
srcDRCtrl.dedrtabPages.forEach((item1: IModel) => {
|
|
90
|
+
let index: number = 0;
|
|
91
|
+
const result = dstDRCtrl.dedrtabPages.find(
|
|
92
|
+
(item2: IModel, index2: number) => {
|
|
93
|
+
index = index2;
|
|
94
|
+
return item1.id === item2.id;
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
if (result) {
|
|
98
|
+
dstDRCtrl.dedrtabPages[index] = item1;
|
|
99
|
+
} else if (item1.itemTag) {
|
|
100
|
+
// 兼容BEFORE/AFTER:目标项id或者dynamic_overlay:BEFORE/AFTER:目标项id2种格式
|
|
101
|
+
const splitTags = item1.itemTag.split(':');
|
|
102
|
+
let targetPosition = '';
|
|
103
|
+
let targetTag = '';
|
|
104
|
+
|
|
105
|
+
// 只处理符合预期格式的情况
|
|
106
|
+
if (splitTags.length === 2 || splitTags.length === 3) {
|
|
107
|
+
targetPosition = splitTags[splitTags.length === 2 ? 0 : 1];
|
|
108
|
+
targetTag = splitTags[splitTags.length === 2 ? 1 : 2];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (!targetTag || !targetPosition) {
|
|
112
|
+
dstDRCtrl.dedrtabPages.push(item1);
|
|
113
|
+
} else {
|
|
114
|
+
const targetIndex = dstDRCtrl.dedrtabPages.findIndex(
|
|
115
|
+
(item3: IModel) => item3.id === targetTag,
|
|
116
|
+
);
|
|
117
|
+
if (targetIndex !== -1) {
|
|
118
|
+
if (targetPosition === 'BEFORE') {
|
|
119
|
+
dstDRCtrl.dedrtabPages.splice(targetIndex, 0, item1);
|
|
120
|
+
} else if (targetPosition === 'AFTER') {
|
|
121
|
+
dstDRCtrl.dedrtabPages.splice(targetIndex + 1, 0, item1);
|
|
122
|
+
} else {
|
|
123
|
+
dstDRCtrl.dedrtabPages.push(item1);
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
dstDRCtrl.dedrtabPages.push(item1);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
dstDRCtrl.dedrtabPages.push(item1);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 合并分页导航面板
|
|
138
|
+
* @param dstTabExpPanel
|
|
139
|
+
* @param srcTabExpPanel
|
|
140
|
+
* @returns
|
|
141
|
+
*/
|
|
142
|
+
export function mergeDETabExpPanel(
|
|
143
|
+
dstTabExpPanel: ITabExpPanel,
|
|
144
|
+
srcTabExpPanel: ITabExpPanel,
|
|
145
|
+
): void {
|
|
146
|
+
if (!srcTabExpPanel || !dstTabExpPanel) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// 无数据时初始化
|
|
150
|
+
if (!dstTabExpPanel.tabExpPageIds) {
|
|
151
|
+
dstTabExpPanel.tabExpPageIds = [];
|
|
152
|
+
}
|
|
153
|
+
if (!dstTabExpPanel.appViewRefs) {
|
|
154
|
+
dstTabExpPanel.appViewRefs = [];
|
|
155
|
+
}
|
|
156
|
+
if (!dstTabExpPanel.controls) {
|
|
157
|
+
dstTabExpPanel.controls = [];
|
|
158
|
+
}
|
|
159
|
+
// 合并子应用分页导航面板
|
|
160
|
+
if (srcTabExpPanel.tabExpPageIds) {
|
|
161
|
+
srcTabExpPanel.tabExpPageIds.forEach((id1: string) => {
|
|
162
|
+
dstTabExpPanel.tabExpPageIds!.push(id1);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
if (srcTabExpPanel.appViewRefs) {
|
|
166
|
+
srcTabExpPanel.appViewRefs.forEach((item1: IAppViewRef) => {
|
|
167
|
+
dstTabExpPanel.appViewRefs!.push(item1);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (srcTabExpPanel.controls) {
|
|
171
|
+
srcTabExpPanel.controls.forEach((item1: IControl) => {
|
|
172
|
+
dstTabExpPanel.controls!.push(item1);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|