Merge branch 'master' of https://git.loafle.net/ucap-web/next-ucap-messenger
This commit is contained in:
commit
1d7cfbb9e5
|
@ -50,7 +50,7 @@ export class AppAutoLoginGuard implements CanActivate {
|
|||
if (
|
||||
!!appUserInfo &&
|
||||
appUserInfo.settings.general.autoLogin &&
|
||||
!personLogout.personLogout
|
||||
!(!!personLogout && !!personLogout.personLogout)
|
||||
) {
|
||||
this.store.dispatch(
|
||||
AuthenticationStore.webLogin({
|
||||
|
|
|
@ -186,6 +186,7 @@
|
|||
(sendCall)="onClickSendClickToCall($event)"
|
||||
(sendSms)="onClickSendSms($event)"
|
||||
(toggleUser)="onToggleUser($event)"
|
||||
(resetSelectedUserList)="onResetSelectedUserList($event)"
|
||||
class="organization-side"
|
||||
></app-layout-chat-left-sidenav-organization>
|
||||
</div>
|
||||
|
|
|
@ -403,6 +403,11 @@ export class LeftSideComponent implements OnInit, OnDestroy {
|
|||
);
|
||||
}
|
||||
}
|
||||
onResetSelectedUserList(
|
||||
selectedUserList: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[]
|
||||
) {
|
||||
this.selectedUserList = selectedUserList;
|
||||
}
|
||||
|
||||
/** FAB */
|
||||
onClickFab(params: { btn: any }) {
|
||||
|
|
|
@ -41,22 +41,27 @@ import {
|
|||
} from '@app/types';
|
||||
import { take, map, tap, delay, catchError } from 'rxjs/operators';
|
||||
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
|
||||
import {
|
||||
SelectGroupDialogComponent,
|
||||
SelectGroupDialogData,
|
||||
SelectGroupDialogResult
|
||||
} from '../../dialogs/group/select-group.dialog.component';
|
||||
import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
|
||||
import { Company } from '@ucap-webmessenger/api-external';
|
||||
import { PerfectScrollbarDirective } from 'ngx-perfect-scrollbar';
|
||||
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
||||
import { MatMenuTrigger } from '@angular/material';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import {
|
||||
MessageWriteDialogComponent,
|
||||
MessageWriteDialogResult,
|
||||
MessageWriteDialogData
|
||||
} from '../../dialogs/message/message-write.dialog.component';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import {
|
||||
SelectGroupDialogComponent,
|
||||
SelectGroupDialogResult,
|
||||
SelectGroupDialogData
|
||||
} from '../../dialogs/group/select-group.dialog.component';
|
||||
import {
|
||||
SelectedUserListDialogComponent,
|
||||
SelectedUserListDialogResult,
|
||||
SelectedUserListDialogData
|
||||
} from '../../dialogs/organization/selected-user-list.dialog.component';
|
||||
|
||||
@Component({
|
||||
selector: 'app-layout-chat-left-sidenav-organization',
|
||||
|
@ -99,6 +104,10 @@ export class OrganizationComponent
|
|||
userInfos: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[];
|
||||
}>();
|
||||
@Output()
|
||||
resetSelectedUserList = new EventEmitter<
|
||||
(UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[]
|
||||
>();
|
||||
@Output()
|
||||
openProfile = new EventEmitter<{ userSeq: number }>();
|
||||
@Output()
|
||||
sendCall = new EventEmitter<string>();
|
||||
|
@ -411,8 +420,25 @@ export class OrganizationComponent
|
|||
this.sendCall.emit(calleeNumber);
|
||||
}
|
||||
|
||||
onClickShowSelectedUserList() {
|
||||
async onClickShowSelectedUserList() {
|
||||
this.logger.debug('onClickShowSelectedUserList', this.selectedUserList);
|
||||
|
||||
const result = await this.dialogService.open<
|
||||
SelectedUserListDialogComponent,
|
||||
SelectedUserListDialogData,
|
||||
SelectedUserListDialogResult
|
||||
>(SelectedUserListDialogComponent, {
|
||||
data: {
|
||||
title: '선택된 유저',
|
||||
selectedUserList: this.selectedUserList
|
||||
}
|
||||
});
|
||||
|
||||
if (!!result && !!result.choice && result.choice) {
|
||||
if (!!result.selectedUserList) {
|
||||
this.resetSelectedUserList.emit(result.selectedUserList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async onClickAddGroup() {
|
||||
|
|
|
@ -3,6 +3,7 @@ import { DIALOGS as CHAT_DIALOGS } from './chat';
|
|||
import { DIALOGS as GROUP_DIALOGS } from './group';
|
||||
import { DIALOGS as MESSAGE_DIALOGS } from './message';
|
||||
import { DIALOGS as NOTICE_DIALOGS } from './notice';
|
||||
import { DIALOGS as ORGANIZATION_DIALOGS } from './organization';
|
||||
import { DIALOGS as PROFILE_DIALOGS } from './profile';
|
||||
import { DIALOGS as SETTINGS_DIALOGS } from './settings';
|
||||
|
||||
|
@ -12,6 +13,7 @@ export const DIALOGS = [
|
|||
...GROUP_DIALOGS,
|
||||
...MESSAGE_DIALOGS,
|
||||
...NOTICE_DIALOGS,
|
||||
...ORGANIZATION_DIALOGS,
|
||||
...PROFILE_DIALOGS,
|
||||
...SETTINGS_DIALOGS
|
||||
];
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
import { SelectedUserListDialogComponent } from './selected-user-list.dialog.component';
|
||||
|
||||
export const DIALOGS = [SelectedUserListDialogComponent];
|
|
@ -0,0 +1,66 @@
|
|||
<mat-card class="confirm-card mat-elevation-z">
|
||||
<mat-card-header>
|
||||
<mat-card-title>
|
||||
{{ data.title }}
|
||||
<span class="count">
|
||||
{{ selectedUserList.length }} / {{ data.selectedUserList.length }}
|
||||
</span>
|
||||
<mat-checkbox
|
||||
#checkbox
|
||||
labelPosition="before"
|
||||
[checked]="
|
||||
selectedUserList.length === data.selectedUserList.length &&
|
||||
data.selectedUserList.length > 0
|
||||
"
|
||||
(change)="onCheckAllUser(checkbox.checked)"
|
||||
(click)="$event.stopPropagation()"
|
||||
>
|
||||
전체선택
|
||||
</mat-checkbox>
|
||||
</mat-card-title>
|
||||
</mat-card-header>
|
||||
<mat-card-content>
|
||||
<div class="item-list">
|
||||
<cdk-virtual-scroll-viewport
|
||||
itemSize="80"
|
||||
#cvsvDeptUser
|
||||
perfectScrollbar
|
||||
fxFlexFill
|
||||
>
|
||||
<ucap-profile-user-list-item
|
||||
*cdkVirtualFor="let userInfo of data.selectedUserList"
|
||||
[userInfo]="userInfo"
|
||||
[sessionVerinfo]="sessionVerinfo"
|
||||
[selectedUserList]="selectedUserList"
|
||||
[checkable]="userInfo.seq !== loginRes.userSeq"
|
||||
[checkDisabled]="false"
|
||||
[isChecked]="getCheckedUser(userInfo)"
|
||||
(checkUser)="onCheckUser($event)"
|
||||
(click)="onToggleUser(userInfo)"
|
||||
(openProfile)="onClickOpenProfile($event)"
|
||||
[matTooltip]="
|
||||
userInfo.companyName +
|
||||
' / ' +
|
||||
userInfo.lineNumber +
|
||||
' / ' +
|
||||
userInfo.hpNumber
|
||||
"
|
||||
matTooltipPosition="after"
|
||||
>
|
||||
</ucap-profile-user-list-item>
|
||||
</cdk-virtual-scroll-viewport>
|
||||
</div>
|
||||
</mat-card-content>
|
||||
<mat-card-actions class="button-farm flex-row">
|
||||
<button
|
||||
mat-stroked-button
|
||||
(click)="onClickChoice(false)"
|
||||
class="mat-primary"
|
||||
>
|
||||
취소
|
||||
</button>
|
||||
<button mat-flat-button (click)="onClickChoice(true)" class="mat-primary">
|
||||
적용
|
||||
</button>
|
||||
</mat-card-actions>
|
||||
</mat-card>
|
|
@ -0,0 +1,18 @@
|
|||
::ng-deep .mat-card-header-tex {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.confirm-card {
|
||||
min-width: 500px;
|
||||
.mat-card-content {
|
||||
.item-list {
|
||||
height: 450px;
|
||||
}
|
||||
}
|
||||
.button-farm {
|
||||
text-align: right;
|
||||
.mat-primary {
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { SelectedUserListDialogComponent } from './selected-user-list.dialog.component';
|
||||
|
||||
describe('app::layouts::messenger::SelectedUserListDialogComponent', () => {
|
||||
let component: SelectedUserListDialogComponent;
|
||||
let fixture: ComponentFixture<SelectedUserListDialogComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [SelectedUserListDialogComponent]
|
||||
}).compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(SelectedUserListDialogComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
|
@ -0,0 +1,120 @@
|
|||
import { Component, OnInit, Inject } from '@angular/core';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
|
||||
import { UserInfo } from '@ucap-webmessenger/protocol-sync';
|
||||
import {
|
||||
UserInfoSS,
|
||||
UserInfoF,
|
||||
UserInfoDN
|
||||
} from '@ucap-webmessenger/protocol-query';
|
||||
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
|
||||
import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
|
||||
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
|
||||
import { KEY_VER_INFO, KEY_LOGIN_RES_INFO } from '@app/types';
|
||||
|
||||
export interface SelectedUserListDialogData {
|
||||
title: string;
|
||||
/** 선택된 사용자의 리스트 */
|
||||
selectedUserList?: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[];
|
||||
}
|
||||
|
||||
export interface SelectedUserListDialogResult {
|
||||
choice: boolean;
|
||||
selectedUserList?: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[];
|
||||
}
|
||||
|
||||
@Component({
|
||||
selector: 'app-layout-messenger-selected-user-list',
|
||||
templateUrl: './selected-user-list.dialog.component.html',
|
||||
styleUrls: ['./selected-user-list.dialog.component.scss']
|
||||
})
|
||||
export class SelectedUserListDialogComponent implements OnInit {
|
||||
selectedUserList: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[] = [];
|
||||
|
||||
loginRes: LoginResponse;
|
||||
sessionVerinfo: VersionInfo2Response;
|
||||
|
||||
constructor(
|
||||
public dialogRef: MatDialogRef<
|
||||
SelectedUserListDialogData,
|
||||
SelectedUserListDialogResult
|
||||
>,
|
||||
@Inject(MAT_DIALOG_DATA) public data: SelectedUserListDialogData,
|
||||
private sessionStorageService: SessionStorageService
|
||||
) {
|
||||
this.loginRes = this.sessionStorageService.get<LoginResponse>(
|
||||
KEY_LOGIN_RES_INFO
|
||||
);
|
||||
this.sessionVerinfo = this.sessionStorageService.get<VersionInfo2Response>(
|
||||
KEY_VER_INFO
|
||||
);
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.selectedUserList = this.data.selectedUserList;
|
||||
}
|
||||
|
||||
/** 전체선택 이벤트 */
|
||||
onCheckAllUser(value: boolean) {
|
||||
if (!!value) {
|
||||
this.selectedUserList = this.data.selectedUserList;
|
||||
} else {
|
||||
this.selectedUserList = [];
|
||||
}
|
||||
}
|
||||
|
||||
/** 리스트 checkable 할 경우 checkbox 의 isChecked 를 관장하며 리스트의 전체선택 여부를 판단한다. */
|
||||
getCheckedUser(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) {
|
||||
if (!!this.selectedUserList && this.selectedUserList.length > 0) {
|
||||
return (
|
||||
this.selectedUserList.filter(item => item.seq === userInfo.seq).length >
|
||||
0
|
||||
);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** 리스트가 checkable 할 경우 checkbox 의 change 이벤트를 상위 컴포넌트로 전달한다. */
|
||||
onCheckUser(params: {
|
||||
isChecked: boolean;
|
||||
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN;
|
||||
}) {
|
||||
if (params.isChecked) {
|
||||
if (
|
||||
params.userInfo &&
|
||||
this.selectedUserList.filter(user => user.seq === params.userInfo.seq)
|
||||
.length === 0
|
||||
) {
|
||||
this.selectedUserList = [...this.selectedUserList, params.userInfo];
|
||||
}
|
||||
} else {
|
||||
this.selectedUserList = this.selectedUserList.filter(
|
||||
user => user.seq !== params.userInfo.seq
|
||||
);
|
||||
}
|
||||
}
|
||||
onToggleUser(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) {
|
||||
if (userInfo.seq === this.loginRes.userSeq) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
this.selectedUserList.filter(user => user.seq === userInfo.seq).length ===
|
||||
0
|
||||
) {
|
||||
this.selectedUserList = [...this.selectedUserList, userInfo];
|
||||
} else {
|
||||
this.selectedUserList = this.selectedUserList.filter(
|
||||
item => item.seq !== userInfo.seq
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
onClickOpenProfile(userSeq: number) {}
|
||||
|
||||
onClickChoice(choice: boolean): void {
|
||||
this.dialogRef.close({
|
||||
choice,
|
||||
selectedUserList: this.selectedUserList
|
||||
});
|
||||
}
|
||||
}
|
|
@ -351,6 +351,9 @@
|
|||
확대
|
||||
</button>
|
||||
</div> -->
|
||||
<div class="setting">
|
||||
<button mat-menu-item (click)="onClickNotice()">공지사항</button>
|
||||
</div>
|
||||
<div class="setting">
|
||||
<button mat-menu-item (click)="onClickSettings()">설정</button>
|
||||
</div>
|
||||
|
|
Loading…
Reference in New Issue
Block a user