This commit is contained in:
병준 박 2020-01-03 10:25:30 +09:00
commit e5147eea43
30 changed files with 616 additions and 403 deletions

View File

@ -17,7 +17,7 @@ import {
CreateChatDialogData, CreateChatDialogData,
CreateChatDialogResult CreateChatDialogResult
} from '@app/layouts/messenger/dialogs/chat/create-chat.dialog.component'; } from '@app/layouts/messenger/dialogs/chat/create-chat.dialog.component';
import { Subscription, of, Observable } from 'rxjs'; import { Subscription, Observable } from 'rxjs';
import { Store, select } from '@ngrx/store'; import { Store, select } from '@ngrx/store';
import * as AppStore from '@app/store'; import * as AppStore from '@app/store';
@ -35,9 +35,8 @@ import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
import { OpenProfileOptions } from '@ucap-webmessenger/protocol-buddy'; import { OpenProfileOptions } from '@ucap-webmessenger/protocol-buddy';
import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { SessionStorageService } from '@ucap-webmessenger/web-storage';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
import { MessageApiService, MessageType } from '@ucap-webmessenger/api-message'; import { MessageType } from '@ucap-webmessenger/api-message';
import { DeviceType } from '@ucap-webmessenger/core'; import { tap } from 'rxjs/operators';
import { map, catchError, tap } from 'rxjs/operators';
import { import {
MessageWriteDialogComponent, MessageWriteDialogComponent,
MessageWriteDialogResult, MessageWriteDialogResult,
@ -46,8 +45,7 @@ import {
import { import {
EnvironmentsInfo, EnvironmentsInfo,
KEY_ENVIRONMENTS_INFO, KEY_ENVIRONMENTS_INFO,
KEY_VER_INFO, KEY_VER_INFO
KEY_LOGIN_RES_INFO
} from '@app/types'; } from '@app/types';
import { MessageBoxComponent } from './left-sidenav/message.component'; import { MessageBoxComponent } from './left-sidenav/message.component';
import { environment } from '../../../../environments/environment'; import { environment } from '../../../../environments/environment';
@ -70,7 +68,7 @@ export enum MainMenu {
export class LeftSideComponent implements OnInit, OnDestroy { export class LeftSideComponent implements OnInit, OnDestroy {
@Output() @Output()
openProfile = new EventEmitter<{ openProfile = new EventEmitter<{
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; userSeq: number;
openProfileOptions?: OpenProfileOptions; openProfileOptions?: OpenProfileOptions;
}>(); }>();
@Output() @Output()
@ -264,11 +262,11 @@ export class LeftSideComponent implements OnInit, OnDestroy {
} }
onClickOpenProfile(params: { onClickOpenProfile(params: {
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; userSeq: number;
openProfileOptions?: OpenProfileOptions; openProfileOptions?: OpenProfileOptions;
}) { }) {
this.openProfile.emit({ this.openProfile.emit({
userInfo: params.userInfo, userSeq: params.userSeq,
openProfileOptions: params.openProfileOptions openProfileOptions: params.openProfileOptions
}); });
} }

View File

@ -86,7 +86,7 @@ export class GroupComponent implements OnInit, OnDestroy {
newGroupAndMember = new EventEmitter(); newGroupAndMember = new EventEmitter();
@Output() @Output()
openProfile = new EventEmitter<{ openProfile = new EventEmitter<{
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; userSeq: number;
openProfileOptions?: OpenProfileOptions; openProfileOptions?: OpenProfileOptions;
}>(); }>();
@ -432,7 +432,7 @@ export class GroupComponent implements OnInit, OnDestroy {
switch (menuType) { switch (menuType) {
case 'VIEW_PROFILE': case 'VIEW_PROFILE':
this.openProfile.emit({ this.openProfile.emit({
userInfo, userSeq: userInfo.seq,
openProfileOptions: { openProfileOptions: {
useDelBuddybutton: useDelBuddybutton:
!!group && !!group &&
@ -570,11 +570,11 @@ export class GroupComponent implements OnInit, OnDestroy {
} }
onClickOpenProfile( onClickOpenProfile(
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN, userSeq: number,
group: GroupDetailData group: GroupDetailData
) { ) {
this.openProfile.emit({ this.openProfile.emit({
userInfo, userSeq,
openProfileOptions: { openProfileOptions: {
useDelBuddybutton: useDelBuddybutton:
!!group && !!group &&

View File

@ -75,7 +75,6 @@ import {
CommonApiService, CommonApiService,
FileTalkSaveRequest, FileTalkSaveRequest,
FileTalkSaveResponse, FileTalkSaveResponse,
TranslationReqRequest,
TranslationSaveRequest, TranslationSaveRequest,
TranslationSaveResponse TranslationSaveResponse
} from '@ucap-webmessenger/api-common'; } from '@ucap-webmessenger/api-common';
@ -117,7 +116,9 @@ import {
}) })
export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
@Output() @Output()
openProfile = new EventEmitter<{ userInfo: UserInfo }>(); openProfile = new EventEmitter<{
userSeq: number;
}>();
@ViewChild('chatForm', { static: false }) @ViewChild('chatForm', { static: false })
private chatForm: UCapUiChatFormComponent; private chatForm: UCapUiChatFormComponent;
@ -1322,7 +1323,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
} }
} }
onClickOpenProfile(userInfo: UserInfo) { onClickOpenProfile(userSeq: number) {
if ( if (
this.roomInfo.roomType !== RoomType.Allim && this.roomInfo.roomType !== RoomType.Allim &&
this.roomInfo.roomType !== RoomType.Bot && this.roomInfo.roomType !== RoomType.Bot &&
@ -1330,7 +1331,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
this.roomInfo.roomType !== RoomType.Allim_Elephant && this.roomInfo.roomType !== RoomType.Allim_Elephant &&
this.roomInfo.roomType !== RoomType.Allim_TMS this.roomInfo.roomType !== RoomType.Allim_TMS
) { ) {
this.openProfile.emit({ userInfo }); this.openProfile.emit({ userSeq });
} }
} }

View File

@ -1,11 +1,5 @@
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { RightDrawer } from '@app/types'; import { RightDrawer } from '@app/types';
import { UserInfo } from '@ucap-webmessenger/protocol-room';
import {
UserInfoSS,
UserInfoF,
UserInfoDN
} from '@ucap-webmessenger/protocol-query';
@Component({ @Component({
selector: 'app-layout-messenger-right-drawer', selector: 'app-layout-messenger-right-drawer',
@ -18,7 +12,7 @@ export class RightDrawerComponent implements OnInit {
@Output() @Output()
openProfile = new EventEmitter<{ openProfile = new EventEmitter<{
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; userSeq: number;
}>(); }>();
@Output() @Output()
closeRightDrawer = new EventEmitter(); closeRightDrawer = new EventEmitter();
@ -29,8 +23,8 @@ export class RightDrawerComponent implements OnInit {
ngOnInit() {} ngOnInit() {}
onClickOpenProfile(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) { onClickOpenProfile(userSeq: number) {
this.openProfile.emit({ userInfo }); this.openProfile.emit({ userSeq });
} }
onClickClose() { onClickClose() {

View File

@ -6,7 +6,7 @@
[presence]="getStatusBulkInfo(userInfo) | async" [presence]="getStatusBulkInfo(userInfo) | async"
[sessionVerinfo]="sessionVerinfo" [sessionVerinfo]="sessionVerinfo"
(contextmenu)="onContextMenuRoomUser($event, userInfo)" (contextmenu)="onContextMenuRoomUser($event, userInfo)"
(openProfile)="onClickOpenProfile($event)" (openProfile)="onClickOpenProfile(userInfo.seq)"
> >
</ucap-profile-user-list-item> </ucap-profile-user-list-item>
</div> </div>

View File

@ -49,7 +49,7 @@ import { MatMenuTrigger, MatDialog } from '@angular/material';
}) })
export class RoomUserListComponent implements OnInit, OnDestroy { export class RoomUserListComponent implements OnInit, OnDestroy {
@Output() @Output()
openProfile = new EventEmitter<UserInfo>(); openProfile = new EventEmitter<number>();
@ViewChild('roomUserContextMenuTrigger', { static: true }) @ViewChild('roomUserContextMenuTrigger', { static: true })
roomUserContextMenuTrigger: MatMenuTrigger; roomUserContextMenuTrigger: MatMenuTrigger;
@ -131,8 +131,8 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
); );
} }
onClickOpenProfile(userInfo: UserInfo) { onClickOpenProfile(userSeq: number) {
this.openProfile.emit(userInfo); this.openProfile.emit(userSeq);
} }
async onClickAddMember() { async onClickAddMember() {

View File

@ -4,7 +4,120 @@
</div> </div>
<div class="app-layout-native-title-bar-title">DS Talk</div> <div class="app-layout-native-title-bar-title">DS Talk</div>
<div class="app-layout-native-title-bar-spacer"></div> <div class="app-layout-native-title-bar-spacer"></div>
<div class="btn-area">
<div *ngIf="!!loginRes" class="app-layout-native-title-bar-link"> <div *ngIf="!!loginRes" class="app-layout-native-title-bar-link">
<!--s[추가된 전체 웹링크] weblink-->
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="웹하드"
(click)="onClickWebLink(link)"
>
<span class="weblink webhard">웹하드</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="DSP"
(click)="onClickWebLink(link)"
>
<span class="weblink dsp">DSP</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="SMS"
(click)="onClickWebLink(link)"
>
<span class="weblink sms">SMS</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="화상회의"
(click)="onClickWebLink(link)"
>
<span class="weblink vc">화상회의</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="EP"
(click)="onClickWebLink(link)"
>
<span class="weblink ep">EP</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="S&OM"
(click)="onClickWebLink(link)"
>
<span class="weblink S_OM">S&OM</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="코끼리"
(click)="onClickWebLink(link)"
>
<span class="weblink elephant">코끼리</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="IT서비스"
(click)="onClickWebLink(link)"
>
<span class="weblink it-service">IT</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="개인속보"
(click)="onClickWebLink(link)"
>
<span class="weblink Personal-news">NEWS</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="메일"
(click)="onClickWebLink(link)"
>
<span class="weblink mail">메일</span>
</button>
<button
mat-icon-button
*ngFor="let link of weblink"
class="button"
[matTooltip]="link.title"
matTooltip="결제"
(click)="onClickWebLink(link)"
>
<span class="weblink approved">결제</span>
</button>
<!--E[추가된 전체 웹링크] weblink-->
<button <button
mat-icon-button mat-icon-button
*ngFor="let link of weblink" *ngFor="let link of weblink"
@ -24,7 +137,7 @@
/> />
</svg> </svg>
</button> </button>
<span class="stroke-bar"></span>
<button <button
mat-icon-button mat-icon-button
*ngFor="let link of weblinkBadgeTypes" *ngFor="let link of weblinkBadgeTypes"
@ -49,9 +162,6 @@
/> />
</svg> </svg>
</button> </button>
<span class="stroke-bar"></span>
<button <button
*ngIf="updateInfo$ | async as updateInfo" *ngIf="updateInfo$ | async as updateInfo"
mat-icon-button mat-icon-button
@ -77,7 +187,8 @@
></path> ></path>
</svg> </svg>
</button> </button>
<span class="stroke-bar"></span>
<!--S[삭제예정] 마이프로필 설정을 이동
<button <button
mat-icon-button mat-icon-button
class="button app-layout-native-title-bar-setting" class="button app-layout-native-title-bar-setting"
@ -113,7 +224,7 @@
stroke-width="1.5" stroke-width="1.5"
stroke-linecap="butt" stroke-linecap="butt"
stroke-linejoin="round" stroke-linejoin="round"
alt="환경설정" matTooltip="환경설정"
> >
<circle cx="12" cy="12" r="3"></circle> <circle cx="12" cy="12" r="3"></circle>
<path <path
@ -138,7 +249,7 @@
stroke-width="1.5" stroke-width="1.5"
stroke-linecap="butt" stroke-linecap="butt"
stroke-linejoin="round" stroke-linejoin="round"
alt="로그아웃" matTooltip="로그아웃"
class="stroke-warn-color" class="stroke-warn-color"
> >
<path <path
@ -146,14 +257,13 @@
/> />
</svg> </svg>
</button> </button>
E[삭제예정] 마이프로필 설정을 이동-->
<ucap-profile-my-profile-widget <ucap-profile-my-profile-widget
[profileImageRoot]="sessionVerinfo.profileRoot" [profileImageRoot]="sessionVerinfo.profileRoot"
[profileImageFile]="getMyProfileImageWidget()" [profileImageFile]="getMyProfileImageWidget()"
(openProfile)="onClickOpenProfile()" (openProfile)="onClickOpenProfile()"
class="myprofile" class="myprofile"
></ucap-profile-my-profile-widget> ></ucap-profile-my-profile-widget>
<span class="stroke-bar"></span>
</div> </div>
<div class="app-layout-native-title-bar-actions"> <div class="app-layout-native-title-bar-actions">
<button <button
@ -248,4 +358,5 @@
</svg> </svg>
</button> </button>
</div> </div>
</div>
</mat-toolbar> </mat-toolbar>

View File

@ -27,11 +27,15 @@
.app-layout-native-title-bar-spacer { .app-layout-native-title-bar-spacer {
flex: 1 1 auto; flex: 1 1 auto;
} }
.btn-area {
display: flex;
margin-left: auto;
flex-flow: row;
justify-items: center;
.app-layout-native-title-bar-link { .app-layout-native-title-bar-link {
align-items: center; align-items: center;
position: relative; position: relative;
display: flex;
.stroke-bar { .stroke-bar {
width: 1px; width: 1px;
height: 20px; height: 20px;
@ -44,19 +48,49 @@
outline: 0; outline: 0;
cursor: pointer; cursor: pointer;
border: none; border: none;
height: 28px; height: 30px;
min-width: 28px; min-width: 30px;
max-width: 28px; max-width: 30px;
padding: 5px; padding: 3px;
line-height: 10px; line-height: 10px;
border-radius: 0; background-color: #ffffff;
background: transparent; border-radius: 50%;
transition: background 0.2s linear, color 0.2s linear; transition: background 0.2s linear, color 0.2s linear;
text-align: center; text-align: center;
font-size: 10px; font-size: 10px;
vertical-align: middle; vertical-align: middle;
margin-left: 10px; margin-left: 14px;
transform: translateY(-2px); .weblink {
display: inline-flex;
line-height: 24px;
font-size: 12px;
font-weight: bold;
text-align: center;
width: 24px;
height: 24px;
background-repeat: no-repeat;
background-position: 50% 50%;
text-indent: -1000000px;
justify-content: center;
&.dsp {
text-indent: 0;
}
&.sms {
text-indent: 0;
letter-spacing: -1px;
}
&.ep,
&.it-service {
text-indent: 0;
font-size: 13px;
}
&.S_OM,
&.Personal-news {
text-indent: 0;
font-size: 11px;
letter-spacing: -1px;
}
}
&.app-layout-native-title-bar-logout, &.app-layout-native-title-bar-logout,
&.app-layout-native-title-bar-setting { &.app-layout-native-title-bar-setting {
@ -72,7 +106,6 @@
.app-layout-native-title-bar-actions { .app-layout-native-title-bar-actions {
align-items: center; align-items: center;
position: relative; position: relative;
.button { .button {
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
outline: 0; outline: 0;
@ -131,4 +164,25 @@
} }
} }
} }
}
} }
@mixin weblink($color) {
$color: rgba($color, 0.999);
.webhard {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='#{$color}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' %3E%3Cpath d='M4.5,4.3L1.7,10v5c0,0.9,0.7,1.7,1.7,1.7h13.3c0.9,0,1.7-0.7,1.7-1.7v-5l-2.9-5.7c-0.3-0.6-0.9-0.9-1.5-0.9H6 C5.4,3.3,4.8,3.7,4.5,4.3z'/%3E%3Cline class='st0' x1='5' y1='13.3' x2='5' y2='13.3'/%3E%3Cline class='st0' x1='8.3' y1='13.3' x2='8.3' y2='13.3'/%3E%3C/svg%3E");
}
.vc {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='#{$color}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-video'%3E%3Cpolygon points='23 7 16 12 23 17 23 7'%3E%3C/polygon%3E%3Crect x='1' y='5' width='15' height='14' rx='2' ry='2'%3E%3C/rect%3E%3C/svg%3E");
}
.elephant {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='#{$color}' stroke='none' xml:space='preserve'%3E%3Cpath d='M19.1,5c-1,0-2,0.4-2.7,1.1c-1.2-1-2.9-1.5-4.7-1.5c-1.7,0-3.3,0.5-4.5,1.4C6.6,5.3,5.7,5,4.8,5C2.6,5,0.9,6.7,0.9,8.8 c0,1.1,1.1,4.6,2.7,5.7c0.3,0.2,0.7,0.3,1.1,0.3c0.2,0,0.4,0,0.6-0.1c0.5-0.2,0.9-0.4,1.3-0.6c0.6,0.6,1.3,1,2.1,1.4l0.8,1.2 c0.3,0.5,0.5,1.1,0.6,1.7H9.2c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2h0.4c2.5,0,4.6-1.7,5.2-4.1l0.4-1.4c0.7-0.4,1.4-0.8,1.9-1.3 c0.4,0.3,0.9,0.5,1.5,0.8c0.2,0.1,0.4,0.1,0.6,0.1c0.4,0,0.7-0.1,1.1-0.3c1.6-1.1,2.7-4.6,2.7-5.7C22.9,6.7,21.2,5,19.1,5z M5,14.1 c-0.3,0.1-0.7,0.1-1-0.2C2.7,13,1.7,9.8,1.7,8.8c0-1.7,1.4-3.1,3.1-3.1c0.7,0,1.4,0.3,2,0.7C6.4,6.8,6.1,7.1,5.8,7.5 C5.5,7.3,5.1,7.2,4.8,7.2c-1.2,0-2.1,1-2.1,2.1c0,0.6,0.6,2.5,1.5,3.1c0.2,0.1,0.4,0.2,0.6,0.2c0.1,0,0.3,0,0.4-0.1 c0.1,0,0.2-0.1,0.3-0.1c0.2,0.4,0.4,0.8,0.7,1.1C5.8,13.8,5.4,13.9,5,14.1z M5.1,11.8c-0.1,0-0.2,0.1-0.3,0.1 c-0.1,0-0.2,0.1-0.4-0.1c-0.6-0.4-1.2-2-1.2-2.5c0-0.8,0.6-1.4,1.4-1.4C5,7.9,5.2,8,5.4,8.1c-0.3,0.7-0.5,1.4-0.5,2.2 C4.9,10.8,5,11.3,5.1,11.8z M14.7,14.8c-0.1,0-0.2,0.1-0.2,0.2l-0.4,1.6c-0.5,2.1-2.4,3.5-4.5,3.5H9.2c-0.3,0-0.5-0.2-0.5-0.5 c0-0.3,0.2-0.5,0.5-0.5h1.1c0.3,0,0.5-0.2,0.5-0.5c0-0.8-0.2-1.6-0.7-2.3L9.3,15c0-0.1-0.1-0.1-0.2-0.1c-0.8-0.3-1.5-0.8-2.1-1.3 c0,0,0-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c-0.4-0.4-0.7-0.9-0.9-1.4c0,0,0-0.1,0-0.1c-0.2-0.5-0.3-1-0.3-1.5c0-2.8,2.7-5,6.1-5 s6.1,2.3,6.1,5C17.9,12.2,16.7,13.9,14.7,14.8z M18.2,8.3c0.3-0.2,0.6-0.4,0.9-0.4c0.8,0,1.4,0.6,1.4,1.4c0,0.5-0.5,2.1-1.2,2.5 C19.2,12,19.1,12,19,11.9c-0.2-0.1-0.4-0.2-0.6-0.3c0.1-0.4,0.2-0.9,0.2-1.3C18.6,9.6,18.5,8.9,18.2,8.3z M19.8,13.9 c-0.3,0.2-0.7,0.3-1,0.2c-0.5-0.2-0.9-0.4-1.3-0.7c0.3-0.3,0.5-0.7,0.7-1.1c0.2,0.1,0.4,0.2,0.6,0.3c0.1,0.1,0.3,0.1,0.4,0.1 c0.2,0,0.4-0.1,0.6-0.2c0.9-0.6,1.5-2.5,1.5-3.1c0-1.2-1-2.1-2.1-2.1c-0.5,0-0.9,0.2-1.3,0.4c-0.2-0.4-0.5-0.7-0.9-1.1 c0.6-0.6,1.3-0.9,2.1-0.9c1.7,0,3.1,1.4,3.1,3.1C22.2,9.8,21.1,13,19.8,13.9z'/%3E%3Cpath d='M11.5,16.5h1c0.3,0,0.5-0.2,0.5-0.5s-0.2-0.5-0.5-0.5h-1c-0.3,0-0.5,0.2-0.5,0.5S11.2,16.5,11.5,16.5z'/%3E%3Cpath d='M13,17.6H11c-0.3,0-0.5,0.2-0.5,0.5s0.2,0.5,0.5,0.5H13c0.3,0,0.5-0.2,0.5-0.5S13.3,17.6,13,17.6z'/%3E%3Cpath d='M17,12.4c0,0.5-0.4,0.8-0.8,0.8c-0.5,0-0.8-0.4-0.8-0.8s0.4-0.8,0.8-0.8C16.7,11.6,17,12,17,12.4z'/%3E%3Cpath d='M8.5,12.4c0,0.5-0.4,0.8-0.8,0.8c-0.5,0-0.8-0.4-0.8-0.8s0.4-0.8,0.8-0.8C8.1,11.6,8.5,12,8.5,12.4z'/%3E%3C/svg%3E");
}
.mail {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='#{$color}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' %3E%3Cpath d='M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z'%3E%3C/path%3E%3Cpolyline points='22,6 12,13 2,6'%3E%3C/polyline%3E%3C/svg%3E");
}
.approved {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='#{$color}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' %3E%3Cpath d='M20.24 12.24a6 6 0 0 0-8.49-8.49L5 10.5V19h8.5z'%3E%3C/path%3E%3Cline x1='16' y1='8' x2='2' y2='22'%3E%3C/line%3E%3Cline x1='17.5' y1='15' x2='9' y2='15'%3E%3C/line%3E%3C/svg%3E");
}
}
@include weblink(#425888);

View File

@ -16,12 +16,6 @@ import * as MessageStore from '@app/store/messenger/message';
import { Observable, Subscription, of } from 'rxjs'; import { Observable, Subscription, of } from 'rxjs';
import { UCAP_NATIVE_SERVICE, NativeService } from '@ucap-webmessenger/native'; import { UCAP_NATIVE_SERVICE, NativeService } from '@ucap-webmessenger/native';
import { UserInfo } from '@ucap-webmessenger/protocol-sync';
import {
UserInfoSS,
UserInfoF,
UserInfoDN
} from '@ucap-webmessenger/protocol-query';
import { StatusProtocolService } from '@ucap-webmessenger/protocol-status'; import { StatusProtocolService } from '@ucap-webmessenger/protocol-status';
import { StatusType, StatusCode } from '@ucap-webmessenger/core'; import { StatusType, StatusCode } from '@ucap-webmessenger/core';
import { import {
@ -211,14 +205,17 @@ export class MainPageComponent implements OnInit, OnDestroy {
} }
onClickOpenProfile(params: { onClickOpenProfile(params: {
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; userSeq: number;
openProfileOptions?: OpenProfileOptions; openProfileOptions?: OpenProfileOptions;
}) { }) {
if (!params.userSeq || params.userSeq < 0) {
return;
}
// [GROUP] // [GROUP]
// this.queryProtocolService // this.queryProtocolService
// .dataUser({ // .dataUser({
// divCd: 'OPENPROF', // divCd: 'OPENPROF',
// seq: userInfo.seq, // seq: params.userSeq,
// senderCompanyCode: this.loginRes.userInfo.companyCode, // senderCompanyCode: this.loginRes.userInfo.companyCode,
// senderEmployeeType: this.loginRes.userInfo.employeeType // senderEmployeeType: this.loginRes.userInfo.employeeType
// }) // })
@ -244,7 +241,7 @@ export class MainPageComponent implements OnInit, OnDestroy {
this.daesangProtocolService this.daesangProtocolService
.dataUserDaesang({ .dataUserDaesang({
divCd: 'OPENPROF', divCd: 'OPENPROF',
seq: params.userInfo.seq, seq: params.userSeq,
senderCompanyCode: this.loginRes.userInfo.companyCode, senderCompanyCode: this.loginRes.userInfo.companyCode,
senderEmployeeType: this.loginRes.userInfo.employeeType senderEmployeeType: this.loginRes.userInfo.employeeType
}) })

View File

@ -17,6 +17,7 @@ import { EventType, Info, EventJson } from '@ucap-webmessenger/protocol-event';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
import { StatusCode as ApiStatusCode } from '@ucap-webmessenger/api'; import { StatusCode as ApiStatusCode } from '@ucap-webmessenger/api';
import { StatusCode } from '@ucap-webmessenger/core'; import { StatusCode } from '@ucap-webmessenger/core';
import { WorkStatusType } from 'projects/ucap-webmessenger-protocol-status/src/lib/types/work-status.type';
@Component({ @Component({
selector: 'app-template.page', selector: 'app-template.page',
@ -73,7 +74,8 @@ export const status: StatusBulkInfo = {
// 단말상태정보(s) // 단말상태정보(s)
terminalStatus: TerminalStatusInfo.Idle, terminalStatus: TerminalStatusInfo.Idle,
// 단말상태번호(n) // 단말상태번호(n)
terminalStatusNumber: TerminalStatusNumber.Idle terminalStatusNumber: TerminalStatusNumber.Idle,
workstatus: WorkStatusType.Work
}; };
export const buddyData: UserInfo = { export const buddyData: UserInfo = {
seq: 15, seq: 15,

View File

@ -138,7 +138,7 @@ export class Effects {
map(action => { map(action => {
const roomInfo = action.roomInfo; const roomInfo = action.roomInfo;
let requestCount = let requestCount =
environment.productConfig.CommonSetting.eventRequestDefaultCount; environment.productConfig.CommonSetting.eventRequestInitCount;
// 여기까지 읽음 처리.. // 여기까지 읽음 처리..
if (!!roomInfo.finalEventSeq && !!roomInfo.lastReadEventSeq) { if (!!roomInfo.finalEventSeq && !!roomInfo.lastReadEventSeq) {
@ -146,11 +146,11 @@ export class Effects {
// 기존 요청개수보다 요청할 갯수가 적을 경우 기본값. // 기존 요청개수보다 요청할 갯수가 적을 경우 기본값.
if ( if (
environment.productConfig.CommonSetting.eventRequestDefaultCount >= environment.productConfig.CommonSetting.eventRequestInitCount >=
requestCount requestCount
) { ) {
requestCount = requestCount =
environment.productConfig.CommonSetting.eventRequestDefaultCount; environment.productConfig.CommonSetting.eventRequestInitCount;
} else { } else {
// 여기까지 읽음 처리를 위한 최대 요청 개수 제한. // 여기까지 읽음 처리를 위한 최대 요청 개수 제한.
if ( if (

View File

@ -75,6 +75,7 @@ export const environment: Environment = {
maxChatRoomUser: 300, maxChatRoomUser: 300,
masstextLength: 800, masstextLength: 800,
eventRequestInitCount: 15,
eventRequestDefaultCount: 50, eventRequestDefaultCount: 50,
readHereShowMinimumEventCount: 10, readHereShowMinimumEventCount: 10,

View File

@ -75,6 +75,7 @@ export const environment: Environment = {
maxChatRoomUser: 300, maxChatRoomUser: 300,
masstextLength: 800, masstextLength: 800,
eventRequestInitCount: 30,
eventRequestDefaultCount: 50, eventRequestDefaultCount: 50,
readHereShowMinimumEventCount: 10, readHereShowMinimumEventCount: 10,

View File

@ -75,6 +75,7 @@ export const environment: Environment = {
maxChatRoomUser: 300, maxChatRoomUser: 300,
masstextLength: 800, masstextLength: 800,
eventRequestInitCount: 15,
eventRequestDefaultCount: 50, eventRequestDefaultCount: 50,
readHereShowMinimumEventCount: 10, readHereShowMinimumEventCount: 10,

View File

@ -75,6 +75,7 @@ export const environment: Environment = {
maxChatRoomUser: 300, maxChatRoomUser: 300,
masstextLength: 800, masstextLength: 800,
eventRequestInitCount: 15,
eventRequestDefaultCount: 50, eventRequestDefaultCount: 50,
readHereShowMinimumEventCount: 10, readHereShowMinimumEventCount: 10,

View File

@ -82,6 +82,8 @@ export interface Environment {
/** 대용량대화 기준 */ /** 대용량대화 기준 */
masstextLength: number; masstextLength: number;
/** 대화방 초기 로딩 이벤트 갯수 */
eventRequestInitCount: number;
/** 대화방 이벤트 조회 개수 */ /** 대화방 이벤트 조회 개수 */
eventRequestDefaultCount: number; eventRequestDefaultCount: number;

View File

@ -11,6 +11,7 @@ import {
UserInfoSS, UserInfoSS,
DataUserResponse DataUserResponse
} from '@ucap-webmessenger/protocol-query'; } from '@ucap-webmessenger/protocol-query';
import { WorkStatusType } from 'projects/ucap-webmessenger-protocol-status/src/lib/types/work-status.type';
// export interface UserInfoSSForDaesang extends UserInfoSS { // export interface UserInfoSSForDaesang extends UserInfoSS {
// /****** For daesang ******/ // /****** For daesang ******/
@ -69,7 +70,7 @@ export const decodeDataUser: ProtocolDecoder<DataUserResponse> = (
// [daesang] // [daesang]
companyName: info[29], companyName: info[29],
responsibilities: info[30], responsibilities: info[30],
workstatus: info[31], workstatus: info[31] as WorkStatusType,
job: info[32], job: info[32],
customerInfo: info[33], customerInfo: info[33],
workplace: info[34] workplace: info[34]

View File

@ -1,6 +1,7 @@
import { RoleCode } from '@ucap-webmessenger/protocol-authentication'; import { RoleCode } from '@ucap-webmessenger/protocol-authentication';
import { CallMode } from '@ucap-webmessenger/core'; import { CallMode } from '@ucap-webmessenger/core';
import { EmployeeType } from '@ucap-webmessenger/protocol-room'; import { EmployeeType } from '@ucap-webmessenger/protocol-room';
import { WorkStatusType } from 'projects/ucap-webmessenger-protocol-status/src/lib/types/work-status.type';
export interface UserInfoSS { export interface UserInfoSS {
/** 사용자SEQ */ /** 사용자SEQ */
@ -67,7 +68,7 @@ export interface UserInfoSS {
/** 담당업무 */ /** 담당업무 */
responsibilities?: string; responsibilities?: string;
/** 업무 상태 */ /** 업무 상태 */
workstatus?: string; workstatus?: WorkStatusType;
/** SC직무 */ /** SC직무 */
job?: string; job?: string;
/** 거래처정보 */ /** 거래처정보 */

View File

@ -3,6 +3,7 @@ import {
TerminalStatusInfo, TerminalStatusInfo,
TerminalStatusNumber TerminalStatusNumber
} from '../types/terminal-status.type'; } from '../types/terminal-status.type';
import { WorkStatusType } from '../types/work-status.type';
export interface StatusBulkInfo extends StatusInfo { export interface StatusBulkInfo extends StatusInfo {
// 사용자SEQ // 사용자SEQ
@ -18,4 +19,7 @@ export interface StatusBulkInfo extends StatusInfo {
terminalStatus: TerminalStatusInfo; terminalStatus: TerminalStatusInfo;
/** 단말상태번호(n) */ /** 단말상태번호(n) */
terminalStatusNumber: TerminalStatusNumber; terminalStatusNumber: TerminalStatusNumber;
/** 업무상태정보(s) */
workstatus: WorkStatusType;
} }

View File

@ -1,20 +1,24 @@
import { StatusCode } from '@ucap-webmessenger/core'; import { StatusCode } from '@ucap-webmessenger/core';
import { WorkStatusType } from '../types/work-status.type';
export interface StatusInfo { export interface StatusInfo {
// 사용자SEQ /** 사용자SEQ */
userSeq: number; userSeq: number;
// 상태코드(PC) /** 상태코드(PC) */
pcStatus: StatusCode; pcStatus: StatusCode;
// 상태코드(통화) /** 상태코드(통화) */
phoneStatus: StatusCode; phoneStatus: StatusCode;
// 상태코드(모바일) /** 상태코드(모바일) */
mobileStatus: StatusCode; mobileStatus: StatusCode;
// 상태코드(PC화상) /** 상태코드(PC화상) */
conferenceStatus: StatusCode; conferenceStatus: StatusCode;
// 상태메시지 /** 상태메시지 */
statusMessage: string; statusMessage: string;
// 상태코드(Mobile화상) /** 상태코드(Mobile화상) */
mobileConferenceStatus: StatusCode; mobileConferenceStatus: StatusCode;
// 상태코드(iMessenger) /** 상태코드(iMessenger) */
imessengerStatus: StatusCode; imessengerStatus: StatusCode;
/** 업무상태 */
workstatus?: WorkStatusType;
} }

View File

@ -17,6 +17,7 @@ import {
} from '../types/terminal-status.type'; } from '../types/terminal-status.type';
import { StatusInfo } from '../models/status-info'; import { StatusInfo } from '../models/status-info';
import { StatusBulkInfo } from '../models/status-bulk-info'; import { StatusBulkInfo } from '../models/status-bulk-info';
import { WorkStatusType } from '../types/work-status.type';
export interface BulkInfoRequest extends ProtocolRequest { export interface BulkInfoRequest extends ProtocolRequest {
/** DivCD(s) */ /** DivCD(s) */
@ -72,7 +73,8 @@ export const decodeBulkInfoData: ProtocolDecoder<BulkInfoData> = (
mobileConferenceStatus: info[6] as StatusCode, mobileConferenceStatus: info[6] as StatusCode,
imessengerStatus: info[7] as StatusCode, imessengerStatus: info[7] as StatusCode,
terminalStatus: info[8] as TerminalStatusInfo, terminalStatus: info[8] as TerminalStatusInfo,
terminalStatusNumber: Number(info[9]) as TerminalStatusNumber terminalStatusNumber: Number(info[9]) as TerminalStatusNumber,
workstatus: info[10] as WorkStatusType
}); });
}); });
return decodeProtocolMessage(message, { return decodeProtocolMessage(message, {

View File

@ -12,6 +12,7 @@ import {
} from '@ucap-webmessenger/protocol'; } from '@ucap-webmessenger/protocol';
import { StatusType, StatusCode } from '@ucap-webmessenger/core'; import { StatusType, StatusCode } from '@ucap-webmessenger/core';
import { StatusInfo } from '../models/status-info'; import { StatusInfo } from '../models/status-info';
import { WorkStatusType } from '../types/work-status.type';
export interface StatusRequest extends ProtocolRequest { export interface StatusRequest extends ProtocolRequest {
// 상태타입(s) // 상태타입(s)
@ -74,6 +75,7 @@ export const decodeStatusNotification: ProtocolDecoder<StatusNotification> = (
conferenceStatus: info[4] as StatusCode, conferenceStatus: info[4] as StatusCode,
statusMessage: info[5], statusMessage: info[5],
mobileConferenceStatus: info[6] as StatusCode, mobileConferenceStatus: info[6] as StatusCode,
imessengerStatus: info[7] as StatusCode imessengerStatus: info[7] as StatusCode,
workstatus: info[8] as WorkStatusType
} as StatusNotification); } as StatusNotification);
}; };

View File

@ -0,0 +1,41 @@
export enum WorkStatusType {
/** 근무중 */
Work = 'W01',
/** 휴가 */
/** 오전 */
VacationAM = 'V01',
/** 오후 */
VacationPM = 'V02',
/** 휴가 */
VacationAll = 'V03',
/** 휴직 */
LeaveOfAbsence = 'V04',
/** 장기 리프레쉬 */
LongtermRefresh = 'V05'
// /** 교육 */
// /** 오전교육 */
// EducationAm = 'E01',
// /** 오후교육 */
// EducationPm = 'E02',
// /** 종일교육 */
// EducationAll = 'E03',
// /** 장기교육 */
// EducationLongterm = 'E04',
// /** 휴직 */
// /** 일반휴직 */
// LTRNormal = 'R01',
// /** 육아휴직 */
// LTRBaby = 'R02',
// /** 기타휴직 */
// LTREtc = 'R03',
// /** 일반출장 */
// /** 출장 */
// BusinessTrip = 'T01',
// /** 해외출장 */
// BusinessTripOverseas = 'T02',
// /** 국내출장 */
// BusinessTripLocal = 'T03',
// /** 장기출장 */
// BusinessLongterm = 'T04',
}

View File

@ -120,7 +120,7 @@
[base]="profileImageRoot" [base]="profileImageRoot"
[path]="getUserProfile(message.senderSeq)" [path]="getUserProfile(message.senderSeq)"
[default]="'assets/images/img_nophoto_50.png'" [default]="'assets/images/img_nophoto_50.png'"
(click)="onClickOpenProfile($event, getUerInfo(message.senderSeq))" (click)="onClickOpenProfile($event, message.senderSeq)"
/> />
<!-- <ucap-ui-imaage <!-- <ucap-ui-imaage
[style]="'width: 50px; height: 50px;'" [style]="'width: 50px; height: 50px;'"

View File

@ -54,7 +54,7 @@ export class MessagesComponent implements OnInit {
translationSimpleview = false; translationSimpleview = false;
@Output() @Output()
openProfile = new EventEmitter<UserInfo>(); openProfile = new EventEmitter<number>();
@Output() @Output()
moreEvent = new EventEmitter<number>(); moreEvent = new EventEmitter<number>();
@Output() @Output()
@ -120,18 +120,6 @@ export class MessagesComponent implements OnInit {
} }
return ''; return '';
} }
getUerInfo(seq: number): UserInfo {
if (!this.userInfos) {
return null;
}
const userInfo: UserInfo[] = this.userInfos.filter(
user => user.seq === seq
);
if (!!userInfo && userInfo.length > 0) {
return userInfo[0];
}
}
getEventSearched(seq: number): boolean { getEventSearched(seq: number): boolean {
return ( return (
!!this.searchedList && !!this.searchedList &&
@ -213,11 +201,11 @@ export class MessagesComponent implements OnInit {
return false; return false;
} }
onClickOpenProfile(event: MouseEvent, userInfo: UserInfo) { onClickOpenProfile(event: MouseEvent, userSeq: number) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
this.openProfile.emit(userInfo); this.openProfile.emit(userSeq);
} }
onClickMore(event: any) { onClickMore(event: any) {

View File

@ -10,6 +10,7 @@
</span> </span>
<div class="btn-setting"> <div class="btn-setting">
<span class="presence pcOff"></span> <span class="presence pcOff"></span>
<button>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="18" width="18"
@ -23,5 +24,6 @@
> >
<path d="M6 9l6 6 6-6" /> <path d="M6 9l6 6 6-6" />
</svg> </svg>
</button>
</div> </div>
</div> </div>

View File

@ -3,7 +3,6 @@
flex-flow: row; flex-flow: row;
width: 60px; width: 60px;
height: 30px; height: 30px;
bottom: 10px;
color: #ffffff; color: #ffffff;
font-size: 11px; font-size: 11px;
justify-items: flex-end; justify-items: flex-end;
@ -28,6 +27,7 @@
} }
.btn-setting { .btn-setting {
position: absolute; position: absolute;
height: 100%;
bottom: 0; bottom: 0;
display: inline-flex; display: inline-flex;
justify-items: flex-end; justify-items: flex-end;
@ -36,14 +36,23 @@
display: inline-block; display: inline-block;
bottom: 0; bottom: 0;
width: 10px; width: 10px;
height: 11px; height: 10px;
border: 1px solid #ffffff; border: 1px solid #ffffff;
align-self: flex-end; align-self: flex-end;
} }
button {
cursor: pointer;
width: 20px;
height: 100%;
align-items: center;
background: none;
border: none;
svg { svg {
stroke: #ffffff;
&.on { &.on {
transform: rotate(180deg); transform: rotate(180deg);
} }
} }
} }
}
} }

View File

@ -16,6 +16,7 @@ import { FormControl } from '@angular/forms';
import { SmsUtils } from '@ucap-webmessenger/daesang'; import { SmsUtils } from '@ucap-webmessenger/daesang';
import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { SessionStorageService } from '@ucap-webmessenger/web-storage';
import { NativeService, UCAP_NATIVE_SERVICE } from '@ucap-webmessenger/native'; import { NativeService, UCAP_NATIVE_SERVICE } from '@ucap-webmessenger/native';
import { WorkStatusType } from 'projects/ucap-webmessenger-protocol-status/src/lib/types/work-status.type';
@Component({ @Component({
selector: 'ucap-profile-profile', selector: 'ucap-profile-profile',
@ -138,20 +139,20 @@ export class ProfileComponent implements OnInit {
let workstatus = ''; let workstatus = '';
if (!!userInfo && !!userInfo.workstatus) { if (!!userInfo && !!userInfo.workstatus) {
switch (userInfo.workstatus) { switch (userInfo.workstatus) {
case 'V01': case WorkStatusType.VacationAM:
workstatus = '오전휴가'; workstatus = '오전';
break; break;
case 'V02': case WorkStatusType.VacationPM:
workstatus = '오후휴가'; workstatus = '오후';
break; break;
case 'V03': case WorkStatusType.VacationAll:
workstatus = '종일휴가'; workstatus = '휴가';
break; break;
case 'V04': case WorkStatusType.LeaveOfAbsence:
workstatus = '장기휴가'; workstatus = '휴직';
break; break;
case 'V05': case WorkStatusType.LongtermRefresh:
workstatus = '장기 리프레쉬'; workstatus = '장기';
break; break;
} }
} }

View File

@ -11,7 +11,7 @@
[base]="profileImageRoot" [base]="profileImageRoot"
[path]="userInfo.profileImageFile" [path]="userInfo.profileImageFile"
[default]="'assets/images/img_nophoto_50.png'" [default]="'assets/images/img_nophoto_50.png'"
(click)="onClickOpenProfile($event, userInfo)" (click)="onClickOpenProfile($event, userInfo.seq)"
/> />
</div> </div>
<span <span

View File

@ -52,9 +52,7 @@ export class UserListItemComponent implements OnInit {
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN;
}>(); }>();
@Output() @Output()
openProfile = new EventEmitter< openProfile = new EventEmitter<number>();
UserInfo | UserInfoSS | UserInfoF | UserInfoDN
>();
PresenceType = PresenceType; PresenceType = PresenceType;
@ -108,13 +106,10 @@ export class UserListItemComponent implements OnInit {
}); });
} }
onClickOpenProfile( onClickOpenProfile(event: MouseEvent, userSeq: number) {
event: MouseEvent,
userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN
) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
this.openProfile.emit(userInfo); this.openProfile.emit(userSeq);
} }
} }