sync
This commit is contained in:
parent
7906aeaf7b
commit
915d871217
323
documents/업무/5월/4째주/0526.txt
Normal file
323
documents/업무/5월/4째주/0526.txt
Normal file
|
@ -0,0 +1,323 @@
|
|||
const rect = target.getBoundingClientRect();
|
||||
|
||||
const clickEventY = this.groupMenuEvent.clientY;
|
||||
const tartgetY = Math.floor((clickEventY - 150) * 0.1) * 10;
|
||||
|
||||
const dialogRef = this.dialog.open(EditInlineInputDialogComponent, {
|
||||
width: rect.width,
|
||||
height: rect.height,
|
||||
panelClass: 'ucap-edit-group-name-dialog',
|
||||
data: {
|
||||
curValue: group.name,
|
||||
placeholder: '그룹명을 입력하세요.',
|
||||
left: rect.left,
|
||||
top: clickEventY - 100 + rect.height
|
||||
}
|
||||
});
|
||||
|
||||
"TypeError: Cannot read property 'height' of undefined
|
||||
at ExpansionComponent.onSelectGroupMenu (http://localhost:4200/pages-group-group-page-module.980e746b5ae98aad2c91.hot-update.js:985:47)
|
||||
at ExpansionComponent_ng_template_11_button_6_Template_button_click_0_listener (http://localhost:4200/pages-group-group-page-module.980e746b5ae98aad2c91.hot-update.js:581:416)
|
||||
at executeListenerWithErrorHandling (http://localhost:4200/vendor.js:53654:16)
|
||||
at wrapListenerIn_markDirtyAndPreventDefault (http://localhost:4200/vendor.js:53703:22)
|
||||
at HTMLButtonElement.<anonymous> (http://localhost:4200/vendor.js:123295:38)
|
||||
at ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:443:35)
|
||||
at Object.onInvokeTask (http://localhost:4200/vendor.js:70743:33)
|
||||
at ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:442:40)
|
||||
at Zone.runTask (http://localhost:4200/polyfills.js:211:51)
|
||||
at ZoneTask.invokeTask [as invoke] (http://localhost:4200/polyfills.js:524:38)"
|
||||
|
||||
|
||||
switch (menuType) {
|
||||
case 'VIEW_PROFILE':
|
||||
this.onClickUser(event, userInfo as UserInfo);
|
||||
break;
|
||||
case 'REGISTER_FAVORITE':
|
||||
this.store.dispatch(
|
||||
BuddyActions.update({
|
||||
req: {
|
||||
seq: Number(userInfo.seq),
|
||||
isFavorit: !userInfo.isFavorit
|
||||
}
|
||||
})
|
||||
);
|
||||
break;
|
||||
case 'NICKNAME':
|
||||
{
|
||||
this.editNickname(event, userInfo, rect);
|
||||
}
|
||||
break;
|
||||
case 'COPY_BUDDY':
|
||||
this.eidtUserDialog('COPY_BUDDY', group, userInfo);
|
||||
break;
|
||||
case 'MOVE_BUDDY':
|
||||
this.eidtUserDialog('MOVE_BUDDY', group, userInfo);
|
||||
break;
|
||||
case 'REMOVE_BUDDY':
|
||||
{
|
||||
this.removeBuddy(userInfo, group);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private eidtUserDialog(
|
||||
type: string,
|
||||
group: GroupDetailData,
|
||||
userInfo: UserInfoTypes
|
||||
) {
|
||||
let title = '';
|
||||
let dialogType: GroupUserDialaogType;
|
||||
if (type === 'COPY_BUDDY') {
|
||||
title = '멤버 복사';
|
||||
dialogType = GroupUserDialaogType.Copy;
|
||||
} else {
|
||||
title = '멤버 이동';
|
||||
dialogType = GroupUserDialaogType.Move;
|
||||
}
|
||||
const dialogRef = this.dialog.open<
|
||||
EditUserDialogComponent,
|
||||
EditUserDialogData,
|
||||
EditUserDialogResult
|
||||
>(EditUserDialogComponent, {
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
data: {
|
||||
title,
|
||||
type: dialogType,
|
||||
group,
|
||||
userInfo
|
||||
}
|
||||
});
|
||||
dialogRef
|
||||
.afterClosed()
|
||||
.pipe(
|
||||
take(1),
|
||||
map((result: EditUserDialogResult) => {
|
||||
let targetGroup: GroupDetailData;
|
||||
let targetUserSeqs: string[];
|
||||
if (result.type === GroupUserDialaogType.Add) {
|
||||
targetGroup = result.group;
|
||||
targetUserSeqs = [];
|
||||
result.selelctUserList.forEach((u) => {
|
||||
targetUserSeqs.push(u.seq + '');
|
||||
});
|
||||
this.store.dispatch(
|
||||
GroupActions.updateMember({ targetGroup, targetUserSeqs })
|
||||
);
|
||||
} else if (result.type === GroupUserDialaogType.Copy) {
|
||||
if (!!result.selectGroupList && result.selectGroupList.length > 0) {
|
||||
result.selectGroupList.forEach((g) => {
|
||||
targetGroup = g;
|
||||
targetUserSeqs = [];
|
||||
g.userSeqs.map((seq) => {
|
||||
targetUserSeqs.push(seq);
|
||||
});
|
||||
if (targetUserSeqs.length === 0) {
|
||||
result.selelctUserList.forEach((user) => {
|
||||
targetUserSeqs.push(user.seq as any);
|
||||
});
|
||||
} else {
|
||||
result.selelctUserList.forEach((user) => {
|
||||
const find = targetUserSeqs.indexOf(user.seq as any);
|
||||
if (find < 0) {
|
||||
targetUserSeqs.push(user.seq as any);
|
||||
}
|
||||
});
|
||||
}
|
||||
this.store.dispatch(
|
||||
GroupActions.updateMember({ targetGroup, targetUserSeqs })
|
||||
);
|
||||
});
|
||||
}
|
||||
} else if (result.type === GroupUserDialaogType.Move) {
|
||||
const fromGroup = result.group;
|
||||
let toGroup: GroupDetailData;
|
||||
targetUserSeqs = [];
|
||||
if (!!result.selectGroupList && result.selectGroupList.length > 0) {
|
||||
result.selectGroupList.forEach((g) => {
|
||||
toGroup = g;
|
||||
targetUserSeqs = [];
|
||||
result.selelctUserList.forEach((user) => {
|
||||
targetUserSeqs.push(user.seq as any);
|
||||
});
|
||||
this.store.dispatch(
|
||||
GroupActions.moveMember({
|
||||
fromGroup,
|
||||
toGroup,
|
||||
targetUserSeq: targetUserSeqs
|
||||
})
|
||||
);
|
||||
});
|
||||
}
|
||||
} else if (result.type === GroupUserDialaogType.Create) {
|
||||
targetUserSeqs = [];
|
||||
result.selelctUserList.forEach((u) => {
|
||||
targetUserSeqs.push(u.seq + '');
|
||||
});
|
||||
this.store.dispatch(
|
||||
GroupActions.create({
|
||||
groupName: result.groupName,
|
||||
targetUserSeqs
|
||||
})
|
||||
);
|
||||
}
|
||||
}),
|
||||
catchError((err) => {
|
||||
return of(err);
|
||||
})
|
||||
)
|
||||
.subscribe();
|
||||
}
|
||||
|
||||
private removeBuddy(userInfo: UserInfoF, group: GroupDetailData) {
|
||||
const dialogRef = this.dialog.open<
|
||||
ConfirmDialogComponent,
|
||||
ConfirmDialogData,
|
||||
ConfirmDialogResult
|
||||
>(ConfirmDialogComponent, {
|
||||
data: {
|
||||
title: '',
|
||||
html: this.i18nService.t('label.confirmRemoveBuddy')
|
||||
}
|
||||
});
|
||||
dialogRef
|
||||
.afterClosed()
|
||||
.pipe(
|
||||
take(1),
|
||||
map((result) => {
|
||||
if (!!result && result.choice) {
|
||||
const trgtUserSeq = group.userSeqs.filter(
|
||||
(user) => user + '' !== userInfo.seq + ''
|
||||
);
|
||||
|
||||
this.store.dispatch(
|
||||
GroupActions.updateMember({
|
||||
targetGroup: group,
|
||||
targetUserSeqs: trgtUserSeq
|
||||
})
|
||||
);
|
||||
}
|
||||
}),
|
||||
catchError((err) => {
|
||||
return of(err);
|
||||
})
|
||||
)
|
||||
.subscribe();
|
||||
}
|
||||
private editNickname(event: MouseEvent, userInfo: UserInfoF, rect: any) {
|
||||
const clickEventY = event.clientY;
|
||||
|
||||
// const dialogRef = this.dialog.open(EditInlineInputDialogComponent, {
|
||||
// width: rect.width - 30 + '',
|
||||
// height: rect.height,
|
||||
// panelClass: 'ucap-edit-group-name-dialog',
|
||||
// data: {
|
||||
// curValue: userInfo.nickName,
|
||||
// placeholder: '닉네임을 설정하세요.',
|
||||
// left: rect.left + 70,
|
||||
// top: rect.top
|
||||
// }
|
||||
// });
|
||||
|
||||
// dialogRef
|
||||
// .afterClosed()
|
||||
// .pipe(
|
||||
// take(1),
|
||||
// map((result) => {
|
||||
// if (
|
||||
// !!result &&
|
||||
// result.choice &&
|
||||
// result.curValue.localeCompare(userInfo.nickName) !== 0
|
||||
// ) {
|
||||
// this.store.dispatch(
|
||||
// BuddyActions.nickname({
|
||||
// req: {
|
||||
// userSeq: Number(userInfo.seq),
|
||||
// nickname: result.curValue
|
||||
// }
|
||||
// })
|
||||
// );
|
||||
// }
|
||||
// }),
|
||||
// catchError((err) => {
|
||||
// return of(err);
|
||||
// })
|
||||
// )
|
||||
// .subscribe();
|
||||
}
|
||||
|
||||
리팩토링
|
||||
셀렉트 이용
|
||||
이벤트가 다른 컴포넌트 시리즈 분리
|
||||
|
||||
컴포넌트 후보
|
||||
사용자 선택 (chips)
|
||||
검색 결과
|
||||
프로필 리스트
|
||||
|
||||
그룹 다이얼로그
|
||||
생성,
|
||||
출력
|
||||
그룹명, 그룹 유저 리스트, 조직도, 검색, 검색 결과
|
||||
기능
|
||||
그룹명 유효성 검사
|
||||
그룹 유저 리스트
|
||||
사용자 체크에 대한 처리, 그룹 체크에 대한 처리, 체크박스
|
||||
한줄 수정,
|
||||
출력
|
||||
한줄 입력창, 적용 버튼, 취소 버튼
|
||||
기능
|
||||
한줄 입력에 대한 유효성 검사
|
||||
절대 위치에 출력할 수 있게 포지션 계산
|
||||
유저 변경(이동, 복사, 생성, 삭제),
|
||||
|
||||
유저 변경(이동, 복사)
|
||||
그룹 메뉴
|
||||
출력
|
||||
메뉴
|
||||
이름 바꾸기
|
||||
그룹 삭제
|
||||
기능
|
||||
그룹 대화, 쪽지 => 이벤트 호출
|
||||
그룹 이름 => position 계산, 적용, 취소에 대한 처리, 액션 처리
|
||||
그룹 삭제 => 사용자 확인 다이얼로그 출력 및 액션에 대한 처리
|
||||
|
||||
익스팬션
|
||||
프로필 리스트 아이템
|
||||
출력
|
||||
프로필 메뉴, 프레젠스, 프로핊 이미지, 이름, 직함, 부서, 인트로, 닉네임
|
||||
기능
|
||||
프로필 보기
|
||||
즐겨 찾기 설정
|
||||
닉네임 설정
|
||||
대화 상대 복사, 이동
|
||||
삭제
|
||||
마우스오버&리브 이벤트에 대한 버튼 출력
|
||||
모어 메뉴 출력 포지션 계산
|
||||
|
||||
검색
|
||||
출력
|
||||
입력창, 검색 버튼, 입력 삭제 버튼, 회사 리스트
|
||||
기능
|
||||
입력 이벤트
|
||||
검색 액션 처리
|
||||
삭제 버튼 액션 처리
|
||||
회사 리스트 조회
|
||||
셀렉트 그룹
|
||||
검색
|
||||
그룹명 입력
|
||||
기존 그룹 리스트
|
||||
체크박스
|
||||
셀렉트 유저
|
||||
익스팬션
|
||||
프로필 리스트 아이템
|
||||
프레젠스, 프로필 이미지, 이름, 부서, 직함, 체크박스
|
||||
|
||||
|
||||
그룹용 프로필 리스트 아이템
|
||||
마우스오버 -> 버튼 컴포넌트
|
||||
|
||||
다이얼로그 프로필 리스트 아이템
|
||||
체크박스
|
58
documents/업무/5월/4째주/0527.txt
Normal file
58
documents/업무/5월/4째주/0527.txt
Normal file
|
@ -0,0 +1,58 @@
|
|||
todo
|
||||
다국어 적용
|
||||
|
||||
프로필 컴포넌트 정리
|
||||
org 프로필 컴포넌트 적용
|
||||
마우스오버 이벤트
|
||||
히든 버튼 적용
|
||||
체크박스 이벤트
|
||||
익스팬션 컴포넌트 정리
|
||||
그룹 메뉴
|
||||
그룹별 메뉴 히든 처리
|
||||
프로필 메뉴
|
||||
프로필 메뉴 히든 처리
|
||||
온/오프 리스트
|
||||
접속동료 리스트
|
||||
|
||||
다이얼로그 컴포넌트 정리
|
||||
관리
|
||||
삭제, 추가, 이동, 복사, 검색
|
||||
그룹이름 유효성 검사
|
||||
선택 컴포넌트 적용
|
||||
생성
|
||||
그룹이름 유효성 검사
|
||||
선택 컴포넌트 적용
|
||||
한줄 편집
|
||||
|
||||
수정
|
||||
|
||||
셀렉트 유저 컴포넌트
|
||||
셀렉트 컴포넌트 적용
|
||||
셀렉트 그룹 컴포넌트
|
||||
|
||||
검색 결과 컴포넌트
|
||||
|
||||
그룹명 컴포넌트
|
||||
|
||||
|
||||
|
||||
|
||||
// if (params.isChecked) {
|
||||
// params.groupBuddyList.buddyList.forEach((item) => {
|
||||
// if (
|
||||
// this.selectedUserList.filter((user) => user.seq === item.seq)
|
||||
// .length === 0
|
||||
// ) {
|
||||
// this.selectedUserList = [...this.selectedUserList, item];
|
||||
// }
|
||||
// });
|
||||
// } else {
|
||||
// this.selectedUserList = this.selectedUserList.filter(
|
||||
// (item) =>
|
||||
// params.groupBuddyList.buddyList.filter((del) => del.seq === item.seq)
|
||||
// .length === 0
|
||||
// );
|
||||
// }
|
||||
|
||||
// this.changeDetectorRef.markForCheck();
|
||||
// this.changeUserList.emit(this.selectedUserList);
|
|
@ -0,0 +1,85 @@
|
|||
<div
|
||||
class="ucap-group-profile-list-item-02-container"
|
||||
(mouseover)="onMouseover($event)"
|
||||
(mouseleave)="onMouseleave($event)"
|
||||
>
|
||||
<div class="user-profile-info">
|
||||
<div class="profile-image">
|
||||
<ucap-organization-profile-image-01
|
||||
ucapGroupProfileListItem02="profileImage"
|
||||
[userInfo]="userInfo"
|
||||
[profileImageRoot]="versionInfo2Res?.profileRoot"
|
||||
defaultProfileImage="assets/images/ico/img_nophoto.svg"
|
||||
>
|
||||
</ucap-organization-profile-image-01>
|
||||
</div>
|
||||
<div class="user-info">
|
||||
<div class="user-n-g">
|
||||
<div class="user-name">
|
||||
{{ userInfo | ucapOrganizationTranslate: 'name' }}
|
||||
</div>
|
||||
<div class="user-grade">
|
||||
{{ userInfo | ucapOrganizationTranslate: 'grade' }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="dept-name">
|
||||
{{ userInfo | ucapOrganizationTranslate: 'deptName' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="user-info">
|
||||
<div class="intro">{{ userInfo.intro }}</div>
|
||||
<div class="nickname">{{ userInfo.nickName }}</div>
|
||||
</div>
|
||||
<div *ngIf="isShow || isClickMore">
|
||||
<ng-template [ngTemplateOutlet]="profileMoreContextTemplate"></ng-template>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ng-template #profileMoreContextTemplate>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="chat"
|
||||
(click)="onClickProfileContextMenu($event, 'CHAT')"
|
||||
>
|
||||
<img src="../../../assets/images/ico/btn_lise_chat_a24.svg" alt="" />
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="message"
|
||||
(click)="
|
||||
$event.stopPropagation(); onClickProfileContextMenu($event, 'CHAT')
|
||||
"
|
||||
>
|
||||
<img src="../../../assets/images/ico/btn_list_message_a24.svg" alt="" />
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="mobile"
|
||||
(click)="onClickProfileContextMenu($event, 'CHAT')"
|
||||
>
|
||||
<img src="../../../assets/images/ico/btn_list_mobile_a24.svg" alt="" />
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="call"
|
||||
(click)="onClickProfileContextMenu($event, 'CHAT')"
|
||||
>
|
||||
<img src="../../../assets/images/ico/btn_list_call_a24.svg" alt="" />
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="vc"
|
||||
(click)="onClickProfileContextMenu($event, 'CHAT')"
|
||||
>
|
||||
<img src="../../../assets/images/ico/btn_list_vc-a24.svg" alt="" />
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="more"
|
||||
*ngIf="true"
|
||||
(click)="onClickMore($event)"
|
||||
>
|
||||
<mat-icon>more_horiz</mat-icon>
|
||||
</button>
|
||||
</ng-template>
|
101
documents/업무/5월/4째주/backup/profile-list-item.component.html
Normal file
101
documents/업무/5월/4째주/backup/profile-list-item.component.html
Normal file
|
@ -0,0 +1,101 @@
|
|||
<div
|
||||
class="user-list line-top"
|
||||
*ngIf="userInfo"
|
||||
(mouseover)="onMouseover($event)"
|
||||
(mouseleave)="onMouseleave($event)"
|
||||
>
|
||||
<div class="user-profile-info">
|
||||
<div
|
||||
class="user-profile-thumb"
|
||||
[ngClass]="
|
||||
getPresence(PresenceType.MOBILE) === 'online' ? 'mobile-ing' : ''
|
||||
"
|
||||
>
|
||||
<!-- 모바일이 온라인일 경우 + mobile-ing -->
|
||||
<span
|
||||
class="presence"
|
||||
[ngClass]="getPresence(PresenceType.PC)"
|
||||
[matTooltip]="getPresenceMsg()"
|
||||
matTooltipPosition="after"
|
||||
>
|
||||
</span>
|
||||
<!-- 기본값:온라인, +offline:오프라인, +absence:부재중, +other-business:다른용무 -->
|
||||
<!-- <span class="ucap-organization-profile-list-item-presence">bullet</span> -->
|
||||
<div class="profile-image">
|
||||
<img
|
||||
class="thumbnail"
|
||||
ucapImage
|
||||
[base]="profileImageRoot"
|
||||
[path]="userInfo.profileImageFile"
|
||||
[default]="defaultProfileImage"
|
||||
(click)="onClickProfileImage($event, userInfo)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="user-info">
|
||||
<div>
|
||||
<div class="user-name">
|
||||
{{ userInfo | ucapOrganizationTranslate: 'name' }}
|
||||
</div>
|
||||
<div class="user-grade">
|
||||
{{ userInfo | ucapOrganizationTranslate: 'grade' }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="dept-name">
|
||||
{{ userInfo | ucapOrganizationTranslate: 'deptName' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="!isShowMenu && userInfo.nickName === ''" class="intro">
|
||||
{{ userInfo.intro }}
|
||||
</div>
|
||||
<div *ngIf="!isShowMenu && userInfo.nickName !== ''" class="intro">
|
||||
{{ userInfo.nickName }}
|
||||
</div>
|
||||
|
||||
<div
|
||||
*ngIf="!checkable && (isShowMenu || isClickMore)"
|
||||
class="btn-partner-set"
|
||||
>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="chat"
|
||||
(click)="onClickProfileContextMenu($event, 'CHAT')"
|
||||
>
|
||||
<img src="../../../assets/images/ico/btn_lise_chat_a24.svg" alt="" />
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="message"
|
||||
(click)="
|
||||
$event.stopPropagation(); onClickProfileContextMenu($event, 'CHAT')
|
||||
"
|
||||
>
|
||||
<img src="../../../assets/images/ico/btn_list_message_a24.svg" alt="" />
|
||||
</button>
|
||||
<!-- <button mat-icon-button aria-label="mobile" *ngIf="getDisabledBtn('MOBILE')" (click)="onClickProfileContextMenu('CHAT')">
|
||||
<img src="../../../assets/images/ico/btn_list_mobile_a24.svg" alt="" />
|
||||
</button>
|
||||
<button mat-icon-button aria-label="call" *ngIf="getDisabledBtn('LINE')" (click)="onClickProfileContextMenu('CHAT')">
|
||||
<img src="../../../assets/images/ico/btn_list_call_a24.svg" alt="" />
|
||||
</button>
|
||||
<button mat-icon-button aria-label="vc" *ngIf="getDisabledBtn('VC')"(click)="onClickProfileContextMenu('CHAT')">
|
||||
<img src="../../../assets/images/ico/btn_list_vc-a24.svg" alt="" />
|
||||
</button> -->
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="more"
|
||||
*ngIf="true"
|
||||
(click)="onClickMore($event)"
|
||||
>
|
||||
<mat-icon>more_horiz</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
<div *ngIf="checkable">
|
||||
<mat-checkbox
|
||||
#checkbox
|
||||
[checked]="isChecked"
|
||||
(change)="onChangeCheck(checkbox.checked, userInfo)"
|
||||
></mat-checkbox>
|
||||
</div>
|
||||
</div>
|
136
documents/업무/5월/4째주/backup/profile-list-item.component.scss
Normal file
136
documents/업무/5월/4째주/backup/profile-list-item.component.scss
Normal file
|
@ -0,0 +1,136 @@
|
|||
@import '~@ucap/lg-scss/mixins';
|
||||
|
||||
.user-list {
|
||||
display: flex;
|
||||
flex-flow: row nowrap;
|
||||
justify-content: space-between;
|
||||
padding: 0 16px;
|
||||
height: 70px;
|
||||
align-items: center;
|
||||
&.line-top {
|
||||
border-top: 1px solid $gray-rec;
|
||||
}
|
||||
.user-profile-info {
|
||||
display: inline-flex;
|
||||
flex-direction: row;
|
||||
flex-grow: 2.3;
|
||||
.user-profile-thumb {
|
||||
@include profile-avatar-default(
|
||||
0 5px 5px 0,
|
||||
8,
|
||||
$green,
|
||||
18px
|
||||
); //오른 아래 공간, 모바일 온라인 아이콘 크기, 모바일 아이콘 색, 모바일 아이콘 bg크기
|
||||
.presence {
|
||||
//PC 상태
|
||||
@include presence-state(8px); //원크기
|
||||
}
|
||||
.profile-image {
|
||||
@include avatar-img(36px, 2px); //아바타 크기, 왼쪽공간
|
||||
}
|
||||
}
|
||||
.user-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
padding-left: 16px;
|
||||
.user-n-g {
|
||||
display: flex;
|
||||
flex-flow: row-reverse nowrap;
|
||||
align-items: flex-end;
|
||||
height: 22px;
|
||||
.user-name {
|
||||
@include ellipsis-column(1);
|
||||
height: 22px;
|
||||
font: {
|
||||
size: 16px;
|
||||
weight: 600;
|
||||
}
|
||||
color: $gray-re21;
|
||||
order: 1;
|
||||
-ms-flex-order: 1;
|
||||
}
|
||||
.user-grade {
|
||||
@include ellipsis(1);
|
||||
align-self: stretch;
|
||||
font: {
|
||||
size: 13px;
|
||||
}
|
||||
color: $gray-re70;
|
||||
margin-left: 4px;
|
||||
order: 0;
|
||||
-ms-flex-order: 0;
|
||||
}
|
||||
}
|
||||
.dept-name {
|
||||
@include ellipsis(1);
|
||||
font-size: 12px;
|
||||
color: $gray-re6;
|
||||
line-height: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.intro {
|
||||
display: inline-flex;
|
||||
flex-flow: row nowrap;
|
||||
flex-basis: 35%;
|
||||
flex-grow: 0;
|
||||
align-items: baseline;
|
||||
p {
|
||||
font-size: 11px;
|
||||
line-height: 1.4;
|
||||
@include ellipsis(2);
|
||||
height: 30px;
|
||||
}
|
||||
&:before {
|
||||
content: 'chat';
|
||||
@include font-family-ico($font-ico-default, 12, center, $lipstick);
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
line-height: 12px;
|
||||
margin-right: 4.8px;
|
||||
position: relative;
|
||||
top: 2px;
|
||||
}
|
||||
}
|
||||
.btn-partner-set {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 25px;
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.8);
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.8);
|
||||
height: 20px;
|
||||
margin-top: 20px;
|
||||
img {
|
||||
vertical-align: top;
|
||||
}
|
||||
}
|
||||
.intro-name {
|
||||
display: inline-flex;
|
||||
flex-flow: row nowrap;
|
||||
flex-basis: 35%;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
span {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
height: 20px;
|
||||
line-height: 20px;
|
||||
color: $gray-re70;
|
||||
font-size: 11px;
|
||||
padding: 0 10px;
|
||||
border-radius: 30px;
|
||||
border: solid 1px $warm-pink;
|
||||
background-color: #ffffff;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { DebugElement } from '@angular/core';
|
||||
|
||||
import { ProfileListItemComponent } from './profile-list-item.component';
|
||||
|
||||
describe('ucap::ucap::organization::ProfileListItemComponent', () => {
|
||||
let component: ProfileListItemComponent;
|
||||
let fixture: ComponentFixture<ProfileListItemComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [ProfileListItemComponent]
|
||||
}).compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(ProfileListItemComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
214
documents/업무/5월/4째주/backup/profile-list-item.component.ts
Normal file
214
documents/업무/5월/4째주/backup/profile-list-item.component.ts
Normal file
|
@ -0,0 +1,214 @@
|
|||
import {
|
||||
Component,
|
||||
OnInit,
|
||||
OnDestroy,
|
||||
ChangeDetectionStrategy,
|
||||
ChangeDetectorRef,
|
||||
Input,
|
||||
EventEmitter,
|
||||
Output,
|
||||
ElementRef,
|
||||
Self
|
||||
} from '@angular/core';
|
||||
import { UserInfo, GroupDetailData } from '@ucap/protocol-sync';
|
||||
import { UserInfoSS, UserInfoF, UserInfoDN } from '@ucap/protocol-query';
|
||||
import { UserInfo as RoomUserInfo } from '@ucap/protocol-room';
|
||||
import { StatusBulkInfo, StatusInfo } from '@ucap/protocol-status';
|
||||
import { PresenceType, StatusCode } from '@ucap/core';
|
||||
import { I18nService } from '@ucap/ng-i18n';
|
||||
import { ucapAnimations } from '@ucap/ng-ui';
|
||||
|
||||
export type UserInfoTypes =
|
||||
| UserInfo
|
||||
| UserInfoSS
|
||||
| UserInfoF
|
||||
| UserInfoDN
|
||||
| RoomUserInfo;
|
||||
|
||||
@Component({
|
||||
selector: 'app-group-profile-list-item',
|
||||
templateUrl: './profile-list-item.component.html',
|
||||
styleUrls: ['./profile-list-item.component.scss'],
|
||||
animations: ucapAnimations,
|
||||
changeDetection: ChangeDetectionStrategy.OnPush
|
||||
})
|
||||
export class ProfileListItemComponent implements OnInit, OnDestroy {
|
||||
@Input()
|
||||
userInfo: UserInfoF;
|
||||
|
||||
@Input()
|
||||
group: GroupDetailData;
|
||||
|
||||
@Input()
|
||||
isSearchData = false;
|
||||
|
||||
@Input()
|
||||
defaultProfileImage: string;
|
||||
|
||||
@Input()
|
||||
profileImageRoot: string;
|
||||
|
||||
@Input()
|
||||
set presence(info: StatusBulkInfo | StatusInfo) {
|
||||
this._presence = info;
|
||||
}
|
||||
get presence(): StatusBulkInfo | StatusInfo {
|
||||
return this._presence;
|
||||
}
|
||||
_presence: StatusBulkInfo | StatusInfo;
|
||||
|
||||
@Input()
|
||||
showMenu = true;
|
||||
|
||||
@Input()
|
||||
checkable = false;
|
||||
@Input()
|
||||
set isChecked(checked: boolean) {
|
||||
this._isChecked = checked;
|
||||
}
|
||||
|
||||
get isChecked(): boolean {
|
||||
return this._isChecked;
|
||||
}
|
||||
_isChecked = false;
|
||||
|
||||
@Output()
|
||||
checked = new EventEmitter<{
|
||||
isChecked: boolean;
|
||||
userInfo: UserInfoTypes;
|
||||
}>();
|
||||
|
||||
@Output()
|
||||
moreMenu: EventEmitter<{
|
||||
event: MouseEvent;
|
||||
userInfo: UserInfoTypes;
|
||||
group: GroupDetailData;
|
||||
rect: any;
|
||||
}> = new EventEmitter();
|
||||
|
||||
isClicked = false;
|
||||
isShowMenu = false;
|
||||
|
||||
@Input()
|
||||
isMe = false;
|
||||
|
||||
PresenceType = PresenceType;
|
||||
isClickMore = false;
|
||||
|
||||
constructor(
|
||||
private changeDetectorRef: ChangeDetectorRef,
|
||||
private i18nService: I18nService,
|
||||
@Self() private elementRef: ElementRef
|
||||
) {
|
||||
this.i18nService.setDefaultNamespace('organization');
|
||||
}
|
||||
|
||||
ngOnInit(): void {}
|
||||
|
||||
ngOnDestroy(): void {}
|
||||
|
||||
onClickProfileImage(event: Event, userInfo: UserInfoTypes): void {}
|
||||
|
||||
onChangeCheck(value: boolean, userInfo: UserInfoTypes) {
|
||||
this.checked.emit({
|
||||
isChecked: value,
|
||||
userInfo
|
||||
});
|
||||
}
|
||||
|
||||
getPresence(type: PresenceType): string {
|
||||
let status: string;
|
||||
let rtnClass = '';
|
||||
switch (type) {
|
||||
case PresenceType.PC:
|
||||
status = !!this.presence ? this.presence.pcStatus : undefined;
|
||||
break;
|
||||
case PresenceType.MOBILE:
|
||||
status = !!this.presence ? this.presence.mobileStatus : undefined;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (status) {
|
||||
case StatusCode.OnLine:
|
||||
rtnClass = 'online';
|
||||
break;
|
||||
case StatusCode.Away:
|
||||
rtnClass = 'absence';
|
||||
break;
|
||||
case StatusCode.Busy:
|
||||
rtnClass = 'other-business';
|
||||
break;
|
||||
default:
|
||||
rtnClass = 'offline';
|
||||
break;
|
||||
}
|
||||
|
||||
return rtnClass;
|
||||
}
|
||||
|
||||
getPresenceMsg(): string {
|
||||
let presenceMsg = this.i18nService.t('presence.offline');
|
||||
|
||||
if (!!this.presence) {
|
||||
switch (this.presence.pcStatus) {
|
||||
case StatusCode.OnLine:
|
||||
presenceMsg = this.i18nService.t('presence.online');
|
||||
break;
|
||||
case StatusCode.Away:
|
||||
presenceMsg = this.i18nService.t('presence.away');
|
||||
break;
|
||||
case StatusCode.Busy:
|
||||
if (
|
||||
!!this.presence.statusMessage &&
|
||||
this.presence.statusMessage !== '.'
|
||||
) {
|
||||
presenceMsg = this.presence.statusMessage;
|
||||
} else {
|
||||
presenceMsg = this.i18nService.t('presence.statusMessage1');
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return presenceMsg;
|
||||
}
|
||||
|
||||
onClickMore(event: MouseEvent) {
|
||||
this.isClickMore = true;
|
||||
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
||||
|
||||
this.moreMenu.emit({
|
||||
event,
|
||||
userInfo: this.userInfo,
|
||||
group: this.group,
|
||||
rect
|
||||
});
|
||||
}
|
||||
|
||||
onClickProfileContextMenu(event: MouseEvent, type: string) {}
|
||||
onClickProfile(event: MouseEvent) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
if (this.showMenu && !this.isMe) {
|
||||
this.isShowMenu = true;
|
||||
}
|
||||
}
|
||||
onMouseover(event: MouseEvent): void {
|
||||
if (this.showMenu && !this.isMe) {
|
||||
this.isShowMenu = true;
|
||||
if (this.isClickMore) {
|
||||
this.isClickMore = false;
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
onMouseleave(event: MouseEvent): void {
|
||||
if (this.showMenu && !this.isMe) {
|
||||
this.isShowMenu = false;
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
}
|
128
documents/업무/5월/4째주/backup/temp.txt
Normal file
128
documents/업무/5월/4째주/backup/temp.txt
Normal file
|
@ -0,0 +1,128 @@
|
|||
<!-- select user section -->
|
||||
<div *ngIf="isSelectionOff">
|
||||
<ng-template [ngTemplateOutlet]="selectedUserListTemplate"></ng-template>
|
||||
</div>
|
||||
|
||||
<ng-template #selectedUserListTemplate>
|
||||
<div class="list-chip">
|
||||
<mat-chip-list aria-label="User selection">
|
||||
<mat-chip
|
||||
*ngFor="let userInfo of selectedUserList"
|
||||
[selected]="getChipsRemoveYn(userInfo)"
|
||||
(removed)="onClickDeleteUser(userInfo)"
|
||||
>
|
||||
<!-- {{ userInfo | ucapTranslate: 'name' }} -->
|
||||
{{ userInfo.name }}
|
||||
<mat-icon matChipRemove *ngIf="getChipsRemoveYn(userInfo)"
|
||||
>clear</mat-icon
|
||||
>
|
||||
</mat-chip>
|
||||
</mat-chip-list>
|
||||
</div>
|
||||
<ng-container
|
||||
*ngIf="
|
||||
SelectUserDialogType.NewChat === SelectUserDialogType.NewChat;
|
||||
then newchatcount;
|
||||
else defaultcount
|
||||
"
|
||||
></ng-container>
|
||||
<ng-template #newchatcount>
|
||||
<span [ngClass]="selectedUserList.length >= 300 ? 'text-warn-color' : ''">
|
||||
{{ selectedUserList.length }} / 300
|
||||
<!-- {{ environment.productConfig.CommonSetting.maxChatRoomUser - 1 }} -->
|
||||
<!-- {{ 'common.units.persons' | translate }} -->
|
||||
</span>
|
||||
<span
|
||||
class="text-warn-color"
|
||||
style="float: right;"
|
||||
*ngIf="selectedUserList.length >= 300"
|
||||
>
|
||||
<!-- ({{
|
||||
'chat.errors.maxCountOfRoomMemberWith'
|
||||
| translate
|
||||
: {
|
||||
maxCount:
|
||||
environment.productConfig.CommonSetting.maxChatRoomUser - 1
|
||||
}
|
||||
}}) -->
|
||||
</span>
|
||||
</ng-template>
|
||||
<ng-template #defaultcount>
|
||||
<span>
|
||||
{{ selectedUserList.length }}
|
||||
<!-- {{ 'common.units.persons' | translate }} -->
|
||||
</span>
|
||||
</ng-template>
|
||||
</ng-template>
|
||||
<!-- select user section -->
|
||||
|
||||
<!--
|
||||
<perfect-scrollbar fxFlex="1 1 auto">
|
||||
<app-group-profile-list-item
|
||||
*ngFor="let userInfo of searchUserInfos"
|
||||
[userInfo]="userInfo"
|
||||
[checkable]="checkable"
|
||||
[isChecked]="getCheckedUser(userInfo)"
|
||||
defaultProfileImage="assets/images/img_nophoto_50.png"
|
||||
(checked)="onCheckUser($event)"
|
||||
>
|
||||
</app-group-profile-list-item>
|
||||
</perfect-scrollbar>
|
||||
-->
|
||||
|
||||
|
||||
<ng-template #selectedUserListTemplate>
|
||||
<div class="list-chip">
|
||||
<mat-chip-list aria-label="User selection">
|
||||
<mat-chip
|
||||
*ngFor="let userInfo of selectedUserList"
|
||||
[selected]="getChipsRemoveYn(userInfo)"
|
||||
(removed)="onClickDeleteUser(userInfo)"
|
||||
>
|
||||
<!-- {{ userInfo | ucapTranslate: 'name' }} -->
|
||||
{{ userInfo.name }}
|
||||
<mat-icon matChipRemove *ngIf="getChipsRemoveYn(userInfo)"
|
||||
>clear</mat-icon
|
||||
>
|
||||
</mat-chip>
|
||||
</mat-chip-list>
|
||||
</div>
|
||||
<ng-container
|
||||
*ngIf="
|
||||
SelectUserDialogType.NewChat === SelectUserDialogType.NewChat;
|
||||
then newchatcount;
|
||||
else defaultcount
|
||||
"
|
||||
></ng-container>
|
||||
<ng-template #newchatcount>
|
||||
<span [ngClass]="selectedUserList.length >= 300 ? 'text-warn-color' : ''">
|
||||
{{ selectedUserList.length }} / 300
|
||||
<!-- {{ environment.productConfig.CommonSetting.maxChatRoomUser - 1 }} -->
|
||||
<!-- {{ 'common.units.persons' | translate }} -->
|
||||
</span>
|
||||
<span
|
||||
class="text-warn-color"
|
||||
style="float: right;"
|
||||
*ngIf="selectedUserList.length >= 300"
|
||||
>
|
||||
<!-- ({{
|
||||
'chat.errors.maxCountOfRoomMemberWith'
|
||||
| translate
|
||||
: {
|
||||
maxCount:
|
||||
environment.productConfig.CommonSetting.maxChatRoomUser - 1
|
||||
}
|
||||
}}) -->
|
||||
</span>
|
||||
</ng-template>
|
||||
<ng-template #defaultcount>
|
||||
<span>
|
||||
{{ selectedUserList.length }}
|
||||
<!-- {{ 'common.units.persons' | translate }} -->
|
||||
</span>
|
||||
</ng-template>
|
||||
</ng-template>
|
||||
|
||||
|
||||
manage.dialog.component 버그 (동료 리스트와 선택유저 리스트 동기화)
|
||||
|
BIN
documents/업무/5월/4째주/backup/ucap-0527.zip
Normal file
BIN
documents/업무/5월/4째주/backup/ucap-0527.zip
Normal file
Binary file not shown.
BIN
documents/업무/5월/4째주/backup/ucap-angular-0527.zip
Normal file
BIN
documents/업무/5월/4째주/backup/ucap-angular-0527.zip
Normal file
Binary file not shown.
BIN
documents/업무/5월/4째주/backup/ucap-lg-web-0527.zip
Normal file
BIN
documents/업무/5월/4째주/backup/ucap-lg-web-0527.zip
Normal file
Binary file not shown.
BIN
documents/업무/new-pc-doc/New PC 메신저 릴리즈 Plan_박병은_0526.xls
Normal file
BIN
documents/업무/new-pc-doc/New PC 메신저 릴리즈 Plan_박병은_0526.xls
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user