Files
bbq/src/app/routes/sys-setting/components/role-management/menu/menu.component.ts
wangshiming 81bfaea6f5 fix bug
2022-04-25 14:48:09 +08:00

424 lines
15 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
});
});
});
}
}
});
}
}