sync
This commit is contained in:
parent
a3bb007dfb
commit
344a105583
187
documents/업무/5월/2째주/0514.txt
Normal file
187
documents/업무/5월/2째주/0514.txt
Normal file
|
@ -0,0 +1,187 @@
|
|||
<ng-template ucapGroupExpansionBuddyHeader let-node>
|
||||
<span
|
||||
class="header-buddy"
|
||||
*ngIf="
|
||||
!curGroup || (!!curGroup && curGroup.seq !== node.groupDetail.seq)
|
||||
"
|
||||
>
|
||||
<span>{{ node.groupDetail.name }}</span>
|
||||
<span>
|
||||
{{ node.children?.length }}
|
||||
</span>
|
||||
</span>
|
||||
<span
|
||||
class="header-buddy"
|
||||
*ngIf="!!curGroup && curGroup.seq === node.groupDetail.seq"
|
||||
(click)="$event.stopPropagation()"
|
||||
>
|
||||
<mat-form-field>
|
||||
<input
|
||||
matInput
|
||||
#groupInput
|
||||
placeholder=""
|
||||
[value]="node.groupDetail.name"
|
||||
/>
|
||||
<button
|
||||
mat-button
|
||||
matSuffix
|
||||
mat-icon-button
|
||||
aria-label="Clear"
|
||||
(click)="groupInput.value = ''"
|
||||
>
|
||||
<mat-icon>close</mat-icon>
|
||||
</button>
|
||||
<button
|
||||
mat-button
|
||||
mat-icon-button
|
||||
aria-label="Done"
|
||||
(click)="onModifyGroupName(groupInput.value, node.groupDetail)"
|
||||
>
|
||||
<mat-icon>done</mat-icon>
|
||||
</button>
|
||||
</mat-form-field>
|
||||
</span>
|
||||
</ng-template>
|
||||
|
||||
|
||||
<button mat-button (click)="onCancel()">취소</button>
|
||||
<button mat-button (click)="onConfirm()">
|
||||
완료
|
||||
</button>
|
||||
<button mat-button (click)="onCompleteConfirm()">
|
||||
그룹지정후 완료
|
||||
</button>
|
||||
|
||||
<form name="inputForm" [formGroup]="inputForm" novalidate>
|
||||
<mat-form-field
|
||||
hintLabel="금지단어[-,_]"
|
||||
style="display: block; margin-bottom: 10px;"
|
||||
>
|
||||
<input
|
||||
matInput
|
||||
#input
|
||||
maxlength="20"
|
||||
placeholder="{{ inputPlacholder }}"
|
||||
formControlName="groupName"
|
||||
(keyup)="onKeyupGroupName()"
|
||||
/>
|
||||
<mat-hint align="end">{{ input.value?.length || 0 }}/20</mat-hint>
|
||||
<!-- <mat-error *ngIf="inputForm.get('groupName').hasError('groupNameBanned')"> -->
|
||||
<!-- {{
|
||||
'group.errors.bannedWords'
|
||||
| translate: { bannedWords: appService.bannedGroupNames.join(',') }
|
||||
}} -->
|
||||
<!-- 금지단어[-,_] -->
|
||||
<!-- </mat-error> -->
|
||||
<!-- <mat-error *ngIf="inputForm.get('groupName').hasError('groupNameSamed')"> -->
|
||||
<!-- {{ 'group.errors.sameNameExist' | translate }} -->
|
||||
<!-- 이미 존재하는 그룹명입니다. -->
|
||||
<!-- </mat-error> -->
|
||||
</mat-form-field>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
@Component({
|
||||
selector: 'app-group-input',
|
||||
templateUrl: './group-input.component.html',
|
||||
styleUrls: ['./group-input.component.scss'],
|
||||
|
||||
changeDetection: ChangeDetectionStrategy.OnPush
|
||||
})
|
||||
export class GroupInputComponent implements OnInit, OnDestroy {
|
||||
private ngOnDestroySubject = new Subject<boolean>();
|
||||
|
||||
@Input()
|
||||
set groupName(g: string) {
|
||||
this._groupName = g;
|
||||
}
|
||||
get groupName(): string {
|
||||
return this._groupName;
|
||||
}
|
||||
_groupName: string;
|
||||
|
||||
@Input()
|
||||
inputPlacholder: string;
|
||||
|
||||
@Input()
|
||||
dialogType: SelectUserDialogType;
|
||||
|
||||
@Input()
|
||||
componentSeq: number;
|
||||
|
||||
@Input()
|
||||
groupList?: GroupDetailData[];
|
||||
|
||||
@Output()
|
||||
cancel = new EventEmitter();
|
||||
|
||||
@Output()
|
||||
confirm = new EventEmitter();
|
||||
|
||||
@Output()
|
||||
completeConfirm = new EventEmitter();
|
||||
|
||||
constructor(
|
||||
private formBuilder: FormBuilder,
|
||||
private i18nService: I18nService
|
||||
) {}
|
||||
|
||||
inputForm: FormGroup;
|
||||
|
||||
ngOnInit(): void {
|
||||
this.inputForm = this.formBuilder.group({
|
||||
groupName: [
|
||||
this.groupName,
|
||||
[
|
||||
Validators.required
|
||||
// StringUtil.includes(, CharactorType.Special),
|
||||
// this.checkBanWords(),
|
||||
// this.checkSameName()
|
||||
]
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
if (!!this.ngOnDestroySubject) {
|
||||
this.ngOnDestroySubject.complete();
|
||||
}
|
||||
}
|
||||
|
||||
getGroupName(): string {
|
||||
return this.inputForm.get('groupName').value;
|
||||
}
|
||||
|
||||
onKeyupGroupName() {
|
||||
this.inputForm.get('groupName').markAsTouched();
|
||||
}
|
||||
|
||||
checkSameName(): ValidatorFn {
|
||||
return (control: AbstractControl): { [key: string]: any } | null => {
|
||||
if (
|
||||
!control ||
|
||||
!control.value ||
|
||||
!this.groupList ||
|
||||
0 === this.groupList.length
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
const v = (control.value as string).trim();
|
||||
const ban = -1 < this.groupList.findIndex((g) => g.name === v);
|
||||
return ban ? { groupNameSamed: { value: control.value } } : null;
|
||||
};
|
||||
}
|
||||
|
||||
onCancel() {
|
||||
this.cancel.emit();
|
||||
}
|
||||
|
||||
onConfirm() {
|
||||
this.confirm.emit();
|
||||
}
|
||||
|
||||
onCompleteConfirm() {
|
||||
this.completeConfirm.emit();
|
||||
}
|
||||
}
|
1
documents/업무/5월/2째주/0515.txt
Normal file
1
documents/업무/5월/2째주/0515.txt
Normal file
|
@ -0,0 +1 @@
|
|||
5, 22, 23, 0, 16
|
80
documents/업무/5월/2째주/Untitled-1.html
Normal file
80
documents/업무/5월/2째주/Untitled-1.html
Normal file
|
@ -0,0 +1,80 @@
|
|||
<ucap-group-expansion
|
||||
#groupExpansion
|
||||
[displayOrder]="displayOrder"
|
||||
[profile]="loginRes?.userInfo"
|
||||
[favorites]="favorites"
|
||||
[groupBuddies]="groupBuddies"
|
||||
(clickMoreMenu)="onClickMoreMenu($event)"
|
||||
>
|
||||
<ng-template ucapGroupExpansionNode let-node>
|
||||
<app-group-profile-list-item
|
||||
[userInfo]="node.userInfo"
|
||||
defaultProfileImage="assets/images/img_nophoto_50.png"
|
||||
[profileImageRoot]="versionInfo2Res?.profileRoot"
|
||||
[checkable]="checkable"
|
||||
(checkUser)="onCheckUser($event)"
|
||||
(click)="onClickUser($event, node.userInfo)"
|
||||
></app-group-profile-list-item>
|
||||
</ng-template>
|
||||
|
||||
<ng-template ucapGroupExpansionFavoriteHeader let-node>
|
||||
<span class="header-favorite">
|
||||
<span>
|
||||
{{ 'category.favorite' | ucapI18n }}
|
||||
</span>
|
||||
<span>{{ node.children?.length }}</span>
|
||||
</span>
|
||||
</ng-template>
|
||||
<ng-template ucapGroupExpansionBuddyHeader let-node>
|
||||
<span
|
||||
class="header-buddy"
|
||||
*ngIf="
|
||||
!curGroup || (!!curGroup && curGroup.seq !== node.groupDetail.seq)
|
||||
"
|
||||
>
|
||||
<span>{{ node.groupDetail.name }}</span>
|
||||
<span>
|
||||
{{ node.children?.length }}
|
||||
</span>
|
||||
</span>
|
||||
<span
|
||||
class="header-buddy"
|
||||
*ngIf="!!curGroup && curGroup.seq === node.groupDetail.seq"
|
||||
(click)="$event.stopPropagation()"
|
||||
>
|
||||
<mat-form-field>
|
||||
<input
|
||||
matInput
|
||||
#groupInput
|
||||
placeholder=""
|
||||
[value]="node.groupDetail.name"
|
||||
/>
|
||||
<button
|
||||
mat-button
|
||||
matSuffix
|
||||
mat-icon-button
|
||||
aria-label="Clear"
|
||||
(click)="groupInput.value = ''"
|
||||
>
|
||||
<mat-icon>close</mat-icon>
|
||||
</button>
|
||||
<button
|
||||
mat-button
|
||||
mat-icon-button
|
||||
aria-label="Done"
|
||||
(click)="onModifyGroupName(groupInput.value, node.groupDetail)"
|
||||
>
|
||||
<mat-icon>done</mat-icon>
|
||||
</button>
|
||||
</mat-form-field>
|
||||
</span>
|
||||
</ng-template>
|
||||
<ng-template ucapGroupExpansionDefaultHeader let-node>
|
||||
<span class="header-default">
|
||||
<span>
|
||||
{{ 'category.default' | ucapI18n }}
|
||||
</span>
|
||||
<span>{{ node.children?.length }}</span>
|
||||
</span>
|
||||
</ng-template>
|
||||
</ucap-group-expansion>
|
71
documents/업무/5월/2째주/create-chat.dialog.component.html
Normal file
71
documents/업무/5월/2째주/create-chat.dialog.component.html
Normal file
|
@ -0,0 +1,71 @@
|
|||
<mat-card class="confirm-card mat-elevation-z dialog-creat-chat">
|
||||
<mat-card-header>
|
||||
<mat-card-title
|
||||
cdkDrag
|
||||
cdkDragRootElement=".cdk-overlay-pane"
|
||||
cdkDragHandle
|
||||
>{{ data.title }}</mat-card-title
|
||||
>
|
||||
<button class="icon-button btn-dialog-close" (click)="onClickChoice(false)">
|
||||
<i class="mdi mdi-window-close"></i>
|
||||
</button>
|
||||
</mat-card-header>
|
||||
<mat-card-content>
|
||||
<div>
|
||||
<ng-template #dialogContainer></ng-template>
|
||||
</div>
|
||||
<ng-template [ngTemplateOutlet]="selectedUserListTemplate"></ng-template>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
|
||||
<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>
|
215
documents/업무/5월/2째주/create-chat.dialog.component.ts
Normal file
215
documents/업무/5월/2째주/create-chat.dialog.component.ts
Normal file
|
@ -0,0 +1,215 @@
|
|||
import {
|
||||
Component,
|
||||
OnInit,
|
||||
OnDestroy,
|
||||
AfterViewInit,
|
||||
ChangeDetectionStrategy,
|
||||
ChangeDetectorRef,
|
||||
Inject,
|
||||
ViewChild,
|
||||
ComponentFactoryResolver,
|
||||
ViewContainerRef,
|
||||
ComponentRef
|
||||
} from '@angular/core';
|
||||
import { UserInfo, GroupDetailData } from '@ucap/protocol-sync';
|
||||
import {
|
||||
UserInfoSS,
|
||||
UserInfoF,
|
||||
UserInfoDN,
|
||||
DeptInfo
|
||||
} from '@ucap/protocol-query';
|
||||
|
||||
import { Store, select } from '@ngrx/store';
|
||||
|
||||
import { Subject, combineLatest } from 'rxjs';
|
||||
import { AppAuthenticationService } from '@app/services/app-authentication.service';
|
||||
import { SelectUserDialogType } from '@app/types';
|
||||
import { RoomInfo, UserInfo as RoomUserInfo } from '@ucap/protocol-room';
|
||||
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { SelectUserSectionComponent } from '../../select-user.section.component';
|
||||
import { GroupActions } from '@ucap/ng-store-group';
|
||||
import { UserInfoTypes } from '../profile-list-item.component';
|
||||
|
||||
import { GroupInputComponent } from '../group-input.component';
|
||||
|
||||
export interface CreateChatDialogData {
|
||||
type?: SelectUserDialogType;
|
||||
title: string;
|
||||
/** CASE :: EditMember */
|
||||
group?: GroupDetailData;
|
||||
/** CASE :: EventForward */
|
||||
ignoreRoom?: RoomInfo[];
|
||||
/** CASE :: EditChatMember */
|
||||
curRoomUser?: (
|
||||
| UserInfo
|
||||
| UserInfoSS
|
||||
| UserInfoF
|
||||
| UserInfoDN
|
||||
| RoomUserInfo
|
||||
)[];
|
||||
}
|
||||
export interface CreateChatDialogResult {
|
||||
choice: boolean;
|
||||
groupName?: string;
|
||||
oldGroup?: GroupDetailData;
|
||||
selectedUserList?: (
|
||||
| UserInfo
|
||||
| UserInfoSS
|
||||
| UserInfoF
|
||||
| UserInfoDN
|
||||
| RoomUserInfo
|
||||
)[];
|
||||
selectedRoom: RoomInfo;
|
||||
}
|
||||
|
||||
@Component({
|
||||
selector: 'app-create-chat.dialog',
|
||||
templateUrl: './create-chat.dialog.component.html',
|
||||
styleUrls: ['./create-chat.dialog.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush
|
||||
})
|
||||
export class CreateChatDialogComponent implements OnInit, OnDestroy {
|
||||
@ViewChild('selectBoxUserComponent', { static: false })
|
||||
selectBoxUserComponent: SelectUserSectionComponent;
|
||||
@ViewChild('dialogContainer', { static: true, read: ViewContainerRef })
|
||||
dialogContainer: ViewContainerRef;
|
||||
|
||||
componentRef: ComponentRef<any>;
|
||||
|
||||
constructor(
|
||||
public dialogRef: MatDialogRef<
|
||||
CreateChatDialogData,
|
||||
CreateChatDialogResult
|
||||
>,
|
||||
@Inject(MAT_DIALOG_DATA) public data: CreateChatDialogData,
|
||||
private changeDetectorRef: ChangeDetectorRef,
|
||||
private store: Store<any>,
|
||||
private appAuthenticationService: AppAuthenticationService,
|
||||
private cfResolver: ComponentFactoryResolver
|
||||
) {}
|
||||
|
||||
private ngOnDestroySubject = new Subject<boolean>();
|
||||
|
||||
selectedUserList: UserInfoTypes[] = [];
|
||||
SelectUserDialogType = SelectUserDialogType;
|
||||
selectedRoom: RoomInfo;
|
||||
|
||||
groupName: string;
|
||||
|
||||
ngOnInit(): void {
|
||||
this.loadComponent();
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
if (!!this.ngOnDestroySubject) {
|
||||
this.ngOnDestroySubject.complete();
|
||||
}
|
||||
this.componentRef.destroy();
|
||||
}
|
||||
|
||||
loadComponent() {
|
||||
switch (this.data.type) {
|
||||
case SelectUserDialogType.NewGroup:
|
||||
case SelectUserDialogType.ModifyGroup:
|
||||
{
|
||||
this.dialogContainer.clear();
|
||||
const factory = this.cfResolver.resolveComponentFactory(
|
||||
GroupInputComponent
|
||||
);
|
||||
|
||||
this.componentRef = this.dialogContainer.createComponent(factory);
|
||||
const cpInstance = this.componentRef.instance;
|
||||
cpInstance.dialogType = this.data.type;
|
||||
|
||||
cpInstance.groupName =
|
||||
!!this.data.group && !!this.data.group.name
|
||||
? this.data.group.name
|
||||
: '';
|
||||
cpInstance.inputPlacholder = '그룹';
|
||||
cpInstance.cancel.subscribe(() => {
|
||||
this.dialogRef.close();
|
||||
});
|
||||
cpInstance.confirm.subscribe(() => {
|
||||
this.groupName = this.componentRef.instance.getGroupName();
|
||||
this.doAction();
|
||||
});
|
||||
cpInstance.completeConfirm.subscribe(() => {
|
||||
this.groupName = this.componentRef.instance.getGroupName();
|
||||
this.showSelectUserComponent();
|
||||
});
|
||||
}
|
||||
break;
|
||||
case SelectUserDialogType.NewChat:
|
||||
{
|
||||
// 새로운 대화 유형 & 대화방 이름 섹션 컴포넌트
|
||||
// 유저 선택 컴포넌트
|
||||
}
|
||||
break;
|
||||
case SelectUserDialogType.EditChatMember:
|
||||
{
|
||||
// 유저 선택 컴포넌트
|
||||
}
|
||||
break;
|
||||
case SelectUserDialogType.EditMember:
|
||||
{
|
||||
// 그룹 멤버 관리 컴포넌트
|
||||
// 유저 선택 컴포넌트
|
||||
}
|
||||
break;
|
||||
case SelectUserDialogType.MessageForward:
|
||||
{
|
||||
// 유저 선택 컴포넌트
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
onClickChoice(choice: boolean) {
|
||||
if (!choice) {
|
||||
this.dialogRef.close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
getBtnValid() {}
|
||||
getChipsRemoveYn(userInfo: UserInfo) {}
|
||||
onClickDeleteUser(userInfo: UserInfo) {}
|
||||
|
||||
onChangeSelectedUserList(userList: UserInfoTypes[]) {
|
||||
this.selectedUserList = userList;
|
||||
this.changeDetectorRef.markForCheck();
|
||||
}
|
||||
|
||||
doAction() {
|
||||
this.dialogRef.close({
|
||||
choice: true,
|
||||
selectedUserList: this.selectedUserList,
|
||||
selectedRoom: this.selectedRoom,
|
||||
groupName: this.groupName,
|
||||
oldGroup: undefined
|
||||
});
|
||||
}
|
||||
|
||||
private showSelectUserComponent() {
|
||||
this.dialogContainer.clear();
|
||||
const factory = this.cfResolver.resolveComponentFactory(
|
||||
SelectUserSectionComponent
|
||||
);
|
||||
|
||||
this.componentRef = this.dialogContainer.createComponent(factory);
|
||||
this.componentRef.instance.cancel.subscribe(() => {
|
||||
if (
|
||||
this.data.type === SelectUserDialogType.NewGroup ||
|
||||
this.data.type === SelectUserDialogType.ModifyGroup
|
||||
) {
|
||||
this.loadComponent();
|
||||
}
|
||||
});
|
||||
this.componentRef.instance.confirm.subscribe(() => {
|
||||
this.doAction();
|
||||
});
|
||||
|
||||
this.componentRef.instance.changeUserList.subscribe((list) => {
|
||||
this.selectedUserList = list;
|
||||
});
|
||||
}
|
||||
}
|
211
documents/업무/5월/2째주/profile.component.html
Normal file
211
documents/업무/5월/2째주/profile.component.html
Normal file
|
@ -0,0 +1,211 @@
|
|||
<div class="mainProfile">
|
||||
<!--Profile -->
|
||||
<div class="profile-card-box">
|
||||
<!-- + 내프로필 -->
|
||||
<ng-container *ngIf="isMe; then isMine; else other"></ng-container>
|
||||
<ng-template #isMine>
|
||||
<div class="user-profile-info">
|
||||
<!--[[ 대화상대 프로필-->
|
||||
<!-- 모바일이 온라인일 경우 + mobile-ing -->
|
||||
<!--
|
||||
<div class="user-profile-thumb mobile-ing">
|
||||
<span class="presence">온라인</span>
|
||||
<div class="profileImage">
|
||||
<img
|
||||
src="https://material.angular.io/assets/img/examples/shiba2.jpg"
|
||||
style="width: 122px; height: 122px;"
|
||||
/>
|
||||
</div>
|
||||
</div>-->
|
||||
<!--]]-->
|
||||
|
||||
<!--[[ 내프로필-->
|
||||
<div class="user-profile-thumb">
|
||||
<span class="presence">온라인</span>
|
||||
<div class="profileImage">
|
||||
<img
|
||||
src="../../../assets/images/ico/img_nophoto.svg"
|
||||
style="width: 122px; height: 122px;"
|
||||
/>
|
||||
</div>
|
||||
<div class="btn-profile-ctrl">
|
||||
<button mat-mini-fab color="primary" class="mat-mini36-fab">
|
||||
<mat-icon class="material-icons-outlined">camera_alt</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!--]]-->
|
||||
|
||||
<div class="userInfo">
|
||||
<div class="user-n-g">
|
||||
<div class="name">{{ userInfo?.name }}</div>
|
||||
<div class="grade">{{ userInfo?.grade }}</div>
|
||||
</div>
|
||||
<div class="deptName">({{ userInfo?.nameEn }})</div>
|
||||
</div>
|
||||
<div class="btn-profile-add">
|
||||
<button
|
||||
mat-icon-button
|
||||
class="btn-star-add"
|
||||
aria-label="Example icon-button with a heart icon"
|
||||
*ngIf="!isFavorite"
|
||||
>
|
||||
<img
|
||||
src="../../../assets/images/ico/btn_favorite_w24_s.svg"
|
||||
alt=""
|
||||
/>
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
class="btn-star-add"
|
||||
aria-label="Example icon-button with a heart icon"
|
||||
*ngIf="!isBuddy"
|
||||
>
|
||||
<img
|
||||
src="../../../assets/images/ico/btn_group_add_w24.svg"
|
||||
alt=""
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="my-input inputtype">
|
||||
<mat-form-field
|
||||
class="example-full-width my-in-input"
|
||||
appearance="none"
|
||||
>
|
||||
<mat-label></mat-label>
|
||||
<input matInput placeholder="" value="마곡 사이언스 파크 E14동 9층" />
|
||||
</mat-form-field>
|
||||
<button mat-icon-button aria-label="icon create" class="color-white">
|
||||
<mat-icon>create</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
</ng-template>
|
||||
<!-- + 대회상대 프로필-->
|
||||
<ng-template #other>
|
||||
<div class="user-profile-info">
|
||||
<!--[[ 대화상대 프로필-->
|
||||
<!-- 모바일이 온라인일 경우 + mobile-ing -->
|
||||
<!--
|
||||
<div class="user-profile-thumb mobile-ing">
|
||||
<span class="presence">온라인</span>
|
||||
<div class="profileImage">
|
||||
<img
|
||||
src="https://material.angular.io/assets/img/examples/shiba2.jpg"
|
||||
style="width: 122px; height: 122px;"
|
||||
/>
|
||||
</div>
|
||||
</div>-->
|
||||
<!--]]-->
|
||||
|
||||
<!--[[ 내프로필-->
|
||||
<div class="user-profile-thumb">
|
||||
<span class="presence">온라인</span>
|
||||
<div class="profileImage">
|
||||
<img
|
||||
src="../../../assets/images/ico/img_nophoto.svg"
|
||||
style="width: 122px; height: 122px;"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<!--]]-->
|
||||
|
||||
<div class="userInfo">
|
||||
<div class="user-n-g">
|
||||
<div class="name">{{ userInfo?.name }}</div>
|
||||
<div class="grade">{{ userInfo?.grade }}</div>
|
||||
</div>
|
||||
<div class="deptName">({{ userInfo?.nameEn }})</div>
|
||||
<!-- + 대화상대 프로필 추가 -->
|
||||
<!-- -->
|
||||
|
||||
<div class="nickName">
|
||||
<div class="nickName-info">닉네임 미설정</div>
|
||||
<button
|
||||
mat-icon-button
|
||||
aria-label="icon create"
|
||||
class="color-white"
|
||||
>
|
||||
<mat-icon>create</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
<div class="address-txt">
|
||||
마곡 사이언스 파크 E14동 9층
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn-profile-add">
|
||||
<button
|
||||
mat-icon-button
|
||||
class="btn-star-add"
|
||||
aria-label="Example icon-button with a heart icon"
|
||||
*ngIf="!isFavorite"
|
||||
>
|
||||
<img
|
||||
src="../../../assets/images/ico/btn_favorite_w24_s.svg"
|
||||
alt=""
|
||||
/>
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
class="btn-star-add"
|
||||
aria-label="Example icon-button with a heart icon"
|
||||
*ngIf="!isBuddy"
|
||||
>
|
||||
<img
|
||||
src="../../../assets/images/ico/btn_group_add_w24.svg"
|
||||
alt=""
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn-partner-set">
|
||||
<button mat-icon-button aria-label="chat">
|
||||
<img src="../../../assets/images/ico/btn_lise_chat_a24.svg" alt="" />
|
||||
</button>
|
||||
<button mat-icon-button aria-label="message">
|
||||
<img
|
||||
src="../../../assets/images/ico/btn_list_message_a24.svg"
|
||||
alt=""
|
||||
/>
|
||||
</button>
|
||||
<button mat-icon-button aria-label="mobile">
|
||||
<img
|
||||
src="../../../assets/images/ico/btn_list_mobile_a24.svg"
|
||||
alt=""
|
||||
/>
|
||||
</button>
|
||||
<button mat-icon-button aria-label="call">
|
||||
<img src="../../../assets/images/ico/btn_list_call_a24.svg" alt="" />
|
||||
</button>
|
||||
<button mat-icon-button aria-label="vc">
|
||||
<img src="../../../assets/images/ico/btn_list_vc-a24.svg" alt="" />
|
||||
</button>
|
||||
</div>
|
||||
</ng-template>
|
||||
<div class="user-profile-info-list">
|
||||
<ul>
|
||||
<li>
|
||||
<span>{{ 'profile.labels.company' | ucapI18n }}</span>
|
||||
{{ userInfo?.companyName }}
|
||||
</li>
|
||||
<li>
|
||||
<span>{{ 'profile.labels.department' | ucapI18n }}</span>
|
||||
{{ userInfo?.deptName }}
|
||||
</li>
|
||||
<li>
|
||||
<span>{{ 'profile.labels.email' | ucapI18n }}</span>
|
||||
{{ userInfo?.email }}
|
||||
</li>
|
||||
<li>
|
||||
<span>{{ 'profile.labels.linePhoneNumber' | ucapI18n }}</span>
|
||||
{{ userInfo?.lineNumber }}
|
||||
</li>
|
||||
<li>
|
||||
<span>{{ 'profile.labels.mobilePhoneNumber' | ucapI18n }}</span>
|
||||
{{ userInfo?.hpNumber }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- //Profile-->
|
||||
</div>
|
222
documents/업무/5월/2째주/profile.component.scss
Normal file
222
documents/업무/5월/2째주/profile.component.scss
Normal file
|
@ -0,0 +1,222 @@
|
|||
@charset 'UTF-8';
|
||||
|
||||
@import '../../../../../assets/scss/components.scss';
|
||||
|
||||
.mainProfile {
|
||||
height: calc(100% - 30px);
|
||||
min-width: 450px;
|
||||
margin: {
|
||||
left: 30px;
|
||||
bottom: 30px;
|
||||
}
|
||||
@include screen(mid) {
|
||||
height: auto;
|
||||
}
|
||||
//margin: 30px;
|
||||
background-image: url(/assets/images/bg/bg_profile1.svg),
|
||||
url(/assets/images/bg/bg_profile2.svg),
|
||||
url(/assets/images/bg/bg_profile3.svg),
|
||||
url(/assets/images/bg/bg_profile4.svg),
|
||||
url(/assets/images/bg/bg_profile5.svg), $bg-linear-gradient;
|
||||
background-repeat: no-repeat;
|
||||
background-position: -213px -223px, 433px 95px, 489px 72px, 433px 517px,
|
||||
335px 634px, 0 0;
|
||||
.profile-card-box {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 60px 8.7%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
.user-profile-info {
|
||||
display: inline-flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
// Profile thumb//////////////////
|
||||
.user-profile-thumb {
|
||||
@include profile-avatar-default(
|
||||
10px 0 0,
|
||||
18.6,
|
||||
$green,
|
||||
30px
|
||||
); //오른 아래 공간, 모바일 온라인 아이콘 크기, 모바일 아이콘 색, 모바일 아이콘 bg크기
|
||||
padding: 10px 0 0;
|
||||
margin-left: -14px;
|
||||
align-self: start;
|
||||
.presence {
|
||||
//PC 상태
|
||||
@include presence-state(14px); //원크기
|
||||
margin-top: -10px;
|
||||
}
|
||||
.profileImage {
|
||||
@include avatar-img(128px, 0); //아바타 크기, 왼쪽공간
|
||||
border: 3px solid $white;
|
||||
}
|
||||
.btn-profile-ctrl {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
//////////////////Profile thumb //
|
||||
.userInfo {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: center;
|
||||
padding-left: 38px;
|
||||
.user-n-g {
|
||||
display: flex;
|
||||
flex-flow: row-reverse nowrap;
|
||||
align-items: flex-end;
|
||||
height: 44px;
|
||||
.name {
|
||||
font: {
|
||||
size: 26px;
|
||||
weight: 600;
|
||||
}
|
||||
color: $gray-re20;
|
||||
order: 1;
|
||||
-ms-flex-order: 1;
|
||||
}
|
||||
.grade {
|
||||
font: {
|
||||
size: 18px;
|
||||
}
|
||||
color: #f1f1f1;
|
||||
margin-left: 6px;
|
||||
order: 0;
|
||||
-ms-flex-order: 0;
|
||||
}
|
||||
& + .deptName {
|
||||
margin-top: 9px;
|
||||
}
|
||||
}
|
||||
.deptName {
|
||||
font-size: 22px;
|
||||
color: $white;
|
||||
line-height: 25px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.nickName {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: 18px;
|
||||
align-items: center;
|
||||
.nickName-info {
|
||||
padding: 0 16px;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
border-radius: 15px;
|
||||
border: solid 1px #fc5182;
|
||||
background-color: rgba(255, 255, 255, 0.95);
|
||||
color: $gray-re9;
|
||||
font-size: 14px;
|
||||
}
|
||||
button {
|
||||
}
|
||||
}
|
||||
.address-txt {
|
||||
font-size: 16px;
|
||||
line-height: 21px;
|
||||
color: $gray-re3;
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
.btn-profile-add {
|
||||
position: absolute;
|
||||
z-index: 5;
|
||||
top: 40px;
|
||||
right: 40px;
|
||||
button {
|
||||
margin: 0 2px;
|
||||
&.btn-star-add {
|
||||
line-height: 24px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.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: 70px;
|
||||
margin-top: 30px;
|
||||
img {
|
||||
vertical-align: top;
|
||||
}
|
||||
}
|
||||
.my-input {
|
||||
display: flex;
|
||||
flex-flow: row nowrap;
|
||||
justify-content: space-between;
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
border-bottom: 1px solid $white;
|
||||
margin-top: 78px;
|
||||
.my-in-input {
|
||||
font-size: 16px;
|
||||
color: $gray-re3;
|
||||
flex-grow: 1;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
button {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
.user-profile-info-list {
|
||||
margin-top: 60px;
|
||||
ul {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
height: 250px;
|
||||
li {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: $brown;
|
||||
span {
|
||||
width: 100px;
|
||||
height: 34px;
|
||||
border-radius: 18px;
|
||||
border: solid 1px #f8f9fd;
|
||||
background-color: #aaa0a5;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: $white;
|
||||
margin-right: 40px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////// 제거
|
||||
.profile-card {
|
||||
//mat-card
|
||||
width: 100%;
|
||||
background-color: transparent;
|
||||
box-shadow: none;
|
||||
.profileImage {
|
||||
width: 126px;
|
||||
height: 126px;
|
||||
border-radius: 50%;
|
||||
border: 3px solid $white;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
img {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
}
|
288
documents/업무/5월/2째주/profile.component.ts
Normal file
288
documents/업무/5월/2째주/profile.component.ts
Normal file
|
@ -0,0 +1,288 @@
|
|||
import {
|
||||
Component,
|
||||
OnInit,
|
||||
OnDestroy,
|
||||
ChangeDetectionStrategy,
|
||||
ChangeDetectorRef,
|
||||
Input,
|
||||
Output,
|
||||
EventEmitter,
|
||||
ViewChild,
|
||||
ElementRef
|
||||
} from '@angular/core';
|
||||
|
||||
import { AppKey } from '@app/types/app-key.type';
|
||||
import { LoginSession } from '@app/models/login-session';
|
||||
import { Subject } from 'rxjs';
|
||||
import { UserInfoSS, AuthResponse } from '@ucap/protocol-query';
|
||||
import { OpenProfileOptions } from '@ucap/protocol-buddy';
|
||||
import { FileUploadItem } from '@ucap/api';
|
||||
import { FormControl } from '@angular/forms';
|
||||
import { WorkStatusType } from '@ucap/protocol';
|
||||
import { I18nService } from '@ucap/ng-i18n';
|
||||
|
||||
@Component({
|
||||
selector: 'app-group-profile',
|
||||
templateUrl: './profile.component.html',
|
||||
styleUrls: ['./profile.component.scss'],
|
||||
|
||||
changeDetection: ChangeDetectionStrategy.OnPush
|
||||
})
|
||||
export class ProfileComponent implements OnInit, OnDestroy {
|
||||
@Input()
|
||||
set userInfo(u: UserInfoSS) {
|
||||
this._userInfo = u;
|
||||
}
|
||||
get userInfo(): UserInfoSS {
|
||||
return this._userInfo;
|
||||
}
|
||||
_userInfo: UserInfoSS;
|
||||
@Input()
|
||||
isMe: boolean;
|
||||
@Input()
|
||||
isBuddy: boolean;
|
||||
@Input()
|
||||
isFavorite: boolean;
|
||||
@Input()
|
||||
myMadn?: string;
|
||||
@Input()
|
||||
canVideoConfernece: boolean;
|
||||
|
||||
@Output()
|
||||
toggleFavorite = new EventEmitter<{
|
||||
userInfo: UserInfoSS;
|
||||
isFavorite: boolean;
|
||||
}>();
|
||||
@Output()
|
||||
toggleBuddy = new EventEmitter<{
|
||||
userInfo: UserInfoSS;
|
||||
isBuddy: boolean;
|
||||
}>();
|
||||
@Output()
|
||||
openChat = new EventEmitter<UserInfoSS>();
|
||||
@Output()
|
||||
sendCall = new EventEmitter<string>();
|
||||
@Output()
|
||||
sendSms = new EventEmitter<string>();
|
||||
@Output()
|
||||
createConference = new EventEmitter<number>();
|
||||
@Output()
|
||||
sendMessage = new EventEmitter<UserInfoSS>();
|
||||
|
||||
///////////////////////////////////////////////
|
||||
|
||||
@Input()
|
||||
profileImageRoot: string;
|
||||
|
||||
@Input()
|
||||
openProfileOptions?: OpenProfileOptions;
|
||||
@Input()
|
||||
useBuddyToggleButton: boolean;
|
||||
@Input()
|
||||
authInfo: AuthResponse;
|
||||
@Output()
|
||||
profileImageView = new EventEmitter<void>();
|
||||
@Output()
|
||||
uploadProfileImage = new EventEmitter<FileUploadItem>();
|
||||
@Output()
|
||||
updateIntro = new EventEmitter<string>();
|
||||
|
||||
@ViewChild('profileImageFileInput', { static: false })
|
||||
profileImageFileInput: ElementRef<HTMLInputElement>;
|
||||
|
||||
userIntroFormControl = new FormControl('');
|
||||
profileImageFileUploadItem: FileUploadItem;
|
||||
|
||||
private ngOnDestroySubject = new Subject<boolean>();
|
||||
|
||||
constructor(private i18nService: I18nService) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
console.log(this.isMe);
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
if (!!this.ngOnDestroySubject) {
|
||||
this.ngOnDestroySubject.complete();
|
||||
}
|
||||
}
|
||||
|
||||
onToggleFavorit() {
|
||||
this.toggleFavorite.emit({
|
||||
userInfo: this.userInfo,
|
||||
isFavorite: !this.isFavorite
|
||||
});
|
||||
}
|
||||
|
||||
onClickToggleBuddy() {
|
||||
this.toggleBuddy.emit({
|
||||
userInfo: this.userInfo,
|
||||
isBuddy: !this.isBuddy
|
||||
});
|
||||
}
|
||||
|
||||
onClickActionButton(event: MouseEvent, type: string): void {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
switch (type) {
|
||||
case 'CHAT':
|
||||
this.onClickOpenChat();
|
||||
break;
|
||||
case 'MESSAGE':
|
||||
this.onClickMessage();
|
||||
break;
|
||||
case 'SMS':
|
||||
this.onClickSMS();
|
||||
break;
|
||||
case 'CALL_MOBILE':
|
||||
this.onClickCall('MOBILE');
|
||||
break;
|
||||
case 'CALL_LINE':
|
||||
this.onClickCall('LINE');
|
||||
break;
|
||||
case 'CONFERENCE':
|
||||
this.onClickVideoConference();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onClickOpenChat() {
|
||||
this.openChat.emit(this.userInfo);
|
||||
}
|
||||
|
||||
onClickCall(type: string) {
|
||||
let calleeNumber = '';
|
||||
|
||||
if (type === 'LINE') {
|
||||
calleeNumber = this.userInfo.lineNumber;
|
||||
} else {
|
||||
calleeNumber = this.userInfo.hpNumber;
|
||||
}
|
||||
this.sendCall.emit(calleeNumber);
|
||||
}
|
||||
|
||||
onClickSMS() {
|
||||
this.sendSms.emit(this.userInfo.hpNumber);
|
||||
}
|
||||
|
||||
onClickVideoConference() {
|
||||
this.createConference.emit(Number(this.userInfo.seq));
|
||||
}
|
||||
|
||||
onClickMessage() {
|
||||
this.sendMessage.emit(this.userInfo);
|
||||
}
|
||||
|
||||
isDisabledCallButton(type: string): boolean {
|
||||
if (!this.myMadn || this.myMadn.trim().length === 0) {
|
||||
if (type === 'LINE' || type === 'MOBILE') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (type === 'LINE') {
|
||||
if (
|
||||
!!this.userInfo &&
|
||||
!!this.userInfo.lineNumber &&
|
||||
this.userInfo.lineNumber.trim().length > 0
|
||||
) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else if (type === 'MOBILE') {
|
||||
if (
|
||||
!!this.userInfo &&
|
||||
!!this.userInfo.hpNumber &&
|
||||
this.userInfo.hpNumber.trim().length > 0
|
||||
) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else if (type === 'SMS') {
|
||||
// const smsUtils = new SmsUtils(
|
||||
// this.sessionStorageService,
|
||||
// this.nativeService
|
||||
// );
|
||||
// return !smsUtils.getAuthSms();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////
|
||||
|
||||
onClickProfileImageView() {
|
||||
this.profileImageView.emit();
|
||||
}
|
||||
|
||||
onApplyIntroMessage(intro: string) {
|
||||
if (intro.trim().length < 1) {
|
||||
this.updateIntro.emit(' ');
|
||||
} else {
|
||||
this.updateIntro.emit(intro);
|
||||
}
|
||||
}
|
||||
|
||||
onChangeFileInput() {
|
||||
this.profileImageFileUploadItem = FileUploadItem.fromFiles(
|
||||
this.profileImageFileInput.nativeElement.files
|
||||
)[0];
|
||||
|
||||
this.uploadProfileImage.emit(this.profileImageFileUploadItem);
|
||||
|
||||
this.profileImageFileInput.nativeElement.value = '';
|
||||
}
|
||||
|
||||
getWorkstatus(userInfo: UserInfoSS): string {
|
||||
let workstatus = '';
|
||||
if (!!userInfo && !!userInfo.workstatus) {
|
||||
switch (userInfo.workstatus) {
|
||||
case WorkStatusType.VacationAM:
|
||||
workstatus = '오전';
|
||||
break;
|
||||
case WorkStatusType.VacationPM:
|
||||
workstatus = '오후';
|
||||
break;
|
||||
case WorkStatusType.VacationAll:
|
||||
workstatus = '휴가';
|
||||
break;
|
||||
case WorkStatusType.LeaveOfAbsence:
|
||||
workstatus = '휴직';
|
||||
break;
|
||||
case WorkStatusType.LongtermRefresh:
|
||||
workstatus = '장기';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return workstatus;
|
||||
}
|
||||
getWorkstatusStyle(userInfo: UserInfoSS): string {
|
||||
// morning-off: 오전 afternoon-off: 오후 day-off: 휴가 long-time: 장기 leave-of-absence: 휴직
|
||||
let style = '';
|
||||
if (!!userInfo && !!userInfo.workstatus) {
|
||||
switch (userInfo.workstatus) {
|
||||
case WorkStatusType.VacationAM:
|
||||
style = 'morning-off';
|
||||
break;
|
||||
case WorkStatusType.VacationPM:
|
||||
style = 'afternoon-off';
|
||||
break;
|
||||
case WorkStatusType.VacationAll:
|
||||
style = 'day-off';
|
||||
break;
|
||||
case WorkStatusType.LeaveOfAbsence:
|
||||
style = 'leave-of-absence';
|
||||
break;
|
||||
case WorkStatusType.LongtermRefresh:
|
||||
style = 'long-time';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return style;
|
||||
}
|
||||
}
|
BIN
documents/업무/5월/2째주/ucap-angular.zip
Normal file
BIN
documents/업무/5월/2째주/ucap-angular.zip
Normal file
Binary file not shown.
BIN
documents/업무/5월/2째주/ucap-lg-mockup.zip
Normal file
BIN
documents/업무/5월/2째주/ucap-lg-mockup.zip
Normal file
Binary file not shown.
BIN
documents/업무/5월/2째주/ucap-lg-web.zip
Normal file
BIN
documents/업무/5월/2째주/ucap-lg-web.zip
Normal file
Binary file not shown.
BIN
documents/업무/5월/2째주/ucap.zip
Normal file
BIN
documents/업무/5월/2째주/ucap.zip
Normal file
Binary file not shown.
BIN
weekly-report/5월/주간보고_박병은_2020.0515.pptx
Normal file
BIN
weekly-report/5월/주간보고_박병은_2020.0515.pptx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user