424 lines
15 KiB
TypeScript
424 lines
15 KiB
TypeScript
import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';
|
||
import { ModalHelper, _HttpClient } from '@delon/theme';
|
||
import { EAEnvironmentService } from '@shared';
|
||
import { NzTreeComponent } from 'ng-zorro-antd/tree';
|
||
import { SystemService } from '../../../services/system.service';
|
||
|
||
@Component({
|
||
selector: 'app-cuc-menu',
|
||
templateUrl: './menu.component.html',
|
||
styleUrls: ['menu.less']
|
||
})
|
||
export class SettingMenuComponent implements OnInit, OnChanges {
|
||
@ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent;
|
||
origin: any = { buttonInfoList: [], dictList: [] };
|
||
node: any = {};
|
||
authority: any[] = [];
|
||
defaultSelectedKeys: any[] = [];
|
||
defaultExpandedKeys: any[] = [];
|
||
defaultCheckedKeys: any[] = [];
|
||
functionList: any[] = [];
|
||
allChecked = false;
|
||
indeterminate = true;
|
||
@Input() type = 'edit';
|
||
@Input() source = '';
|
||
@Input() appId = this.envSrv.env.appId;
|
||
@Input() isAuthorityIdDTOList: any[] = [];
|
||
@Input() authorityAssistId: any[] = [];
|
||
@Input() roleId: any;
|
||
@Output() changeIF= new EventEmitter();
|
||
@Output() changeData = new EventEmitter();
|
||
constructor(public service: SystemService, private cdr: ChangeDetectorRef, private envSrv: EAEnvironmentService) {}
|
||
ngOnChanges(changes: SimpleChanges): void {
|
||
if (changes.isAuthorityIdDTOList) {
|
||
if (this.type === 'edit') {
|
||
this.authority = this.isAuthorityIdDTOList || [];
|
||
}
|
||
}
|
||
if (changes.authorityAssistId) {
|
||
this.defaultCheckedKeys = [...this.authorityAssistId];
|
||
}
|
||
}
|
||
|
||
ngOnInit() {
|
||
this.getAllFunction();
|
||
}
|
||
getAllFunction() {
|
||
this.service
|
||
.request(this.service.$api_getAllFunctionInfoByAppId, { appId: this.appId || this.envSrv.env.appId }, 'POST', true, 'FORM')
|
||
.subscribe(res => {
|
||
// if (this.source === 'onlyRelationAuth') {
|
||
// this.addDisabledTree(res);
|
||
// } else {
|
||
// // this.addDisabledLeafTree(res);
|
||
// }
|
||
this.functionList = res;
|
||
this.defaultCheckedKeys = this.authorityAssistId;
|
||
this.cdr.detectChanges();
|
||
});
|
||
}
|
||
addAuthority(origin: { id: any; all: any }, node: { buttonInfoList: any[] }, item?: { checked: any; functionButtonId: any }) {
|
||
console.log(origin,node);
|
||
|
||
if (this.authority?.length && this.authority.filter(authItem => authItem.authorityId === origin.id).length) {
|
||
// 判断此菜单权限是否已经存在权限列表中
|
||
// 当前操作菜单id存在权限列表里
|
||
this.authority.forEach(menuItem => {
|
||
|
||
if (menuItem.authorityId === origin.id) {
|
||
menuItem.buttonAuthorityIds = menuItem.buttonAuthorityIds || []; // 防止属性不存在,给属性指定数据类型
|
||
if (item) {
|
||
this.changeIF.emit(true);
|
||
// 单选
|
||
if (item.checked) {
|
||
if (menuItem.buttonAuthorityIds.indexOf(item.functionButtonId) === -1) {
|
||
// 如果该按钮在数据权限数组中不存在
|
||
console.log('不存在');
|
||
|
||
menuItem.buttonAuthorityIds.push(item.functionButtonId);
|
||
}
|
||
} else {
|
||
console.log('存在');
|
||
if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) {
|
||
menuItem.buttonAuthorityIds.forEach((btnItem: any, index: any) => {
|
||
if (btnItem === item.functionButtonId) {
|
||
menuItem.buttonAuthorityIds.splice(index, 1);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
} else {
|
||
// 全选
|
||
if (origin.all) {
|
||
node.buttonInfoList.forEach((nodeItem: { id: any; checked: boolean }) => {
|
||
if (menuItem.buttonAuthorityIds.indexOf(nodeItem.id) === -1) {
|
||
menuItem.buttonAuthorityIds.push(nodeItem.id);
|
||
nodeItem.checked = true;
|
||
}
|
||
});
|
||
} else {
|
||
if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) {
|
||
menuItem.buttonAuthorityIds = [];
|
||
node.buttonInfoList.forEach((nodeItem: { checked: boolean }) => {
|
||
nodeItem.checked = false;
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
// 数组为空的时候
|
||
const buttonAuthorityIds = [];
|
||
if (item) {
|
||
// 全选
|
||
buttonAuthorityIds.push(item.functionButtonId);
|
||
} else {
|
||
node.buttonInfoList.forEach((nodeItem: { id: any; checked: boolean; _isHalfChecked: boolean }) => {
|
||
if (origin.all) {
|
||
buttonAuthorityIds.push(nodeItem.id);
|
||
nodeItem.checked = true;
|
||
}
|
||
});
|
||
}
|
||
const obj: any = {
|
||
authorityId: origin.id,
|
||
buttonAuthorityIds
|
||
};
|
||
this.authority.push(obj);
|
||
}
|
||
this.checkTreeNode(node, origin);
|
||
}
|
||
|
||
addDict(item: { checked: any; itemId: any; itemKey: any }, dictItem: { dictId: any }, origin: { id: any }, node: any) {
|
||
if (this.authority.length) {
|
||
// 判断此菜单权限是否已经存在权限列表中
|
||
if (this.authority.filter(authItem => authItem.authorityId === origin.id).length) {
|
||
// 当前操作菜单id存在权限列表里
|
||
this.authority.forEach((menuItem, menuIndex) => {
|
||
if (menuItem.authorityId === origin.id) {
|
||
menuItem.dataAuthority = menuItem.dataAuthority || []; // 防止属性不存在,给属性指定数据类型
|
||
if (item.checked) {
|
||
if (menuItem.dataAuthority.filter((ele: { dictItemId: any }) => ele.dictItemId === item.itemId).length === 0) {
|
||
// 如果该按钮在数据权限数组中不存在
|
||
menuItem.dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId });
|
||
}
|
||
} else {
|
||
if (menuItem.dataAuthority && menuItem.dataAuthority.length) {
|
||
menuItem.dataAuthority.forEach((btnItem: { dictItemId: any }, index: any) => {
|
||
if (btnItem.dictItemId === item.itemId) {
|
||
menuItem.dataAuthority.splice(index, 1);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
// 当前操作菜单id不存在权限列表里
|
||
const dataAuthority = [];
|
||
dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId });
|
||
const obj: any = {
|
||
authorityId: origin.id,
|
||
dataAuthority
|
||
};
|
||
this.authority.push(obj);
|
||
}
|
||
} else {
|
||
// 数组为空的时候
|
||
const dataAuthority = [];
|
||
dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId });
|
||
const obj: any = {
|
||
authorityId: origin.id,
|
||
dataAuthority
|
||
};
|
||
this.authority.push(obj);
|
||
}
|
||
this.checkTreeNode(node, origin);
|
||
}
|
||
|
||
checkTreeNode(node: any, origin: { id: any }) {
|
||
const checkedNode: any = this.nzTreeComponent.getCheckedNodeList();
|
||
const allCheckedArr: any[] = [];
|
||
this.overTree(checkedNode, allCheckedArr);
|
||
this.authority.forEach(authItem => {
|
||
if (authItem.authorityId === origin.id) {
|
||
if (
|
||
(authItem.buttonAuthorityIds && authItem.buttonAuthorityIds.length) ||
|
||
(authItem.dataAuthority && authItem.dataAuthority.length)
|
||
) {
|
||
if (allCheckedArr.indexOf(node.key) === -1) {
|
||
allCheckedArr.push(node.key);
|
||
}
|
||
} else {
|
||
if (allCheckedArr.indexOf(node.key) !== -1) {
|
||
allCheckedArr.forEach((ele, index) => {
|
||
if (ele === origin.id) {
|
||
allCheckedArr.splice(index, 1);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
});
|
||
this.defaultCheckedKeys = allCheckedArr;
|
||
}
|
||
|
||
overTree(children: any[], a: any[]) {
|
||
children.forEach(item => {
|
||
a.push(item.key);
|
||
if (item.isLeaf) {
|
||
return;
|
||
}
|
||
if (item.children && item.children.length) {
|
||
this.overTree(item.children, a);
|
||
}
|
||
});
|
||
}
|
||
|
||
addDisabledTree(arr: any[]) {
|
||
arr.forEach((item: any) => {
|
||
item.disableCheckbox = true;
|
||
if (item.isLeaf) {
|
||
return;
|
||
}
|
||
if (item.children && item.children.length) {
|
||
this.addDisabledTree(item.children);
|
||
}
|
||
});
|
||
}
|
||
addDisabledLeafTree(arr: any[]) {
|
||
arr.forEach((item: any) => {
|
||
if (item.isLeaf) {
|
||
return;
|
||
}
|
||
item.disableCheckbox = true;
|
||
if (item.children && item.children.length) {
|
||
this.addDisabledLeafTree(item.children);
|
||
}
|
||
});
|
||
}
|
||
nzEvent(event: any): void {
|
||
this.origin = event.node.origin;
|
||
this.node = event.node.origin;
|
||
if (!event.node.origin.isLeaf) {
|
||
event.node.isExpanded = !event.node.isExpanded;
|
||
} else {
|
||
this.initButtonList(event.node.key, event.node.origin);
|
||
// this.initDictList(event.node.key, event.node.origin);
|
||
}
|
||
}
|
||
|
||
washTree() {
|
||
const authorityMenu: any[] = []; // this.authority
|
||
const tempAuthorityIdDTOListMenu: any[] = [];
|
||
const checkedNode: any = this.nzTreeComponent.getCheckedNodeList();
|
||
const halfCheckedNode: any = this.nzTreeComponent.getHalfCheckedNodeList();
|
||
this.authorityAssistId = [];
|
||
halfCheckedNode.forEach((item: { key: any }) => {
|
||
authorityMenu.push({ authorityId: item.key });
|
||
tempAuthorityIdDTOListMenu.push(item.key);
|
||
});
|
||
this.overWashTree(checkedNode, tempAuthorityIdDTOListMenu, authorityMenu);
|
||
if (this.authority && this.authority.length) {
|
||
this.authority.forEach(item => {
|
||
if (tempAuthorityIdDTOListMenu.indexOf(item.authorityId) !== -1) {
|
||
tempAuthorityIdDTOListMenu.forEach((oldItem, oldIndex) => {
|
||
if (oldItem === item.authorityId) {
|
||
authorityMenu[oldIndex] = item;
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
const result = {
|
||
authority: authorityMenu,
|
||
authorityAssistId: this.authorityAssistId
|
||
};
|
||
this.changeData.emit(result);
|
||
return result;
|
||
}
|
||
overWashTree(children: any[], tempAuthorityIdDTOListMenu: any[], authorityMenu: any[]) {
|
||
children.forEach((item: any) => {
|
||
this.authorityAssistId.push(item.key);
|
||
tempAuthorityIdDTOListMenu.push(item.key);
|
||
authorityMenu.push({ authorityId: item.key, isUpdateAuthority: 1 });
|
||
if (item.isLeaf) {
|
||
return;
|
||
}
|
||
if (item.children) {
|
||
this.overWashTree(item.children, tempAuthorityIdDTOListMenu, authorityMenu);
|
||
}
|
||
});
|
||
}
|
||
|
||
initButtonList(id: any, origin: any) {
|
||
if (origin.expanded) {
|
||
origin.children.forEach((item: any, index: number) => {
|
||
if (item.selected) {
|
||
if (origin.checked) {
|
||
this.authority.splice(index, 1);
|
||
const buttonAuthorityIds: any = [];
|
||
item.buttonInfoList.forEach((btnItem: any) => {
|
||
btnItem.checked = true;
|
||
buttonAuthorityIds.push(btnItem.functionButtonId);
|
||
});
|
||
this.authority.push({ authorityId: origin.key, buttonAuthorityIds, isUpdateAuthority: 1 });
|
||
} else {
|
||
this.authority.splice(index, 1);
|
||
item.buttonInfoList.forEach((btnItem: any) => {
|
||
btnItem.checked = false;
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
const params = {
|
||
id
|
||
};
|
||
this.service.request(this.service.$api_getFunctionButtonInfo, params).subscribe(res => {
|
||
if (res) {
|
||
origin.buttonInfoList = res;
|
||
origin.all = false;
|
||
console.log(origin);
|
||
|
||
// 判断此菜单下是否已有此按钮权限
|
||
this.againGetBtn(id, origin);
|
||
}
|
||
});
|
||
}
|
||
// 再次请求,需要判断暂存权限数组是否已有此权限
|
||
againGetBtn(id: any, origin: any) {
|
||
if (this.authority && this.authority.length === 0) {
|
||
const buttonAuthorityIds: any = [];
|
||
if (origin.checked) {
|
||
origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => {
|
||
btnItem.checked = true;
|
||
buttonAuthorityIds.push(btnItem.functionButtonId);
|
||
});
|
||
this.authority.push({ authorityId: origin.key, buttonAuthorityIds, isUpdateAuthority: 1 });
|
||
}
|
||
} else {
|
||
if (origin.checked) {
|
||
//菜单勾选情况下
|
||
if (this.authority.some(item => item.authorityId === id)) {
|
||
this.authority.forEach(item => {
|
||
if (item.authorityId === id) {
|
||
// 如果当前菜单Id存在权限列表里,并且等于暂存权限数组的Id
|
||
if (item.buttonAuthorityIds && item.buttonAuthorityIds.length) {
|
||
// 如果当前菜单Id权限数组不为空
|
||
origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => {
|
||
// 判断已有权限id是否存在
|
||
if (item.buttonAuthorityIds.indexOf(btnItem.functionButtonId) !== -1) {
|
||
btnItem.checked = true;
|
||
} else {
|
||
btnItem.checked = false;
|
||
}
|
||
});
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
this.authority.push({ authorityId: origin.key, buttonAuthorityIds: [], isUpdateAuthority: 1 });
|
||
this.authority.forEach(item => {
|
||
origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => {
|
||
btnItem.checked = true;
|
||
item.buttonAuthorityIds.push(btnItem.functionButtonId);
|
||
});
|
||
});
|
||
}
|
||
} else {
|
||
// 菜单未勾选,要删除权限
|
||
this.authority.forEach((item, index) => {
|
||
if (item.authorityId === id) {
|
||
// 如果当前菜单Id存在权限列表里,并且等于暂存权限数组的Id
|
||
this.authority.splice(index, 1);
|
||
origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => {
|
||
btnItem.checked = false;
|
||
});
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
initDictList(id: any, origin: any) {
|
||
const params = {
|
||
id
|
||
};
|
||
this.service.request(this.service.$api_getFunctionDataInfo, params).subscribe(res => {
|
||
if (res) {
|
||
origin.dictList = res;
|
||
// 判断此菜单下是否已有此按钮权限
|
||
this.againGetDict(id, origin);
|
||
}
|
||
});
|
||
}
|
||
// 再次请求,需要判断暂存权限数组是否已有此权限
|
||
againGetDict(id: any, origin: any) {
|
||
if (this.authority.length === 0) {
|
||
return;
|
||
}
|
||
this.authority.forEach(item => {
|
||
if (item.authorityId === id) {
|
||
// 如果当前菜单Id等于暂存权限数组的Id
|
||
if (item.dataAuthority && item.dataAuthority.length) {
|
||
// 如果当前菜单Id权限数组不为空
|
||
origin.dictList.forEach((ele: { dictItem: any[] }) => {
|
||
// 判断已有权限id是否存在
|
||
ele.dictItem.forEach((dictItem: { itemId: any; checked: boolean; cheked: boolean }) => {
|
||
item.dataAuthority.forEach((dataItem: { dictItemId: any }) => {
|
||
if (dataItem.dictItemId === dictItem.itemId) {
|
||
dictItem.checked = true;
|
||
} else {
|
||
dictItem.cheked = false;
|
||
}
|
||
});
|
||
});
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|