112 lines
2.8 KiB
TypeScript
112 lines
2.8 KiB
TypeScript
import {
|
|
Component,
|
|
OnInit,
|
|
Input,
|
|
Output,
|
|
EventEmitter,
|
|
ViewChild,
|
|
ContentChild,
|
|
TemplateRef
|
|
} from '@angular/core';
|
|
|
|
import { ucapAnimations } from '@ucap-webmessenger/ui';
|
|
|
|
import { GroupDetailData, UserInfo } from '@ucap-webmessenger/protocol-sync';
|
|
import { MatAccordion } from '@angular/material';
|
|
import { ExpansionPanelItemDirective } from '../directives/expansion-panel-item.directive';
|
|
import {
|
|
UserInfoSS,
|
|
UserInfoF,
|
|
UserInfoDN
|
|
} from '@ucap-webmessenger/protocol-query';
|
|
import { NGXLogger } from 'ngx-logger';
|
|
|
|
@Component({
|
|
selector: 'ucap-group-expansion-panel',
|
|
templateUrl: './expansion-panel.component.html',
|
|
styleUrls: ['./expansion-panel.component.scss'],
|
|
animations: ucapAnimations
|
|
})
|
|
export class ExpansionPanelComponent implements OnInit {
|
|
@Input()
|
|
groupBuddyList: { group: GroupDetailData; buddyList: UserInfo[] }[];
|
|
@Input()
|
|
favoritBuddyList: UserInfo[];
|
|
@Input()
|
|
checkable = false;
|
|
@Input()
|
|
/** 선택된 사용자의 리스트 */
|
|
selectedUserList?: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[] = [];
|
|
|
|
@Output()
|
|
more = new EventEmitter<{
|
|
event: MouseEvent;
|
|
group: GroupDetailData;
|
|
}>();
|
|
|
|
@Output()
|
|
checkGroup = new EventEmitter<{
|
|
isChecked: boolean;
|
|
groupBuddyList: { group: GroupDetailData; buddyList: UserInfo[] };
|
|
}>();
|
|
|
|
@ContentChild(ExpansionPanelItemDirective, {
|
|
read: TemplateRef,
|
|
static: true
|
|
})
|
|
expansionPanelItemTemplateRef: TemplateRef<ExpansionPanelItemDirective>;
|
|
|
|
@ViewChild('groupAccordion', { static: true }) groupAccordion: MatAccordion;
|
|
|
|
constructor(private logger: NGXLogger) {}
|
|
|
|
ngOnInit() {}
|
|
|
|
expandMore() {
|
|
this.groupAccordion.openAll();
|
|
}
|
|
|
|
expandLess() {
|
|
this.groupAccordion.closeAll();
|
|
}
|
|
|
|
onClickMore(event: MouseEvent, group: GroupDetailData) {
|
|
this.more.emit({ event, group });
|
|
}
|
|
|
|
/** 그룹리스트가 checkable 할 경우 checkbox 의 change 이벤트를 상위 컴포넌트로 전달한다. */
|
|
onChangeCheck(
|
|
value: boolean,
|
|
groupBuddyList: { group: GroupDetailData; buddyList: UserInfo[] }
|
|
) {
|
|
this.checkGroup.emit({
|
|
isChecked: value,
|
|
groupBuddyList
|
|
});
|
|
}
|
|
|
|
/** 그룹리스트가 checkable 할 경우 checkbox 의 isChecked 를 관장하며, 하위 부서원들의 전체선택여부를 판단한다. */
|
|
getCheckedGroup(groupBuddy: {
|
|
group: GroupDetailData;
|
|
buddyList: UserInfo[];
|
|
}) {
|
|
if (groupBuddy.buddyList.length === 0) {
|
|
return false;
|
|
}
|
|
if (!!this.selectedUserList && this.selectedUserList.length > 0) {
|
|
let allExist = true;
|
|
groupBuddy.buddyList.some(groupUser => {
|
|
if (
|
|
this.selectedUserList.filter(item => item.seq === groupUser.seq)
|
|
.length === 0
|
|
) {
|
|
allExist = false;
|
|
return true;
|
|
}
|
|
});
|
|
return allExist;
|
|
}
|
|
return false;
|
|
}
|
|
}
|