Merge branch 'master' into new-org

This commit is contained in:
leejinho 2020-03-30 18:10:46 +09:00
commit d9e4c6bff6
78 changed files with 1252 additions and 1231 deletions

View File

@ -89,7 +89,7 @@ export class AppWindow {
// windows Focus or Blur state detacted.
this.window.on(ElectronBrowserWindowChannel.Focus, () => {
if (__WIN32__) {
this.window.flashFrame(false);
// this.window.flashFrame(false);
}
this.window.webContents.send(

View File

@ -8,7 +8,8 @@ import {
dialog,
BrowserWindow,
clipboard,
crashReporter
crashReporter,
nativeImage
} from 'electron';
import path from 'path';
import fse from 'fs-extra';
@ -35,7 +36,8 @@ import {
MessageChannel,
AppChannel,
ClipboardChannel,
ExternalChannel
ExternalChannel,
WindowStateChannel
} from '@ucap-webmessenger/native-electron';
import { ElectronNotificationService } from '@ucap-webmessenger/electron-notification';
import { ElectronUpdateWindowService } from '@ucap-webmessenger/electron-update-window';
@ -800,7 +802,7 @@ ipcMain.on(
: '',
displayTime: !!noti.displayTime ? noti.displayTime : undefined,
onClick: e => {
appWindow.browserWindow.flashFrame(false);
// appWindow.browserWindow.flashFrame(false);
if (noti.type === NotificationType.Event) {
appWindow.browserWindow.webContents.send(
ChatChannel.OpenRoom,
@ -820,13 +822,37 @@ ipcMain.on(
if (!appWindow.isVisible()) {
appWindow.browserWindow.minimize();
}
// const img = nativeImage.createFromPath(
// path.join(__dirname, 'assets/notification/images/img_nophoto_50.png')
// );
// console.log(img);
// appWindow.browserWindow.setOverlayIcon(img, 'discription');
// setTimeout(() => {
// appWindow.browserWindow.setOverlayIcon(null, '');
// }, 3000);
appWindow.browserWindow.flashFrame(true);
}
);
ipcMain.on(
NotificationChannel.CloseAllNotify,
(event: IpcMainEvent, ...args: any[]) => {
// appWindow.browserWindow.flashFrame(false);
}
);
ipcMain.on(
WindowStateChannel.OnFlashFrame,
(event: IpcMainEvent, ...args: any[]) => {
appWindow.browserWindow.flashFrame(false);
if (!appWindow.isVisible() && !appWindow.browserWindow.isMinimized()) {
appWindow.browserWindow.minimize();
}
appWindow.browserWindow.flashFrame(true);
}
);
ipcMain.on(
WindowStateChannel.OffFlashFrame,
(event: IpcMainEvent, ...args: any[]) => {
appWindow.browserWindow.flashFrame(false);
}

View File

@ -1,4 +1,4 @@
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Component, OnInit, OnDestroy, Inject } from '@angular/core';
import { NGXLogger } from 'ngx-logger';
import { ucapAnimations } from '@ucap-webmessenger/ui';
import { Observable, Subscribable, Subscription } from 'rxjs';
@ -10,6 +10,7 @@ import * as SettingsStore from '@app/store/messenger/settings';
import { MatTabChangeEvent } from '@angular/material/tabs';
import { MainMenu } from '@app/types';
import { tap, map } from 'rxjs/operators';
import { UCAP_NATIVE_SERVICE, NativeService } from '@ucap-webmessenger/native';
@Component({
selector: 'app-layout-messenger-left-nav',
@ -25,13 +26,34 @@ export class LeftNaviComponent implements OnInit, OnDestroy {
MainMenu = MainMenu;
gnbMenuIndexSubscription: Subscription;
gnbMenuIndex: number;
intervalFlashFrame: any;
constructor(private store: Store<any>, private logger: NGXLogger) {}
constructor(
private store: Store<any>,
@Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService,
private logger: NGXLogger
) {}
ngOnInit() {
/** About Chat Badge */
this.badgeChatUnReadCount$ = this.store.pipe(
select(AppStore.MessengerSelector.SyncSelector.selectChatUnreadCount)
select(AppStore.MessengerSelector.SyncSelector.selectChatUnreadCount),
tap(count => {
// windows taskbar blinking unread count exist.
if (!!count && count > 0) {
if (!this.intervalFlashFrame) {
this.intervalFlashFrame = setInterval(() => {
this.nativeService.onFlashFlame();
}, 1000);
}
} else {
this.nativeService.offFlashFlame();
if (!!this.intervalFlashFrame) {
clearInterval(this.intervalFlashFrame);
this.intervalFlashFrame = undefined;
}
}
})
);
/** About Message Badge */

View File

@ -160,7 +160,8 @@ export class LeftSideComponent implements OnInit, OnDestroy {
CreateChatDialogData,
CreateChatDialogResult
>(CreateChatDialogComponent, {
width: '600px',
maxWidth: '94vw',
maxHeight: '90vh',
data: {
type: UserSelectDialogType.NewChat,
title:
@ -192,7 +193,8 @@ export class LeftSideComponent implements OnInit, OnDestroy {
CreateChatDialogData,
CreateChatDialogResult
>(CreateChatDialogComponent, {
width: '600px',
maxWidth: '94vw',
maxHeight: '90vh',
data: {
type: UserSelectDialogType.NewGroup,
title: this.translateService.instant('group.addNew')
@ -224,8 +226,8 @@ export class LeftSideComponent implements OnInit, OnDestroy {
MessageWriteDialogData,
MessageWriteDialogResult
>(MessageWriteDialogComponent, {
width: '600px',
height: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
disableClose: true,
hasBackdrop: false,
data: {

View File

@ -269,6 +269,7 @@ export class ChatComponent implements OnInit, OnDestroy, AfterViewChecked {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.exitFromRoom'),
html: this.translateService.instant('chat.confirmExitFromRoom')

View File

@ -512,7 +512,7 @@ export class GroupComponent implements OnInit, OnDestroy {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant(
'group.removeBuddyFromGroup'
@ -547,7 +547,6 @@ export class GroupComponent implements OnInit, OnDestroy {
SelectGroupDialogData,
SelectGroupDialogResult
>(SelectGroupDialogComponent, {
width: '600px',
data: {
title: this.translateService.instant('group.selectTargetGroup')
}
@ -586,7 +585,6 @@ export class GroupComponent implements OnInit, OnDestroy {
SelectGroupDialogData,
SelectGroupDialogResult
>(SelectGroupDialogComponent, {
width: '600px',
data: {
title: this.translateService.instant('group.selectTargetGroup'),
ignoreGroup: [group]
@ -621,8 +619,8 @@ export class GroupComponent implements OnInit, OnDestroy {
MessageWriteDialogData,
MessageWriteDialogResult
>(MessageWriteDialogComponent, {
width: '600px',
height: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
disableClose: true,
hasBackdrop: false,
data: {
@ -715,8 +713,9 @@ export class GroupComponent implements OnInit, OnDestroy {
MessageWriteDialogData,
MessageWriteDialogResult
>(MessageWriteDialogComponent, {
width: '600px',
height: '600px',
minWidth: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
disableClose: true,
hasBackdrop: false,
data: {
@ -737,6 +736,7 @@ export class GroupComponent implements OnInit, OnDestroy {
EditGroupDialogData,
EditGroupDialogResult
>(EditGroupDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('group.changeGroupName'),
group
@ -765,7 +765,8 @@ export class GroupComponent implements OnInit, OnDestroy {
CreateChatDialogData,
CreateChatDialogResult
>(CreateChatDialogComponent, {
width: '600px',
maxWidth: '90vh',
maxHeight: '94vh',
data: {
type: UserSelectDialogType.EditMember,
title: this.translateService.instant('group.modifyGroupMember'),
@ -797,7 +798,7 @@ export class GroupComponent implements OnInit, OnDestroy {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('group.removeGroup'),
html: this.translateService.instant(

View File

@ -18,9 +18,6 @@
.message-item {
cursor: pointer;
}
::ng-deep .ps__rail-y {
left: auto !important;
}
.message-box {
position: relative;
height: 100%;

View File

@ -202,7 +202,6 @@ export class MessageBoxComponent
MessageDetailDialogData,
MessageDetailDialogResult
>(MessageDetailDialogComponent, {
width: '600px',
hasBackdrop: false,
data: {
detail: info,
@ -243,7 +242,7 @@ export class MessageBoxComponent
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('message.errors.label'),
message: this.translateService.instant(
@ -417,8 +416,8 @@ export class MessageBoxComponent
MessageWriteDialogData,
MessageWriteDialogResult
>(MessageWriteDialogComponent, {
width: '600px',
height: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
disableClose: true,
hasBackdrop: false,
data: {

View File

@ -595,6 +595,8 @@ export class OrganizationComponent
SelectedUserListDialogData,
SelectedUserListDialogResult
>(SelectedUserListDialogComponent, {
maxWidth: '90vw',
maxHeight: '94vh',
data: {
title: this.translateService.instant('organization.selectedUser'),
selectedUserList: this.selectedUserList
@ -617,7 +619,8 @@ export class OrganizationComponent
SelectGroupDialogData,
SelectGroupDialogResult
>(SelectGroupDialogComponent, {
width: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
data: {
title: this.translateService.instant('group.selectTargetGroup')
}
@ -747,8 +750,8 @@ export class OrganizationComponent
MessageWriteDialogData,
MessageWriteDialogResult
>(MessageWriteDialogComponent, {
width: '600px',
height: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
disableClose: true,
hasBackdrop: false,
data: {

View File

@ -48,15 +48,15 @@
</button>
</div>
<div class="room-info">
<div
*ngIf="roomInfoSubject.value && roomInfoSubject.value.isTimeRoom"
class="room-type text-accent-color "
>
<span class="bg-accent-darkest"
>{{ getConvertTimer(roomInfoSubject.value.timeRoomInterval) }}
</span>
</div>
<h3 class="room-name">
<span
*ngIf="roomInfoSubject.value && roomInfoSubject.value.isTimeRoom"
class="room-type text-accent-color"
>
<span class="bg-accent-darkest"
>{{ getConvertTimer(roomInfoSubject.value.timeRoomInterval) }}
</span>
</span>
<ng-container
*ngIf="!roomInfoSubject.value || !userInfoListSubject.value"
>
@ -98,6 +98,9 @@
<span>
{{ getSingleRoomUserInfosGrade(_roomUserInfos) }}
</span>
<span>
/ {{ getSingleRoomUserInfosDeptName(_roomUserInfos) }}
</span>
<span
*ngIf="
_roomUserInfos.length > 0 &&
@ -126,18 +129,17 @@
</ng-container>
</ng-container>
</h3>
<!-- Timer Room Info -->
<!--<div
*ngIf="roomInfoSubject.value && roomInfoSubject.value.isTimeRoom"
class="room-type text-accent-color "
<div
*ngIf="
roomInfoSubject.value &&
(roomInfoSubject.value.roomType === RoomType.Single ||
roomInfoSubject.value.roomType === RoomType.Multi) &&
offLineUsers.length > 0
"
class="member-state-msg text-warn-color"
>
<span class="bg-accent-darkest"
>{{
getConvertTimer(roomInfoSubject.value.timeRoomInterval)
}} </span
>{{ 'chat.isRoomTypeSecret' | translate }}
</div>-->
<!-- Timer Room Info -->
{{ getOfflineString() }}
</div>
</div>
<div class="room-option">
<button
@ -146,11 +148,6 @@
(click)="onClickReceiveAlarm()"
aria-label="Toggle Receive Alarm"
>
<!--<mat-icon
class="amber-fg"
*ngIf="roomInfoSubject.value.receiveAlarm"
matTooltip="{{ 'chat.notificationIsOn' | translate }}"
>notifications_active</mat-icon>-->
<mat-icon
class="icon-button"
*ngIf="roomInfoSubject.value.receiveAlarm"

View File

@ -70,14 +70,18 @@
}
.room-info {
display: flex;
flex-flow: row;
flex-flow: column;
overflow: hidden;
align-items: center;
.room-name {
position: relative;
display: flex;
flex-flow: row;
height: 20px;
font-size: 0.94rem;
line-height: normal;
width: 100%;
@include ellipsis(1);
.more-info {
font-size: 0.9rem;
color: #656565;
@ -86,6 +90,7 @@
}
}
}
.room-type {
font-size: 0.9rem;
line-height: normal;
@ -98,6 +103,14 @@
}
}
}
.member-state-msg {
display: flex;
align-items: center;
align-self: self-start;
padding: 0;
font-size: 11px;
height: 16px;
}
.room-option {
margin-left: auto;
margin-right: -10px;

View File

@ -32,7 +32,14 @@ import {
} from '@ucap-webmessenger/ui';
import { Store, select } from '@ngrx/store';
import { NGXLogger } from 'ngx-logger';
import { Observable, Subscription, forkJoin, of, BehaviorSubject } from 'rxjs';
import {
Observable,
Subscription,
forkJoin,
of,
BehaviorSubject,
combineLatest
} from 'rxjs';
import {
Info,
@ -103,7 +110,12 @@ import {
FileViewerDialogData,
FileViewerDialogResult
} from '@app/layouts/common/dialogs/file-viewer.dialog.component';
import { FileUtil, StickerFilesInfo, MimeUtil } from '@ucap-webmessenger/core';
import {
FileUtil,
StickerFilesInfo,
MimeUtil,
StatusCode as PresenceStatusCode
} from '@ucap-webmessenger/core';
import { StatusCode } from '@ucap-webmessenger/api';
import {
@ -144,7 +156,6 @@ import {
EventDownloadRequest
} from '@ucap-webmessenger/api-message';
import moment from 'moment';
import { start } from 'repl';
@Component({
selector: 'app-layout-messenger-messages',
@ -189,6 +200,9 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
userInfoListSubscription: Subscription;
userInfoListSubject = new BehaviorSubject<UserInfo[]>(undefined);
userStatusListSubscription: Subscription;
offLineUsers: UserInfo[] = [];
eventListSubscription: Subscription;
eventListSubject = new BehaviorSubject<Info<EventJson>[]>(undefined);
eventListNewSubject = new BehaviorSubject<Info<EventJson>[]>(undefined);
@ -325,6 +339,49 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
this.changeDetectorRef.detectChanges();
});
this.userStatusListSubscription = combineLatest([
this.store.pipe(
select(AppStore.MessengerSelector.RoomSelector.selectUserinfolist)
),
this.store.pipe(
select(
AppStore.MessengerSelector.StatusSelector.selectEntitiesStatusBulkInfo
)
)
])
.pipe(
tap(([userInfoList, presences]) => {
if (!!userInfoList && userInfoList.length > 0) {
userInfoList
.filter(
info =>
info.seq !== this.loginResSubject.value.userSeq &&
!!info.isJoinRoom
)
.forEach(userInfo => {
const presence = presences[userInfo.seq];
const existIndex = !!this.offLineUsers
? this.offLineUsers.findIndex(e => e.seq === userInfo.seq)
: -1;
if (
!!presence &&
presence.pcStatus === PresenceStatusCode.OnLine
) {
if (existIndex > -1) {
this.offLineUsers.splice(existIndex, 1);
}
} else {
if (existIndex === -1) {
this.offLineUsers.push(userInfo);
}
}
});
}
})
)
.subscribe();
this.eventListProcessing$ = this.store.pipe(
select(AppStore.MessengerSelector.EventSelector.infoListProcessing)
);
@ -454,6 +511,9 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
if (!!this.userInfoListSubscription) {
this.userInfoListSubscription.unsubscribe();
}
if (!!this.userStatusListSubscription) {
this.userStatusListSubscription.unsubscribe();
}
if (!!this.eventListSubscription) {
this.eventListSubscription.unsubscribe();
}
@ -501,6 +561,9 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
// Read here Clear..
this.firstCheckReadHere = true;
// off line user clear..
this.offLineUsers = [];
// Chat Formfield Clear..
if (!!this.chatForm) {
this.chatForm.replyInput.nativeElement.value = '';
@ -536,6 +599,15 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
return roomName;
}
getSingleRoomUserInfosDeptName(roomUserInfos: any[]) {
if (roomUserInfos.length > 0) {
return new UiTranslatePipe(
this.uiTranslateService,
this.changeDetectorRef
).transform(roomUserInfos, 'deptName', ',');
}
return '';
}
getSingleRoomUserInfosGrade(roomUserInfos: any[]) {
if (roomUserInfos.length > 0) {
return new UiTranslatePipe(
@ -568,10 +640,35 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
}
}
getOfflineString() {
let offlineStr = '';
if (!!this.offLineUsers && this.offLineUsers.length > 0) {
if (
!!this.roomInfoSubject.value &&
this.roomInfoSubject.value.roomType === RoomType.Single
) {
const name = new UiTranslatePipe(
this.uiTranslateService,
this.changeDetectorRef
).transform(this.offLineUsers[0], 'name');
offlineStr = this.translateService.instant('chat.existOfflineUser', {
offlineUser: name
});
} else if (
!!this.roomInfoSubject.value &&
this.roomInfoSubject.value.roomType === RoomType.Multi
) {
offlineStr = this.translateService.instant('chat.existOfflineUsers');
}
}
return offlineStr;
}
onClickSendClickToCall(type: string) {
if(type === 'LINE') {
if (type === 'LINE') {
this.sendCall.emit(this._roomUserInfos[0].lineNumber);
} else if(type === 'MOBILE') {
} else if (type === 'MOBILE') {
this.sendCall.emit(this._roomUserInfos[0].hpNumber);
}
}
@ -726,13 +823,13 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
data: {
title: this.translateService.instant('chat.errors.label'),
message: this.translateService.instant(
'chat.errors.inputChatMessage'
)
}
},
panelClass: 'miniSize-dialog'
});
return;
}
@ -790,7 +887,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.errors.label'),
message: this.translateService.instant(
@ -924,7 +1021,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: '',
message: this.translateService.instant(
@ -942,7 +1039,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: '',
message: this.translateService.instant(
@ -1461,7 +1558,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
CreateChatDialogData,
CreateChatDialogResult
>(CreateChatDialogComponent, {
width: '600px',
maxWidth: '94vw',
maxHeight: '90vh',
data: {
type: UserSelectDialogType.MessageForward,
title: this.translateService.instant('chat.forwardEventTo'),
@ -1524,7 +1622,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '400px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.removeEvent'),
html: this.translateService.instant('chat.confirmRemoveEvent')
@ -1548,7 +1646,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '400px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.recallEvent'),
html: this.translateService.instant('chat.confirmRecallEvent')
@ -1641,6 +1739,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.errors.label'),
html: this.translateService.instant(
@ -1665,7 +1764,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
CreateChatDialogData,
CreateChatDialogResult
>(CreateChatDialogComponent, {
width: '600px',
maxWidth: '94vw',
maxHeight: '90vh',
data: {
type: UserSelectDialogType.EditChatMember,
title: this.translateService.instant('chat.modifyRoomMember'),
@ -1732,7 +1832,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
SelectGroupDialogData,
SelectGroupDialogResult
>(SelectGroupDialogComponent, {
width: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
data: {
title: this.translateService.instant('chat.addMemberToGroup')
}
@ -1768,6 +1869,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
EditChatRoomDialogResult
>(EditChatRoomDialogComponent, {
width: '600px',
height: '320px',
data: {
title: this.translateService.instant('chat.settingsOfRoom'),
roomInfo: this.roomInfoSubject.value

View File

@ -308,7 +308,6 @@ export class FileBoxComponent implements OnInit, OnDestroy {
CreateChatDialogData,
CreateChatDialogResult
>(CreateChatDialogComponent, {
width: '600px',
data: {
type: UserSelectDialogType.MessageForward,
title: this.translateService.instant('chat.forwardFileTo'),
@ -350,7 +349,7 @@ export class FileBoxComponent implements OnInit, OnDestroy {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '400px',
panelClass: 'miniSize-dialog',
data: {
title: 'Delete',
html: this.translateService.instant('chat.confirmDeleteFile')

View File

@ -106,7 +106,7 @@ export class NoticeComponent implements OnInit, OnDestroy, AfterViewInit {
NoticeDetailDialogData
>(NoticeDetailDialogComponent, {
disableClose: false,
width: '550px',
//width: '550px',
data: {
notice
}

View File

@ -159,6 +159,7 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.errors.label'),
html: this.translateService.instant(
@ -181,7 +182,6 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
CreateChatDialogData,
CreateChatDialogResult
>(CreateChatDialogComponent, {
width: '600px',
data: {
type: UserSelectDialogType.EditChatMember,
title: this.translateService.instant('chat.modifyRoomMember'),
@ -237,7 +237,6 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
SelectGroupDialogData,
SelectGroupDialogResult
>(SelectGroupDialogComponent, {
width: '600px',
data: {
title: this.translateService.instant('group.selectTargetGroup')
}
@ -291,6 +290,7 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.ejectFromRoom'),
html: this.translateService.instant('chat.confirmEjectFromRoom', {

View File

@ -1,9 +1,11 @@
::ng-deep .use-caution {
.use-caution {
.btn-dialog-close {
margin-left: auto;
}
.mat-card-header-text {
.mat-card-header {
width: 100%;
justify-content: center;
color: #ffffff;
.mat-card-title {
justify-content: center;
color: #ffffff;
@ -29,8 +31,18 @@
}
}
form {
.mat-form-field {
width: 100%;
//이용시 주의사항
::ng-deep.use-caution {
.notice {
ol {
li {
list-style: decimal;
margin-bottom: 14px;
margin-left: 20px;
span {
color: #ff5722;
}
}
}
}
}

View File

@ -11,7 +11,10 @@
</button>
</mat-card-header>
<mat-card-content>
<div *ngIf="data.type === UserSelectDialogType.NewGroup">
<div
*ngIf="data.type === UserSelectDialogType.NewGroup"
class="newgroup-form"
>
<form name="inputForm" [formGroup]="inputForm" novalidate>
<mat-form-field
hintLabel="{{
@ -52,6 +55,7 @@
fxLayoutAlign="center"
fxLayoutGap="10px"
fxLayoutGap.xs="0"
class="mat-card-content-frame"
>
<div fxFlex class="container">
<mat-tab-group
@ -60,25 +64,6 @@
>
<mat-tab>
<ng-template mat-tab-label>
<!--<mat-icon>group</mat-icon>
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="butt"
stroke-linejoin="round"
matTooltip="{{ 'group.label' | translate }}"
matTooltipPosition="after"
>
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
<circle cx="9" cy="7" r="4"></circle>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
</svg>-->
<button class="icon-button">
<i class="mid mid-24 mdi-account-multiple"></i>
</button>
@ -227,24 +212,24 @@
</mat-tab-group>
</div>
</div>
<mat-card-actions class="button-form flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.no' | translate }}
</button>
<button
mat-flat-button
[disabled]="getBtnValid()"
(click)="onClickChoice(true)"
class="mat-primary"
>
{{ 'common.messages.yes' | translate }}
</button>
</mat-card-actions>
</mat-card-content>
<mat-card-actions class="button-form flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.no' | translate }}
</button>
<button
mat-flat-button
[disabled]="getBtnValid()"
(click)="onClickChoice(true)"
class="mat-primary"
>
{{ 'common.messages.yes' | translate }}
</button>
</mat-card-actions>
</mat-card>
<ng-template #selectedUserListTemplate>
@ -254,6 +239,7 @@
*ngFor="let userInfo of selectedUserList"
[selected]="getChipsRemoveYn(userInfo)"
(removed)="onClickDeleteUser(userInfo)"
[matTooltip]="userInfo.deptName"
>
{{ userInfo | ucapTranslate: 'name' }}
<mat-icon matChipRemove *ngIf="getChipsRemoveYn(userInfo)"

View File

@ -10,24 +10,27 @@
}
}
& > .mat-card-content {
//height: 568px;
position: relative;
.container {
height: 100%;
.container-frame {
height: 530px;
.mat-card-content-frame {
height: calc(100% - 50px);
.container {
height: 100%;
.container-frame {
height: 530px;
}
}
}
//그룹이름 있는 경우
.newgroup-form {
height: 70px;
+ .container {
height: calc(100% - 70px);
.container-frame {
.mat-tab-group {
& > .mat-tab-body {
height: 380px;
& + .mat-card-content-frame {
height: calc(100% - 120px);
.container {
.mat-tab-frame {
.mat-tab-group {
& > .mat-tab-body {
height: 380px;
}
}
}
}
@ -44,7 +47,7 @@
}
.dialog-tab-grouplist {
height: 380px;
height: calc(100% - 130px);
width: 100%;
.group,
.search-result {
@ -61,7 +64,7 @@
}
}
::ng-deep .dialog-tab-chatlist {
/*::ng-deep .dialog-tab-chatlist {
height: 508px;
width: 100%;
.chat {
@ -79,10 +82,10 @@
}
}
}
*/
::ng-deep .dialog-tab-orglist {
width: 100%;
height: 380px;
height: calc(100% - 130px);
border-bottom: 1px solid #dddddd;
position: relative;
.oraganization {
@ -92,7 +95,6 @@
&-tab {
width: 100%;
height: calc(100% - 50px);
// border-bottom: 1px solid #dddddd;
position: relative;
&-tree {
display: inline-flex;
@ -130,8 +132,8 @@
margin-top: 10px;
}
.mat-chip.mat-standard-chip .mat-chip-remove {
line-height: 24px;
}
.confirm-card {
.mat-card-content {
.content-box {
@ -147,7 +149,7 @@
}
}
/*:ng-deep .dialog-creat-chat {
/*::ng-deep .dialog-creat-chat {
& > .mat-tab-body-wrapper {
.mat-tab-body {
height: 380px;
@ -162,3 +164,15 @@
}
}
*/
.mat-card-content {
.mat-card-content-frame {
height: 100%;
.container {
height: 100%;
.mat-tab-group {
height: 100%;
}
}
}
}

View File

@ -766,6 +766,7 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('group.errors.label'),
html: this.translateService.instant('group.errors.requireName')
@ -787,7 +788,7 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '400px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('group.addNew'),
html: cfmMsg

View File

@ -1,4 +1,4 @@
<mat-card class="confirm-card mat-elevation-z">
<mat-card class="confirm-card mat-elevation-z edit-group">
<mat-card-header>
<mat-card-title
cdkDrag
@ -41,22 +41,22 @@
</mat-error>
</mat-form-field>
</form>
<mat-card-actions class="button-form flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.no' | translate }}
</button>
<button
mat-flat-button
(click)="onClickChoice(true)"
[disabled]="inputForm.invalid"
class="mat-primary"
>
{{ 'common.messages.yes' | translate }}
</button>
</mat-card-actions>
</mat-card-content>
<mat-card-actions class="button-form flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.no' | translate }}
</button>
<button
mat-flat-button
(click)="onClickChoice(true)"
[disabled]="inputForm.invalid"
class="mat-primary"
>
{{ 'common.messages.yes' | translate }}
</button>
</mat-card-actions>
</mat-card>

View File

@ -1,18 +1,32 @@
.mat-card-header {
.mat-card-header-text {
margin: 0;
}
.btn-dialog-close {
font-size: 20px;
display: flex;
margin-left: auto;
align-self: flex-start;
color: #444444;
}
}
.edit-group {
width: 100%;
height: 100%;
form {
.mat-form-field {
width: 100%;
.mat-card-header {
.mat-card-header-text {
margin: 0;
}
.btn-dialog-close {
font-size: 20px;
display: flex;
margin-left: auto;
align-self: flex-start;
color: #444444;
}
}
.mat-card-content {
display: flex;
flex-flow: column;
form {
.mat-form-field {
width: 100%;
}
}
.mat-card-actions {
display: flex;
align-self: flex-end;
flex-flow: row;
margin-top: auto;
}
}
}

View File

@ -1,4 +1,4 @@
<mat-card class="confirm-card mat-elevation-z">
<mat-card class="confirm-card mat-elevation-z selected-user">
<mat-card-header>
<mat-card-title>{{ data.title }}</mat-card-title>
<button class="icon-button btn-dialog-close" (click)="onClickChoice(false)">
@ -16,96 +16,98 @@
<mat-icon>add</mat-icon>
<span class="mat-fab__label">{{ 'group.addNew' | translate }}</span>
</button>
<div *ngIf="isShowAddGroupField" class="input-groupname-box">
<form name="inputForm" [formGroup]="inputForm" novalidate>
<mat-form-field
hintLabel="{{
'common.useOnlyForSpecialCharacter'
| translate: { specialCharacter: '-,_' }
}}"
>
<input
matInput
#inputGroupName
type="text"
maxlength="20"
placeholder="{{ 'group.name' | translate }}"
value=""
formControlName="groupName"
/>
<button
mat-button
matSuffix
mat-icon-button
aria-label="Clear"
(click)="inputGroupName.value = ''"
>
<mat-icon>close</mat-icon>
</button>
<mat-hint align="end"
>{{ inputGroupName.value?.length || 0 }}/20</mat-hint
>
<mat-error
*ngIf="inputForm.get('groupName').hasError('groupNameBanned')"
>
{{
'group.errors.bannedWords'
| translate: { bannedWords: bannedWords.join(',') }
}}
</mat-error>
<mat-error
*ngIf="inputForm.get('groupName').hasError('groupNameSamed')"
>
{{ 'group.errors.sameNameExist' | translate }}
</mat-error>
</mat-form-field>
</form>
<div class="btn-box">
<button mat-stroked-button (click)="onClickAddGroupCancel()">
{{ 'common.messages.close' | translate }}
</button>
</div>
<div *ngIf="isShowAddGroupField" class="input-groupname-box">
<form name="inputForm" [formGroup]="inputForm" novalidate>
<mat-form-field
hintLabel="{{
'common.useOnlyForSpecialCharacter'
| translate: { specialCharacter: '-,_' }
}}"
>
<input
matInput
#inputGroupName
type="text"
maxlength="20"
placeholder="{{ 'group.name' | translate }}"
value=""
formControlName="groupName"
/>
<button
mat-stroked-button
color="accent"
(click)="onClickAddGroup(inputGroupName.value)"
class="mat-accent"
[disabled]="inputForm.invalid"
mat-button
matSuffix
mat-icon-button
aria-label="Clear"
(click)="inputGroupName.value = ''"
>
{{ 'group.addNew' | translate }}
<mat-icon>close</mat-icon>
</button>
</div>
<mat-hint align="end"
>{{ inputGroupName.value?.length || 0 }}/20</mat-hint
>
<mat-error
*ngIf="inputForm.get('groupName').hasError('groupNameBanned')"
>
{{
'group.errors.bannedWords'
| translate: { bannedWords: bannedWords.join(',') }
}}
</mat-error>
<mat-error
*ngIf="inputForm.get('groupName').hasError('groupNameSamed')"
>
{{ 'group.errors.sameNameExist' | translate }}
</mat-error>
</mat-form-field>
</form>
<div class="btn-box">
<button mat-stroked-button (click)="onClickAddGroupCancel()">
{{ 'common.messages.close' | translate }}
</button>
<button
mat-stroked-button
color="accent"
(click)="onClickAddGroup(inputGroupName.value)"
class="mat-accent"
[disabled]="inputForm.invalid"
>
{{ 'group.addNew' | translate }}
</button>
</div>
</div>
<mat-selection-list #groups>
<mat-list-option
*ngFor="let groupBuddy of groupBuddyList$ | async"
[value]="groupBuddy.group"
[disabled]="getDisabled(groupBuddy)"
class="group-list"
>
<div class="group-name">
<span class="title-name ellipsis"> {{ groupBuddy.group.name }} </span>
<span class="text-accent-color number"
>({{ groupBuddy.buddyList.length
}}{{ 'common.units.persons' | translate }})</span
>
</div>
</mat-list-option>
<perfect-scrollbar fxFlex="1 1 auto">
<mat-list-option
*ngFor="let groupBuddy of groupBuddyList$ | async"
[value]="groupBuddy.group"
[disabled]="getDisabled(groupBuddy)"
class="group-list"
>
<div class="group-name">
<span class="title-name ellipsis">
{{ groupBuddy.group.name }}
</span>
<span class="text-accent-color number"
>({{ groupBuddy.buddyList.length
}}{{ 'common.units.persons' | translate }})</span
>
</div>
</mat-list-option>
</perfect-scrollbar>
</mat-selection-list>
<mat-card-actions class="button-form flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.no' | translate }}
</button>
<button mat-flat-button (click)="onClickChoice(true)" class="mat-primary">
{{ 'common.messages.yes' | translate }}
</button>
</mat-card-actions>
</mat-card-content>
<mat-card-actions class="button-form flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.no' | translate }}
</button>
<button mat-flat-button (click)="onClickChoice(true)" class="mat-primary">
{{ 'common.messages.yes' | translate }}
</button>
</mat-card-actions>
</mat-card>

View File

@ -14,9 +14,10 @@
width: 100%;
padding: 10px;
}
.confirm-card {
min-width: 500px;
.selected-user {
height: 100%;
.mat-card-content {
position: relative;
}
.button-form {
text-align: right;
@ -40,12 +41,17 @@
margin-left: 10px;
}
}
+ .mat-selection-list {
border-top: 1px solid #999999;
height: calc(100% - 100px);
}
}
.mat-selection-list {
border-top: 1px solid #999999;
.input-groupname-box {
+ .mat-selection-list {
border-top: 1px solid #999999;
height: calc(100% - 200px);
}
}
.group-list {
&.mat-list-item {
border-bottom: 1px solid #dddddd;

View File

@ -215,7 +215,7 @@ export class SelectGroupDialogComponent implements OnInit {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '300px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('group.addNew'),
html: this.translateService.instant('group.confirmAddNewWith', {

View File

@ -1,4 +1,4 @@
<mat-card class="confirm-card mat-elevation-z">
<mat-card class="confirm-card mat-elevation-z message-detail">
<mat-card-header>
<mat-card-title
cdkDrag
@ -257,20 +257,20 @@
</mat-tab-group>
</mat-drawer>
</mat-drawer-container>
<mat-card-actions class="button-form flex-row">
<button mat-stroked-button (click)="onClickConfirm()" class="mat-primary">
{{ 'common.messages.confirm' | translate }}
</button>
<button
mat-flat-button
*ngIf="messageDetail.msgInfo.type === MessageType.Receive"
(click)="onClickReply()"
class="mat-primary"
>
{{ 'message.sendReply' | translate }}
</button>
</mat-card-actions>
</mat-card-content>
<mat-card-actions class="button-form flex-row">
<button mat-stroked-button (click)="onClickConfirm()" class="mat-primary">
{{ 'common.messages.confirm' | translate }}
</button>
<button
mat-flat-button
*ngIf="messageDetail.msgInfo.type === MessageType.Receive"
(click)="onClickReply()"
class="mat-primary"
>
{{ 'message.sendReply' | translate }}
</button>
</mat-card-actions>
</mat-card>
<mat-menu #messageMenu="matMenu" xPosition="after" yPosition="below">

View File

@ -1,24 +1,27 @@
.mat-card-header {
.mat-card-header-text {
margin: 0;
.message-detail {
width: 100%;
height: 100%;
.mat-card-header {
.mat-card-header-text {
margin: 0;
}
.btn-dialog-close {
font-size: 20px;
display: flex;
margin-left: auto;
align-self: flex-start;
color: #444444;
}
}
.btn-dialog-close {
font-size: 20px;
display: flex;
margin-left: auto;
align-self: flex-start;
color: #444444;
}
}
.confirm-card {
min-width: 500px;
.mat-card-content {
}
.button-form {
text-align: right;
.mat-primary {
margin-left: 4px;
mat-drawer-container {
height: calc(100% - 40px);
}
.button-form {
text-align: right;
.mat-primary {
margin-left: 4px;
}
}
}
}
@ -45,6 +48,7 @@
.message-container {
background-color: #ffffff !important;
.message-info {
height: 100%;
/*.profile {
display: flex;
flex-flow: row;

View File

@ -307,6 +307,7 @@ export class MessageDetailDialogComponent implements OnInit {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: '',
html: this.translateService.instant(
@ -465,6 +466,7 @@ export class MessageDetailDialogComponent implements OnInit {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('message.cancelReservation'),
html: this.translateService.instant(
@ -488,6 +490,7 @@ export class MessageDetailDialogComponent implements OnInit {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('message.remove'),
message: this.translateService.instant('message.confirmRemove')
@ -509,8 +512,8 @@ export class MessageDetailDialogComponent implements OnInit {
MessageWriteDialogData,
MessageWriteDialogResult
>(MessageWriteDialogComponent, {
width: '600px',
height: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
disableClose: true,
hasBackdrop: false,
data: {
@ -558,6 +561,7 @@ export class MessageDetailDialogComponent implements OnInit {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('message.cancelSending'),
message: this.translateService.instant('message.confirmCancelSending')

View File

@ -1,4 +1,4 @@
<mat-card class="confirm-card mat-elevation-z">
<mat-card class="confirm-card mat-elevation-z message-write">
<mat-card-header>
<mat-card-title
cdkDrag

View File

@ -1,21 +1,17 @@
.mat-card-header {
.mat-card-header-text {
margin: 0;
}
.btn-dialog-close {
font-size: 20px;
display: flex;
margin-left: auto;
align-self: flex-start;
color: #444444;
}
}
.confirm-card {
min-width: 500px;
.message-write {
width: 100%;
height: 100%;
mat-card-content {
height: calc(100% - 40px);
.mat-card-header {
.mat-card-header-text {
margin: 0;
}
.btn-dialog-close {
font-size: 20px;
display: flex;
margin-left: auto;
align-self: flex-start;
color: #444444;
}
}
}

View File

@ -124,7 +124,8 @@ export class MessageWriteDialogComponent implements OnInit {
CreateChatDialogData,
CreateChatDialogResult
>(CreateChatDialogComponent, {
width: '600px',
maxWidth: '94vw',
maxHeight: '90vh',
data: {
type: UserSelectDialogType.EditChatMember,
title: this.translateService.instant('message.selectRecipient'),
@ -247,6 +248,7 @@ export class MessageWriteDialogComponent implements OnInit {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('message.errors.label'),
message: errorMsg
@ -359,6 +361,7 @@ export class MessageWriteDialogComponent implements OnInit {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('message.errors.label'),
message: errorMsg

View File

@ -68,17 +68,17 @@
</ucap-profile-user-list-item> -->
</cdk-virtual-scroll-viewport>
</div>
<mat-card-actions class="button-frame flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.cancel' | translate }}
</button>
<button mat-flat-button (click)="onClickChoice(true)" class="mat-primary">
{{ 'common.messages.apply' | translate }}
</button>
</mat-card-actions>
</mat-card-content>
<mat-card-actions class="button-frame flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.cancel' | translate }}
</button>
<button mat-flat-button (click)="onClickChoice(true)" class="mat-primary">
{{ 'common.messages.apply' | translate }}
</button>
</mat-card-actions>
</mat-card>

View File

@ -11,22 +11,24 @@
}
}
.confirm-card {
min-width: 500px;
.selected-user-dialog {
.mat-card-content {
height: calc(100% - 80px);
.item-list {
height: 450px;
height: calc(100% - 40px);
}
}
.button-frame {
text-align: right;
.mat-primary {
margin-left: 4px;
.button-frame {
text-align: right;
margin: 0;
.mat-primary {
margin-left: 4px;
}
}
}
}
.selected-user-dialog {
height: 100%;
.check-all {
display: flex;
border-bottom: 2px solid #444444;

View File

@ -244,8 +244,8 @@ export class ProfileDialogComponent implements OnInit, OnDestroy {
MessageWriteDialogData,
MessageWriteDialogResult
>(MessageWriteDialogComponent, {
width: '600px',
height: '600px',
maxWidth: '90vw',
maxHeight: '94vh',
disableClose: true,
hasBackdrop: false,
data: {
@ -265,6 +265,7 @@ export class ProfileDialogComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('call.errors.label'),
html: this.translateService.instant('call.errors.cannotCallToUser')
@ -277,48 +278,49 @@ export class ProfileDialogComponent implements OnInit, OnDestroy {
calleeNumber = calleeNumber.replace(/\D/g, '');
if (!!calleeNumber && calleeNumber.length > 0) {
const result = await this.dialogService.open<
ConfirmDialogComponent,
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '360px',
data: {
title: this.translateService.instant('call.callTo'),
html: this.translateService.instant('call.callWithNumber', {
phoneNumber: calleeNumber
})
}
});
// const result = await this.dialogService.open<
// ConfirmDialogComponent,
// ConfirmDialogData,
// ConfirmDialogResult
// >(ConfirmDialogComponent, {
// panelClass: 'miniSize-dialog',
// data: {
// title: this.translateService.instant('call.callTo'),
// html: this.translateService.instant('call.callWithNumber', {
// phoneNumber: calleeNumber
// })
// }
// });
if (!!result && !!result.choice && result.choice) {
this.callService
.sendCall({
userSeq: this.loginRes.userSeq,
deviceType: this.environmentsInfo.deviceType,
tokenKey: this.loginRes.tokenString,
calleeNumber
})
.pipe(
take(1),
map(res => {
if (res.responseCode === PromptMessageStatusCode.Success) {
this.logger.debug('SUCCESS');
this.logger.debug(res);
} else {
this.logger.error(res);
}
}),
catchError(error => of(this.logger.debug(error)))
)
.subscribe();
}
// if (!!result && !!result.choice && result.choice) {
this.callService
.sendCall({
userSeq: this.loginRes.userSeq,
deviceType: this.environmentsInfo.deviceType,
tokenKey: this.loginRes.tokenString,
calleeNumber
})
.pipe(
take(1),
map(res => {
if (res.responseCode === PromptMessageStatusCode.Success) {
this.logger.debug('SUCCESS');
this.logger.debug(res);
} else {
this.logger.error(res);
}
}),
catchError(error => of(this.logger.debug(error)))
)
.subscribe();
// }
} else {
this.dialogService.open<
AlertDialogComponent,
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('call.errors.label'),
html: this.translateService.instant(
@ -340,6 +342,7 @@ export class ProfileDialogComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('sms.errors.label'),
html: this.translateService.instant('sms.errors.haveNoPermission')
@ -368,7 +371,6 @@ export class ProfileDialogComponent implements OnInit, OnDestroy {
SelectGroupDialogData,
SelectGroupDialogResult
>(SelectGroupDialogComponent, {
width: '600px',
data: {
title: this.translateService.instant('group.selectTargetGroup')
}
@ -396,7 +398,7 @@ export class ProfileDialogComponent implements OnInit, OnDestroy {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('group.removeBuddyFromGroup'),
html: this.translateService.instant(

View File

@ -1,4 +1,4 @@
<mat-card class="confirm-card mat-elevation-z">
<mat-card class="confirm-card mat-elevation-z integrated-search">
<mat-card-header>
<mat-card-title
cdkDrag

View File

@ -398,6 +398,8 @@ export class IntegratedSearchDialogComponent implements OnInit, OnDestroy {
ProfileDialogData,
ProfileDialogResult
>(ProfileDialogComponent, {
maxWidth: '90vw',
height: '500px',
data: {
userInfo: res.userInfo
}

View File

@ -1,13 +1,9 @@
.setting-frame {
padding: 16px;
height: 100%;
width: 720px;
height: calc(90vh - 50px);
width: 100%;
position: relative;
.mat-dialog-container {
position: relative;
}
.mat-card-header {
position: relative;
width: 100%;
@ -23,6 +19,7 @@
}
}
.mat-card-content {
position: relative;
flex: 0 0 auto;
display: flex;
align-items: flex-start;

View File

@ -408,6 +408,8 @@ export class TopBarComponent implements OnInit, OnDestroy {
ProfileDialogData,
ProfileDialogResult
>(ProfileDialogComponent, {
maxWidth: '90vw',
height: '500px',
data: {
userInfo: res.userInfo
}
@ -700,13 +702,12 @@ export class TopBarComponent implements OnInit, OnDestroy {
IntegratedSearchDialogData,
IntegratedSearchDialogResult
>(IntegratedSearchDialogComponent, {
height: '90vh',
width: '96vw',
data: {
keyword
},
restoreFocus: false,
hasBackdrop: false,
panelClass: 'fullSize-dialog',
id: 'IntegratedSearchDialog'
});
@ -735,7 +736,7 @@ export class TopBarComponent implements OnInit, OnDestroy {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '400px',
panelClass: 'miniSize-dialog',
data: {
title: 'Clear & Logout?',
html: 'Clear General Setting And Logout?'

View File

@ -1,373 +1,15 @@
$desktop-l-width: 1440px;
$tablet-l-width: 1024px;
$tablet-s-width: 768px;
$mob-l-width: 640px;
@mixin tab {
@media screen and (max-width: #{$tablet-l-width}), (max-height: #{$tablet-s-width}) {
@content;
}
}
.login {
width: 100%;
background-size: cover;
height: calc(100% - 50px);
background: #eaeff1;
margin-top: 50px;
overflow: hidden;
/*background: -webkit-linear-gradient(to top, #93a3af, #eaeff1);
background: linear-gradient(to top, #93a3af, #eaeff1);*/
height: 100%;
.login-wrapper {
flex: 1 0 auto;
background-color: #ffffff;
background-size: 100% auto;
position: relative;
display: flex;
justify-content: center;
align-items: center;
display: flex;
}
}
$main: #777;
$back: #aaa;
$accent: hsl(220, 50%, 40%);
$sans: 'Open Sans', sans-serif;
$heebo: 'Heebo', sans-serif;
$hangul: '나눔고딕', Malgun Gothic, '맑은고딕', Arial, Dotum, '돋움';
$base: 3vh;
$time: 1800ms;
$ease-out: cubic-bezier(0.26, 0.005, 0.135, 1);
$ease-in-out: cubic-bezier(0.785, 0.135, 0.15, 0.86);
@mixin word-break-keep {
word-break: keep-all;
}
.slider {
position: relative;
height: 100%;
width: 100%;
//background: $main;
overflow: hidden;
&_wrap {
position: absolute;
width: 100%;
height: 100%;
transform: translateX(100%);
top: 0%;
left: 0;
right: auto;
overflow: hidden;
transition: transform $time/4 $ease-in-out;
transform-origin: 0% 50%;
transition-delay: $time/4;
opacity: 0;
&-hacked {
opacity: 1;
}
}
&_back {
position: absolute;
width: 100%;
height: 100%;
background-size: auto 100%;
background-position: center;
background-repeat: none;
transition: filter $time/4 $ease-in-out;
background-color: #2d3a4a;
}
&_inner {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0%;
background-size: auto 133.3333%;
background-position: center;
background-repeat: none;
transform: scale(0.7);
transition: transform $time/4 $ease-in-out, box-shadow $time/4 $ease-in-out,
opacity $time/4 step-end;
opacity: 0;
//box-shadow: 0 $base $base rgba(darken($accent, 50%), 0);
padding: $base * 3;
box-sizing: border-box;
border: 1px solid #ffffff;
}
&_header {
display: flex;
flex-flow: row;
width: 40%;
height: 20px;
justify-content: center;
font-size: $base * 0.6;
color: #ffffff;
.company-name {
flex: 0 0 auto;
padding-right: 20px;
}
.h-line {
flex: 1 1 auto;
align-self: center;
height: 2px;
border-bottom: 1px solid #ffffff;
}
}
&_content {
position: relative;
top: 64%;
width: 40%;
transform: translateY(-50%);
color: white;
font-family: $hangul;
opacity: 0;
transition: opacity $time/4;
h1 {
font-weight: 900;
font-size: $base * 1.24;
line-height: 1.2;
margin-bottom: $base/2;
pointer-events: none;
text-shadow: 0 $base/8 $base/4 rgba(darken($accent, 50%), 0.1);
@include word-break-keep();
}
p {
font-size: $base * 0.64;
line-height: $base * 0.9;
margin-bottom: $base/2;
@include word-break-keep();
}
}
&_link {
cursor: pointer;
position: absolute;
display: flex;
justify-content: center;
justify-items: center;
font-family: $heebo;
font-size: 1.2rem;
letter-spacing: $base * 0.1;
font-weight: 100;
display: block;
bottom: 10%;
color: #ffffff;
padding: 10px 60px 10px 30px;
border-radius: 100px;
color: #00dbed;
width: $base * 5;
// next버튼 숨김
display: none;
&:before {
content: '';
border-top: 1px solid white;
border-right: 1px solid white;
display: block;
width: $base/3;
height: $base/3;
transform: translateX(0) translateY(-50%) rotate(45deg);
position: absolute;
font-family: $heebo;
font-weight: 100;
top: 50%;
left: $base * 4;
}
&:hover {
background-color: #134a67;
color: #ffffff;
}
}
&_slide {
position: absolute;
left: 0;
height: 100%;
width: 100%;
transition: transform $time/3 $ease-in-out;
transition-delay: $time/3;
pointer-events: none;
z-index: 0;
&-active {
transform: translatex(0%);
z-index: 2;
.slider_wrap {
transform: translateX(0);
transform-origin: 100% 50%;
opacity: 1;
animation: none;
}
.slider_back {
filter: blur(#{$base * 0.2});
transition: filter $time/2 $ease-in-out;
transition-delay: $time/2 !important;
}
.slider_inner {
transform: scale(0.7);
box-shadow: 0 $base/3 $base * 1 rgba(darken($accent, 50%), 0.2);
pointer-events: auto;
opacity: 1;
transition: transform $time/2 $ease-in-out,
box-shadow $time/2 $ease-in-out, opacity 1ms step-end;
transition-delay: $time/2;
}
.slider_content {
opacity: 1;
transition-delay: $time * 3/4;
}
}
&:not(.slider_slide-active) .slider_wrap {
@keyframes hack {
0% {
transform: translateX(0);
opacity: 1;
}
50% {
transform: translateX(-100vw);
opacity: 1;
}
51% {
transform: translateX(-100vw);
opacity: 0;
}
52% {
transform: translateX(100vw);
opacity: 0;
}
100% {
transform: translateX(100vw);
opacity: 1;
}
}
animation-name: hack;
animation-duration: $time/2;
animation-delay: $time/4;
animation-timing-function: $ease-in-out;
}
&:nth-child(1) .slider_back,
&:nth-child(1) .slider_inner {
// background-image: url(/assets/images/login/bg_login01.png);
//background: #eee;
}
&:nth-child(2) .slider_back,
&:nth-child(2) .slider_inner {
// background-image: url(/assets/images/login/bg_login02.png);
//background: #aaa;
}
&:nth-child(3) .slider_back,
&:nth-child(3) .slider_inner {
// background-image: url(/assets/images/login/bg_login03.png);
//background: #888;
}
}
}
::ng-deep .login-form-box {
position: absolute;
width: 20vw;
height: 50%;
min-height: 480px;
display: flex;
justify-content: flex-end;
z-index: 100;
@media screen and (max-width: #{$desktop-l-width}) {
width: 24vw;
min-height: 480px;
}
@media screen and (max-width: #{$tablet-l-width}) {
width: 36vw;
min-height: 420px;
}
.mat-form-field-label-wrapper {
color: #06b2d6;
}
/*.mat-form-field {
padding-top: 20px;
.mat-form-field-wrapper {
padding-bottom: 0;
.mat-form-field-infix {
padding-top: 0;
border: 0;
}
.mat-form-field-label-wrapper {
top: -1.4em;
}
.mat-form-field-underline {
bottom: 0;
}
//min-size 반응형 적용
@include tab {
.mat-form-field-infix {
input {
font-size: 0.9em;
}
}
.mat-form-field-label-wrapper {
font-size: 0.9em;
}
.mat-form-field-subscript-wrapper {
.mat-error {
font-size: 0.8em;
}
}
&.mat-focused,
&:not(.mat-form-field-hide-placeholder) {
.mat-form-field-label-wrapper {
font-size: 0;
}
}
}
}
}
.error-container {
padding-top: 10px;
}*/
}
::ng-deep .notice {
ol {
li {
list-style: decimal;
margin-bottom: 14px;
margin-left: 20px;
span {
color: #ff5722;
}
}
}
}
@media all and (max-width: 1400px) {
.slider {
&_content {
transform: translateY(-50%);
color: white;
font-family: $heebo;
opacity: 0;
transition: opacity $time/4;
h1 {
font-weight: 900;
font-size: $base * 1.2;
margin-bottom: $base;
}
p {
display: none;
}
}
&-active {
.slider_inner {
transform: scale(0.9);
}
.login-form-box {
width: 300px;
height: 400px;
}
}
}

View File

@ -168,7 +168,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: '',
html: this.translateService.instant(
@ -184,7 +184,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: '',
html: this.translateService.instant(
@ -234,7 +234,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: '',
html: this.translateService.instant(
@ -256,7 +256,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant(
'accounts.errors.loginFailed'
@ -298,7 +298,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: '',
html: msg
@ -381,7 +381,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant(
'accounts.errors.loginFailed'
@ -402,7 +402,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant(
'accounts.errors.loginFailed'
@ -442,6 +442,8 @@ export class LoginPageComponent implements OnInit, OnDestroy {
NoticeDialogResult
>(NoticeDialogComponent, {
width: '600px',
height: '540px',
panelClass: 'notice-dialog',
data: {
title: '이용시 주의사항',
html: `

View File

@ -355,6 +355,8 @@ export class MainPageComponent implements OnInit, OnDestroy {
ProfileDialogData,
ProfileDialogResult
>(ProfileDialogComponent, {
maxWidth: '90vw',
height: '500px',
data: {
userInfo: res.userInfo,
openProfileOptions: params.openProfileOptions
@ -374,6 +376,7 @@ export class MainPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('call.errors.label'),
html: this.translateService.instant('call.errors.cannotCallToUser')
@ -386,43 +389,44 @@ export class MainPageComponent implements OnInit, OnDestroy {
calleeNumber = calleeNumber.replace(/\D/g, '');
if (!!calleeNumber && calleeNumber.length > 0) {
const result = await this.dialogService.open<
ConfirmDialogComponent,
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '360px',
data: {
title: this.translateService.instant('call.callTo'),
html: this.translateService.instant('call.callWithNumber', {
phoneNumber: calleeNumber
})
}
});
// const result = await this.dialogService.open<
// ConfirmDialogComponent,
// ConfirmDialogData,
// ConfirmDialogResult
// >(ConfirmDialogComponent, {
// panelClass: 'miniSize-dialog',
// data: {
// title: this.translateService.instant('call.callTo'),
// html: this.translateService.instant('call.callWithNumber', {
// phoneNumber: calleeNumber
// })
// }
// });
if (!!result && !!result.choice && result.choice) {
this.callService
.sendCall({
userSeq: this.loginRes.userSeq,
deviceType: this.environmentsInfo.deviceType,
tokenKey: this.loginRes.tokenString,
calleeNumber
})
.pipe(
take(1),
map(res => {
this.logger.debug(res);
}),
catchError(error => of(this.logger.debug(error)))
)
.subscribe();
}
// if (!!result && !!result.choice && result.choice) {
this.callService
.sendCall({
userSeq: this.loginRes.userSeq,
deviceType: this.environmentsInfo.deviceType,
tokenKey: this.loginRes.tokenString,
calleeNumber
})
.pipe(
take(1),
map(res => {
this.logger.debug(res);
}),
catchError(error => of(this.logger.debug(error)))
)
.subscribe();
// }
} else {
this.dialogService.open<
AlertDialogComponent,
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('call.errors.label'),
html: this.translateService.instant(
@ -444,6 +448,7 @@ export class MainPageComponent implements OnInit, OnDestroy {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('sms.errors.label'),
html: this.translateService.instant('sms.errors.haveNoPermission')

View File

@ -155,6 +155,7 @@ export class AppMessengerResolver implements Resolve<void> {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
disableClose: true,
data: {
title: 'Warnning!!',

View File

@ -1,6 +1,13 @@
import { Injectable, Inject } from '@angular/core';
import { tap, withLatestFrom } from 'rxjs/operators';
import {
tap,
withLatestFrom,
take,
map,
catchError,
finalize
} from 'rxjs/operators';
import { Store, select } from '@ngrx/store';
@ -116,7 +123,12 @@ import { environment } from '../../environments/environment';
import { NotificationMethod, LocaleCode } from '@ucap-webmessenger/core';
import { Dictionary } from '@ngrx/entity';
import { MessageType } from '@ucap-webmessenger/api-message';
import { LogoutInfo, KEY_LOGOUT_INFO, KEY_VER_INFO } from '@app/types';
import {
LogoutInfo,
KEY_LOGOUT_INFO,
KEY_VER_INFO,
KEY_LOGIN_RES_INFO
} from '@app/types';
import { TranslateService } from '@ngx-translate/core';
import { deleteMessageSuccess } from '@app/store/messenger/message';
import { ServerErrorCode } from '@ucap-webmessenger/protocol';
@ -138,6 +150,8 @@ import { UserInfo, RoomUserData } from '@ucap-webmessenger/protocol-sync';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
import { QueryProtocolService } from '@ucap-webmessenger/protocol-query';
import { UserInfoListState } from '@app/store/messenger/room';
import { DaesangProtocolService } from '@ucap-webmessenger/daesang';
import { of } from 'rxjs';
@Injectable()
export class AppNotificationService {
@ -149,6 +163,7 @@ export class AppNotificationService {
private groupProtocolService: GroupProtocolService,
private buddyProtocolService: BuddyProtocolService,
private queryProtocolService: QueryProtocolService,
private daesangProtocolService: DaesangProtocolService,
private statusProtocolService: StatusProtocolService,
private translateService: TranslateService,
private ucapTranslateService: UcapTranslateService,
@ -233,25 +248,10 @@ export class AppNotificationService {
(state: any) =>
state.messenger.sync.buddy2.entities as Dictionary<UserInfo>
)
),
this.store.pipe(
select(
(state: any) =>
state.messenger.sync.roomUserShort.entities as Dictionary<
RoomUserData
>
)
)
),
tap(
([
notiOrRes,
curRoomInfo,
curRoomUserInfo,
roomList,
buddyList,
roomUserShorts
]) => {
([notiOrRes, curRoomInfo, curRoomUserInfo, roomList, buddyList]) => {
switch (notiOrRes.SSVC_TYPE) {
case SSVC_TYPE_EVENT_SEND_RES:
case SSVC_TYPE_EVENT_SEND_NOTI:
@ -356,32 +356,70 @@ export class AppNotificationService {
senderInfo = curRoomUserInfo[noti.SENDER_SEQ];
}
// STEP 3 >> In All Room Users.
// STEP 3 >> user protocol
if (!senderInfo) {
for (const key in roomUserShorts) {
if (key === undefined) {
continue;
}
const loginRes = this.sessionStorageService.get<
LoginResponse
>(KEY_LOGIN_RES_INFO);
if (roomUserShorts.hasOwnProperty(key)) {
const element = roomUserShorts[key];
const filteredUserInfos = element.userInfos.filter(
info => info.seq === noti.SENDER_SEQ
);
this.daesangProtocolService
.dataUserDaesang({
divCd: 'OPENNOTI',
seq: noti.SENDER_SEQ,
senderCompanyCode:
loginRes.userInfo.companyCode,
senderEmployeeType:
loginRes.userInfo.employeeType
})
.pipe(
take(1),
map(res => {
if (!!res && !!res.userInfo) {
senderInfo = res.userInfo;
let name = senderInfo.name;
let grade = senderInfo.grade;
if (
!!filteredUserInfos &&
filteredUserInfos.length > 0
) {
senderInfo = filteredUserInfos[0];
break;
}
}
}
}
switch (
this.ucapTranslateService.currentLang.toUpperCase()
) {
case LocaleCode.English:
name = senderInfo.nameEn;
grade = senderInfo.gradeEn;
break;
case LocaleCode.Chinese:
name = senderInfo.nameCn;
grade = senderInfo.gradeCn;
break;
}
// Sender Info setting.
if (!!senderInfo) {
notiReq.title = this.translateService.instant(
'notification.titleChatEventArrivedByUser',
{
userInfo: !!grade
? `${name} ${grade}`
: name
}
);
// Image set.
if (!!senderInfo.profileImageFile) {
const sessionVerinfo = this.sessionStorageService.get<
VersionInfo2Response
>(KEY_VER_INFO);
notiReq.image = `${sessionVerinfo.profileRoot}${senderInfo.profileImageFile}`;
}
}
}),
catchError(error => {
return of();
}),
finalize(() => {
this.nativeService.notify(notiReq);
})
)
.subscribe();
} else {
// Sender Info setting.
// name set
let name = senderInfo.name;
let grade = senderInfo.grade;
@ -413,10 +451,10 @@ export class AppNotificationService {
>(KEY_VER_INFO);
notiReq.image = `${sessionVerinfo.profileRoot}${senderInfo.profileImageFile}`;
}
}
// express noti popup
this.nativeService.notify(notiReq);
// express noti popup
this.nativeService.notify(notiReq);
}
}
}
}

View File

@ -283,6 +283,7 @@ export class Effects {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('accounts.logout'),
message: this.translateService.instant('accounts.confirmLogout')
@ -334,8 +335,7 @@ export class Effects {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '100%',
height: '500px',
panelClass: 'miniSize-dialog',
disableClose: true,
data: {
title: this.translateService.instant(
@ -365,8 +365,7 @@ export class Effects {
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
width: '100%',
height: '500px',
panelClass: 'miniSize-dialog',
disableClose: true,
data: {
title: this.translateService.instant('accounts.resetPassword'),
@ -391,6 +390,7 @@ export class Effects {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant(
'accounts.passwordExpired'
@ -526,7 +526,7 @@ export class Effects {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
disableClose: true,
data: {
title: this.translateService.instant('accounts.changePassword'),

View File

@ -371,7 +371,7 @@ export class Effects {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
width: '360px',
panelClass: 'miniSize-dialog',
disableClose: true,
data: {
title: '',

View File

@ -82,7 +82,6 @@ import {
AlertDialogData,
AlertDialogResult
} from '@ucap-webmessenger/ui';
import { ActivatedRouteSnapshot } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
@Injectable()
@ -112,6 +111,7 @@ export class Effects {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
disableClose: true,
data: {
title: 'Warnning!!',
@ -299,6 +299,7 @@ export class Effects {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.errors.label'),
html: this.translateService.instant(

View File

@ -43,10 +43,8 @@ export class Effects {
MessengerSettingsDialogData,
MessengerSettingsDialogResult
>(MessengerSettingsDialogComponent, {
width: '800px',
maxWidth: '800px',
height: '800px',
minHeight: '800px',
maxWidth: '94vw',
maxHeight: '90vh',
disableClose: false,
data: {}
});
@ -76,6 +74,7 @@ export class Effects {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
disableClose: true,
data: {
title: 'Warnning!!',

View File

@ -5,6 +5,7 @@ import { Actions, createEffect, ofType } from '@ngrx/effects';
import { Store } from '@ngrx/store';
import { NGXLogger } from 'ngx-logger';
import * as RoomStore from '@app/store/messenger/room';
import * as SyncStore from '@app/store/messenger/sync';
import * as AuthStore from '@app/store/account/authentication';
import {
@ -143,6 +144,25 @@ export class Effects {
{ dispatch: false }
);
mroomUserStatusCheck$ = createEffect(
() =>
this.actions$.pipe(
ofType(RoomStore.infoSuccess),
map(action => action.userInfoList),
tap(userInfoList => {
if (!!userInfoList && userInfoList.length > 0) {
this.store.dispatch(
bulkInfo({
divCd: 'roomuserBulk',
userSeqs: userInfoList.map(userinfo => userinfo.seq)
})
);
}
})
),
{ dispatch: false }
);
constructor(
private actions$: Actions,
private store: Store<any>,

View File

@ -453,6 +453,7 @@ export class Effects {
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'miniSize-dialog',
data: {
title: this.translateService.instant('chat.errors.label'),
html: this.translateService.instant(

View File

@ -244,6 +244,8 @@
"btnSticker": "Sticker",
"btnTranslate": "Translate",
"noRoomUser": "No chat users",
"existOfflineUser": "{{offlineUser}} may not respond because it is [offline].",
"existOfflineUsers": "Some chat partners may not respond because they are not online.",
"event": {
"inviteToRoomWith": "{{owner}} invited {{inviter}}.",
"exitFromRoomWith": "{{exitor}} has left.",

View File

@ -244,6 +244,8 @@
"btnSticker": "스티커",
"btnTranslate": "번역",
"noRoomUser": "대화상대 없음",
"existOfflineUser": "{{offlineUser}}님이 [오프라인]이므로 응답하지 않을 수도 있습니다.",
"existOfflineUsers": "일부 대화상대는 온라인 상태가 아니어서 응답하지 않을 수도 있습니다.",
"event": {
"inviteToRoomWith": "{{owner}}이 {{inviter}}을 초대했습니다.",
"exitFromRoomWith": "{{exitor}}님이 퇴장하셨습니다.",

View File

@ -55,13 +55,13 @@ $lg-red: (
50: #ffffff,
100: #fff9fc,
200: #f1e1e5,
/*300: #f06292,*/ 300: #ef4c73,
300: #ef4c73,
400: #ec407a,
500: #ed097e,
600: #d81b60,
700: #c2185b,
800: #ad1457,
/*900: #880e4f,*/ 900: #5f2a41,
900: #5f2a41,
A100: #ff80ab,
A200: #ff4081,
A400: #ff3399,
@ -291,29 +291,12 @@ $daesang-grey: (
.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary {
background-color: mat-color($accent, 700);
cursor: pointer;
.mat-chip-remove {
opacity: 0.6;
}
}
.load-container .loader:after {
background-color: mat-color($accent, 300);
}
.ps__rail-y {
& > .ps__thumb-y {
margin-right: -2px;
}
}
.cdk-virtual-scroll-orientation-vertical {
.cdk-virtual-scroll-content-wrapper {
width: 100%;
height: 100%;
contain: none;
}
}
.global-menu {
.mat-tab-label[aria-selected='true'] {
.mat-tab-label-content {
@ -372,7 +355,7 @@ $daesang-grey: (
color: #ffffff;
}
//탭개수에 의한 width 정의
//[S]탭개수에 의한 width 정의
.mat-tab-group {
&.tab_num2 {
.mat-tab-label {
@ -394,8 +377,9 @@ $daesang-grey: (
border: none;
}
}
//[E]탭개수에 의한 width 정의
//쪽지 라디오 버튼 정렬
//[S]쪽지 라디오 버튼 정렬
.message-box {
.mat-radio-label {
.mat-radio-label-content {
@ -403,10 +387,23 @@ $daesang-grey: (
}
}
}
//[E]쪽지 라디오 버튼 정렬
//[S]mat-tab-group
/*mat-tab-group {
display: flex;
flex-direction: row;
.mat-tab-header {
width: 100%;
.mat-tab-label-container {
width: 100%;
}
}
}*/
mat-tab-group[vertical] {
display: flex;
flex-direction: row;
flex-direction: column;
.mat-tab-header {
border-bottom: none;
.mat-tab-labels {
@ -435,6 +432,32 @@ $daesang-grey: (
}
}
//설정 general-theme
.theme-list {
.mat-tab-header {
width: 100%;
border: none !important;
.mat-tab-labels {
position: relative;
width: 100%;
flex-direction: row !important;
.mat-tab-label {
width: 140px;
height: 120px;
&.mat-tab-label-active {
opacity: 1;
}
.mat-tab-label-content {
position: relative;
flex-flow: column;
width: 100%;
}
}
}
}
}
//[E]mat-tab-group
nav[mat-tab-nav-bar][vertical] {
display: flex;
flex-direction: row !important;
@ -466,7 +489,7 @@ $daesang-grey: (
}
}
//대화 말풍선 global 적용
//[S]대화 말풍선 global 적용
.message-row {
.message-main {
.bubble {
@ -502,8 +525,22 @@ $daesang-grey: (
}
}
}
//[E]대화 말풍선 global 적용
//[s] 번역
//[S]스티커
.sticker-selector {
.mat-tab-header {
.mat-tab-label {
min-width: 16%;
@media screen and (max-width: #{$tablet-s-width}) {
padding: 0 10px;
}
}
}
}
//[E]스티커
//[S]번역
.translationForm {
background-color: mat-color($accent, 200, 0.4);
.select-language {
@ -531,6 +568,7 @@ $daesang-grey: (
.translation-preview {
background-color: mat-color($accent, 900, 0.8);
}
//[E] 번역
.tree-has-child {
li {
@ -540,6 +578,16 @@ $daesang-grey: (
}
}
}
.mat-calendar {
mat-calendar-header {
.mat-calendar-header {
.mat-calendar-controls {
margin: 0;
}
}
}
}
.mat-calendar-body-selected {
background-color: mat-color($accent);
}

View File

@ -213,6 +213,8 @@ export class BrowserNativeService extends NativeService {
});
}
onFlashFlame(): void {}
offFlashFlame(): void {}
windowStateChanged(): Observable<WindowState> {
return new Observable<WindowState>(subscriber => {
try {

View File

@ -352,6 +352,12 @@ export class ElectronNativeService implements NativeService {
});
}
onFlashFlame(): void {
this.ipcRenderer.send(WindowStateChannel.OnFlashFrame);
}
offFlashFlame(): void {
this.ipcRenderer.send(WindowStateChannel.OffFlashFrame);
}
windowStateChanged(): Observable<WindowState> {
if (!this.windowStateChangedSubject) {
this.windowStateChangedSubject = new Subject<WindowState>();

View File

@ -47,7 +47,9 @@ export enum ProcessChannel {
export enum WindowStateChannel {
Changed = 'UCAP::windowState::windowStateChanged',
FocuseChanged = 'UCAP::windowState::windowFocusStateChanged'
FocuseChanged = 'UCAP::windowState::windowFocusStateChanged',
OnFlashFrame = 'UCAP::windowState::OnFlashFrame',
OffFlashFrame = 'UCAP::windowState::OffFlashFrame'
}
export enum IdleStateChannel {

View File

@ -70,6 +70,8 @@ export abstract class NativeService {
abstract executeProcess(executableName: string): Promise<number>;
abstract onFlashFlame(): void;
abstract offFlashFlame(): void;
abstract windowStateChanged(): Observable<WindowState>;
abstract windowClose(): void;
abstract windowMinimize(): void;

View File

@ -159,7 +159,7 @@ $login-max-height: 800px;
.policy {
cursor: pointer;
position: absolute;
bottom: 2vh;
bottom: 0;
display: block;
background-color: #58b0b1;
width: 100%;

View File

@ -2,39 +2,39 @@
<form name="messageWriteForm" [formGroup]="messageWriteForm" novalidate>
<perfect-scrollbar>
<div class="write-form">
<div class="add-row">
<button
mat-button
(click)="onClickReceiverList()"
class="mat-mini-fab mat-button-base mat-accent mat-elevation-z"
>
<mat-icon>add</mat-icon>
<span class="mat-fab__label">{{
'message.addReceiver' | translate
}}</span>
</button>
<span
*ngIf="!!receiverList && receiverList.length > 0"
class="receiver-sum text-accent-color"
>
{{
'message.countOfReceiver'
| translate: { count: receiverList.length }
}}
</span>
</div>
<mat-chip-list #chipList aria-label="receiver selection">
<mat-chip
*ngFor="let receiver of receiverList"
removable="true"
(removed)="onRemovedReceiver(receiver)"
>
{{ receiver.name }}
<span matChipRemove class="mdi mdi-close"></span>
</mat-chip>
</mat-chip-list>
<div class="add-row">
<button
mat-button
(click)="onClickReceiverList()"
class="mat-mini-fab mat-button-base mat-accent mat-elevation-z"
>
<mat-icon>add</mat-icon>
<span class="mat-fab__label">{{
'message.addReceiver' | translate
}}</span>
</button>
<span
*ngIf="!!receiverList && receiverList.length > 0"
class="receiver-sum text-accent-color"
>
{{
'message.countOfReceiver'
| translate: { count: receiverList.length }
}}
</span>
</div>
<mat-chip-list #chipList aria-label="receiver selection">
<mat-chip
*ngFor="let receiver of receiverList"
removable="true"
(removed)="onRemovedReceiver(receiver)"
>
{{ receiver.name }}
<span matChipRemove class="mdi mdi-close"></span>
</mat-chip>
</mat-chip-list>
<!--<mat-form-field class="message-receiver-list">
<!--<mat-form-field class="message-receiver-list">
<perfect-scrollbar>
<mat-chip-list #chipList aria-label="receiver selection">
<mat-chip
@ -56,65 +56,67 @@
</mat-form-field>
-->
<mat-form-field class="message-title">
<input
matInput
#inputTitle
formControlName="title"
placeholder="{{ 'message.fieldTitle' | translate }}"
maxlength="100"
/>
<mat-hint align="end">{{ inputTitle.value?.length || 0 }}/100</mat-hint>
</mat-form-field>
<mat-form-field class="message-title">
<input
matInput
#inputTitle
formControlName="title"
placeholder="{{ 'message.fieldTitle' | translate }}"
maxlength="100"
/>
<mat-hint align="end"
>{{ inputTitle.value?.length || 0 }}/100</mat-hint
>
</mat-form-field>
<div class="message-content">
<mat-card-content class="message-write-body">
<div
#editor
class="ucap-message-write-editor"
contenteditable="true"
(paste)="onPasteEditor($event)"
(input)="onInputEditor()"
></div>
<input type="file" #fileInput style="display: none" multiple />
<mat-list>
<mat-list-item
*ngFor="let oldAttachment of oldAttachmentList"
class="attach-file-list"
>
<div class="attach-file">
<span class="mdi mdi-attachment mdi-18px"> </span>
<span class="file-name">{{ oldAttachment.resContent }}</span>
<button
mat-button
class="icon-button"
aria-label="기존파일삭제"
(click)="onClickDeleteOldAttachment(oldAttachment)"
>
<i class="mid mdi-18px mdi-delete-outline"></i>
</button>
</div>
</mat-list-item>
<mat-list-item
*ngFor="let attachment of attachmentList"
class="attach-file-list"
>
<div class="attach-file">
<span class="mdi mdi-attachment mdi-18px"> </span
><span class="file-name">{{ attachment.name }}</span>
<button
mat-button
class="icon-button"
aria-label="파일삭제"
(click)="onClickDelelteAttachment(attachment)"
>
<i class="mid mdi-18px mdi-delete-outline"></i>
</button>
</div>
</mat-list-item>
</mat-list>
</mat-card-content>
</div>
<div class="message-content">
<mat-card-content class="message-write-body">
<div
#editor
class="ucap-message-write-editor"
contenteditable="true"
(paste)="onPasteEditor($event)"
(input)="onInputEditor()"
></div>
<input type="file" #fileInput style="display: none" multiple />
<mat-list>
<mat-list-item
*ngFor="let oldAttachment of oldAttachmentList"
class="attach-file-list"
>
<div class="attach-file">
<span class="mdi mdi-attachment mdi-18px"> </span>
<span class="file-name">{{ oldAttachment.resContent }}</span>
<button
mat-button
class="icon-button"
aria-label="기존파일삭제"
(click)="onClickDeleteOldAttachment(oldAttachment)"
>
<i class="mid mdi-18px mdi-delete-outline"></i>
</button>
</div>
</mat-list-item>
<mat-list-item
*ngFor="let attachment of attachmentList"
class="attach-file-list"
>
<div class="attach-file">
<span class="mdi mdi-attachment mdi-18px"> </span
><span class="file-name">{{ attachment.name }}</span>
<button
mat-button
class="icon-button"
aria-label="파일삭제"
(click)="onClickDelelteAttachment(attachment)"
>
<i class="mid mdi-18px mdi-delete-outline"></i>
</button>
</div>
</mat-list-item>
</mat-list>
</mat-card-content>
</div>
</div>
</perfect-scrollbar>
</form>

View File

@ -2,12 +2,13 @@
width: 100%;
height: 100%;
form {
height: 400px;
height: calc(100% - 100px);
perfect-scrollbar {
.ps--active-x > .ps__rail-x {
display: none;
}
.write-form {
height: 100%;
padding-right: 10px;
}
}
@ -56,6 +57,8 @@
flex-flow: row;
position: relative;
width: 100%;
min-height: calc(100% - 150px);
margin-top: 10px;
.message-receiver-list {
position: relative;
width: 30%;
@ -64,15 +67,15 @@
}
.message-write-body {
display: flex;
flex: 1 1 auto;
flex: 1 1 100%;
flex-flow: column;
margin: 0;
height: auto;
.ucap-message-write-editor {
display: inline-block;
width: 100%;
height: 100%;
padding: 10px;
min-height: 250px;
border: 1px solid #dddddd;
word-break: break-all;
}

View File

@ -372,7 +372,7 @@ export class WriteComponent implements OnInit, OnDestroy, AfterViewInit {
ScheduleSendDialogResult
>(ScheduleSendDialogComponent, {
width: '600px',
height: '600px',
height: '560px',
disableClose: true,
data: {
reservationDate

View File

@ -6,7 +6,7 @@
</mat-card-header>
<mat-card-content>
<div fxLayout="row">
<div fxFlex="60%">
<div flFlex="0 0 100%" style="width:50%;">
<div fxLayout="column">
<div fxFlexFill>
<ucap-pick-date
@ -101,31 +101,31 @@
</div>
</div>
</div>
</mat-card-content>
<mat-card-actions>
<div class="actions-container">
<div class="actions-message text-warn-color">
<span *ngIf="dateIsToEarly">
{{ 'message.errors.minTimeReservation' | translate }}
</span>
</div>
<div class="actions">
<button
mat-stroked-button
(click)="onClickCancel()"
class="mat-primary"
>
{{ 'common.messages.cancel' | translate }}
</button>
<button
mat-flat-button
[disabled]="dateIsToEarly"
(click)="onClickSend()"
class="mat-primary"
>
{{ 'message.sendReservation' | translate }}
</button>
</div>
<div class="actions-message text-warn-color">
<span *ngIf="dateIsToEarly">
{{ 'message.errors.minTimeReservation' | translate }}
</span>
</div>
</mat-card-actions>
<mat-card-actions>
<div class="actions-container">
<div class="actions">
<button
mat-stroked-button
(click)="onClickCancel()"
class="mat-primary"
>
{{ 'common.messages.cancel' | translate }}
</button>
<button
mat-flat-button
[disabled]="dateIsToEarly"
(click)="onClickSend()"
class="mat-primary"
>
{{ 'message.sendReservation' | translate }}
</button>
</div>
</div>
</mat-card-actions>
</mat-card-content>
</mat-card>

View File

@ -8,6 +8,7 @@
.actions-message {
font-size: 0.9em;
height: 30px;
}
.actions-spacer {
@ -36,6 +37,10 @@
}
.Reservation-dete {
margin-top: 30px;
margin-top: 10px;
font-size: 1.6em;
}
.actions-message {
height: 30px;
}

View File

@ -250,6 +250,9 @@
| ucapStringFormatterPhone
| ucapStringEmptycheck
}}
<span *ngIf="!!userInfo.madn && userInfo.madn.trim().length > 0"
>({{ userInfo.madn }})</span
>
</dd>
<button
mat-mini-fab
@ -260,12 +263,7 @@
[disabled]="getDisabledBtn('LINE')"
(click)="onClickCall('LINE')"
>
<svg
id="레이어_1"
data-name="레이어 1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path
d="M18.61,16.55c-0.42,1.03-2.29,1.97-3.12,2.01c-0.83,0.04-0.85,0.64-5.37-1.32c-4.51-1.96-7.23-6.73-7.45-7.04
C2.46,9.9,0.92,7.71,1,5.51c0.08-2.2,1.29-3.24,1.72-3.67c0.43-0.43,0.92-0.51,1.22-0.51c0.36-0.01,0.59-0.01,0.85,0
@ -293,12 +291,7 @@
[disabled]="getDisabledBtn('MOBILE')"
(click)="onClickCall('MOBILE')"
>
<svg
id="레이어_1"
data-name="레이어 1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path
d="M18.61,16.55c-0.42,1.03-2.29,1.97-3.12,2.01c-0.83,0.04-0.85,0.64-5.37-1.32c-4.51-1.96-7.23-6.73-7.45-7.04
C2.46,9.9,0.92,7.71,1,5.51c0.08-2.2,1.29-3.24,1.72-3.67c0.43-0.43,0.92-0.51,1.22-0.51c0.36-0.01,0.59-0.01,0.85,0
@ -325,12 +318,7 @@
matTooltipPosition="above"
(click)="onClickOpenChat()"
>
<svg
id="레이어_1"
data-name="레이어 1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path
d="M26.57,14a9.05,9.05,0,0,0-12.82,0,9.07,9.07,0,0,0-.57,12.2,3.57,3.57,0,0,1-1.46,1.61.84.84,0,0,0-.46.89.86.86,0,0,0,.71.71,4.34,4.34,0,0,0,.71.05,5.32,5.32,0,0,0,3.19-1.06A9.07,9.07,0,0,0,26.57,14Z"
transform="translate(-11.09 -11.32)"
@ -340,7 +328,6 @@
transform="translate(-11.09 -11.32)"
/>
<path
class="cls-1"
d="M20.16,19.75a.64.64,0,1,0,.64.64.64.64,0,0,0-.64-.64Z"
transform="translate(-11.09 -11.32)"
/>
@ -366,6 +353,24 @@
}}</span>
</div>
<div class="button-text-item" *ngIf="!isMe && !!enableElephantButton">
<button
mat-mini-fab
class="mat-elevation-z btn-elephant"
matTooltip="칭찬 코끼리 보내기"
(click)="onClickSendElephant()"
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 24.49">
<path
d="M31.91,13.4a12.78,12.78,0,0,0-12-8.64A12.63,12.63,0,0,0,7.42,15.53c0,.34-.16,1-.41.79,0,0-1.59-.8-.36-3.26l-4.35-2s-2.63,3.69-.41,7.22a6.39,6.39,0,0,0,6,3l.15.49q.25.66.57,1.29a13.62,13.62,0,0,0,6.66,6.06c.92.41.9-.63.9-.63V27.37a3.83,3.83,0,0,1,7.65,0v.91s.07,1.12.7.87c2.54-1,5.11-2.95,5.93-5.86l.18.74c.31,1.83.33,3.37.91,2.46C33.92,22.87,32.89,16.18,31.91,13.4Zm-20-.3a1,1,0,1,1,1-1A1,1,0,0,1,11.91,13.1Zm11.62,5.76c-5.76,5.3-9-1.34-8.8-5,.14-2.3,1.73-5.05,6.47-6C25.74,7.08,29.28,13.56,23.53,18.86Z"
transform="translate(-1 -4.76)"
style="fill:#fff"
/>
</svg>
</button>
<span class="button-text">칭찬코끼리</span>
</div>
<div class="button-text-item" *ngIf="!isMe">
<button
mat-mini-fab
@ -384,7 +389,7 @@
</button>
<span class="button-text">{{ 'profile.fieldSMS' | translate }}</span>
</div>
<!--화상
<div
class="button-text-item"
*ngIf="!isMe && !!authInfo && authInfo.canVideoConference"
@ -407,32 +412,7 @@
'profile.fieldVideoConference' | translate
}}</span>
</div>
<!-- <div class="button-text-item" *ngIf="!!enableElephantButton">
<button
mat-mini-fab
class="mat-elevation-z bg-accent-darkest"
*ngIf="!isMe"
matTooltip="칭찬 코끼리"
matTooltipPosition="above"
(click)="onClickSendElephant()"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 30 30"
stroke-width="1.5"
stroke="#357abc"
fill="#98d7e2"
>
<path
d="M29,17.3a21.32,21.32,0,0,0-.63-4.39A10.59,10.59,0,0,0,28,11.85c0-.14-.1-.27-.15-.41l-.16-.39a13,13,0,0,0-.81-1.52,11.29,11.29,0,0,0-1.59-2c-.2-.2-.4-.4-.62-.58s-.43-.36-.66-.53a10.83,10.83,0,0,0-1.82-1.09l-.39-.18c-.26-.11-.53-.21-.81-.31A11.06,11.06,0,0,0,6.62,13.71l0,.09v0s0,.07,0,.1v0a.52.52,0,0,0,0,.11h0a.43.43,0,0,1,0,.11h0a.32.32,0,0,1,0,.09v0s0,.05,0,.08h0a.1.1,0,0,1,0,0h0l-.05,0h0l0,0a1.42,1.42,0,0,1-.56-.62,1.84,1.84,0,0,1-.13-1.17A4,4,0,0,1,6,11.55L2.14,9.83h0a6.75,6.75,0,0,0-.84,1.78c-.05.14-.09.29-.13.45A6.18,6.18,0,0,0,1,13.31a5,5,0,0,0,.78,2.84c.08.13.17.26.26.38l.06.08c.09.11.17.22.27.33l0,0,.26.28.07.06.28.25,0,0a2.48,2.48,0,0,0,.26.19l.06,0,.3.19.05,0,.27.14.06,0,.29.13.06,0,.25.09,0,0,.29.09h.06l.24.06h0l.26.05h0l.23,0h0l.23,0h.94l.13.43c.07.19.15.38.23.57s.17.38.27.56a11.26,11.26,0,0,0,1,1.51c.13.16.25.32.39.48a5.34,5.34,0,0,0,.39.44A11.78,11.78,0,0,0,10.9,24.1c.27.2.54.39.83.57a11.72,11.72,0,0,0,1.78,1l.16.06h.19l.13,0h0l.1-.06h0a.39.39,0,0,0,.08-.1h0l.05-.11v0l0-.1h0s0-.06,0-.09v-.08h0v-1a3.27,3.27,0,0,1,.41-1.59,3.36,3.36,0,0,1,2.94-1.76h0a3.31,3.31,0,0,1,1,.16l.3.11a3.15,3.15,0,0,1,.57.31,2.48,2.48,0,0,1,.26.19A3.34,3.34,0,0,1,21,24.08v.79h0v.29l0,0v0a.43.43,0,0,1,0,0v0a.25.25,0,0,0,0,.07h0a.21.21,0,0,0,0,.06v0l0,0,0,0,0,0,0,0,0,0h.18l.09,0a11,11,0,0,0,1.65-.82c.27-.16.53-.34.78-.52a10.65,10.65,0,0,0,1.07-.93c.11-.12.22-.23.32-.35a7.25,7.25,0,0,0,.58-.76l.24-.4a6.43,6.43,0,0,0,.41-.88l.15-.46.15.64c0,.09,0,.18.05.27v.09l0,.18v.1l0,.19V22l0,.2v.05l0,.2v.07c0,.05,0,.09,0,.14v.07a.69.69,0,0,1,0,.13V23a.94.94,0,0,1,0,.16v0a.56.56,0,0,0,0,.12v0l0,.08v0l0,.06,0,0a.1.1,0,0,0,.05,0h.07l.05,0s0,0,0,0a.12.12,0,0,0,.05,0l0,0a.52.52,0,0,0,.08-.11A9.41,9.41,0,0,0,29,18.52C29,18.12,29,17.71,29,17.3ZM10.55,11.59a.86.86,0,1,1,0-1.71.85.85,0,0,1,.85.85A.86.86,0,0,1,10.55,11.59Zm9.79,4.79A5.27,5.27,0,0,1,17,18.07a2.67,2.67,0,0,1-2-.95,7.21,7.21,0,0,1-1.69-4.84c.07-1.18.76-4,5.58-4.94a4.18,4.18,0,0,1,.61,0v0a3.43,3.43,0,0,1,3.11,2.29C23.5,11.73,22.63,14.27,20.34,16.38Z"
transform="translate(-1 -4.29)"
/>
</svg>
</button>
<span class="button-text">칭찬 코끼리</span>
</div> -->
-->
<div class="button-text-item" *ngIf="!isMe">
<button
mat-mini-fab

View File

@ -33,7 +33,6 @@ $login-max-height: 800px;
.mat-card.profile {
display: flex;
min-width: 600px;
flex-flow: row;
flex: 0 0 auto;
width: 100%;
@ -228,6 +227,7 @@ $login-max-height: 800px;
}
}
/* 프로필사진 옆에 보여줄때
.btn-elephant {
position: absolute;
background-color: #ffffff !important;
@ -246,7 +246,7 @@ $login-max-height: 800px;
fill: #ffffff;
}
}
}
}*/
.userInfo-call {
position: relative;
@ -287,6 +287,11 @@ $login-max-height: 800px;
height: 20px;
display: flex;
}
&.btn-elephant {
svg {
width: 24px;
}
}
}
}
.button-text {

View File

@ -18,10 +18,9 @@
animationDuration="0ms"
(selectedTabChange)="onSelectedTabChange($event)"
fxLayout="row"
horizontal
class="theme-list"
>
<mat-tab>
<mat-tab fxLayout="row" fxFlex="0 0 auto">
<ng-template mat-tab-label class="theme-item">
<div class="theme-box default-theme"></div>
<div class="theme-name">

View File

@ -23,33 +23,6 @@
}
}
::ng-deep .theme-list {
.mat-tab-header {
width: 100%;
border: none !important;
.mat-tab-labels {
position: relative;
width: 100%;
flex-direction: row !important;
.mat-tab-label {
width: 140px;
height: 120px;
&.mat-tab-label-active {
opacity: 1;
}
.mat-tab-label-content {
position: relative;
flex-flow: column;
width: 100%;
}
}
}
}
.mat-tab-body-wrapper {
border: none !important;
}
}
.theme-box {
width: 140px;
height: 98px;
@ -75,3 +48,6 @@
position: relative;
padding-top: 10px;
}
.theme-item {
height: 100%;
}

View File

@ -66,6 +66,10 @@
color: #444444;
}
}
.mat-card-content {
position: relative;
height: calc(100% - 50px);
}
.button-form {
text-align: right;
.mat-primary {
@ -74,13 +78,55 @@
}
}
.cdk-overlay-container {
.cdk-global-overlay-wrapper {
.cdk-overlay-pane {
//max-width: 90vw !important;
.mat-dialog-container {
overflow: hidden;
}
//기본 다이얼로그
.cdk-overlay-pane {
max-width: 90vw;
max-height: 94vh;
.mat-dialog-container {
position: relative;
width: 800px;
height: 90vh;
@media screen and (max-width: 1000px) {
width: 800px;
height: 90vh;
}
@media screen and (max-width: 800px) {
width: 90vw;
height: 94vh;
}
& > .mat-card {
width: 100%;
height: 100%;
}
}
}
//통합검색
.fullSize-dialog {
width: 90vw;
height: 94vh;
.mat-dialog-container {
position: relative;
width: 100%;
height: 100%;
}
}
//confirm-dialog
.miniSize-dialog {
width: 400px;
height: 260px;
.mat-dialog-container {
position: relative;
width: 100%;
height: 100%;
}
}
//viwer-dialog
.app-dialog-full {
.mat-dialog-container {
width: 100%;
height: 100%;
}
}

View File

@ -20,3 +20,26 @@ body:not(.is-mobile) {
border-radius: 12px;
}
}
.cdk-virtual-scroll-orientation-vertical {
.cdk-virtual-scroll-content-wrapper {
width: 100%;
height: 100%;
contain: none;
}
}
perfect-scrollbar {
.ps-content {
position: inherit;
width: inherit;
height: inherit;
}
}
.ps__rail-y {
left: auto !important;
& > .ps__thumb-y {
margin-right: -2px;
}
}

View File

@ -30,18 +30,15 @@
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="butt"
stroke-linejoin="round"
viewBox="0 0 20 19.01"
width="20"
height="20"
fill="currentColor"
>
<path
d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"
<polygon
points="12.01 9 11.96 0 7.96 0.02 8.01 9.02 3.01 9.05 10.04 15.01 17.01 8.97 12.01 9"
/>
<rect y="17.01" width="20" height="2" />
</svg>
</button>
<button
@ -52,21 +49,22 @@
aria-label=""
(click)="onClickSaveAs()"
>
<!--<mat-icon>get_app</mat-icon>-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="butt"
stroke-linejoin="round"
width="24"
height="24"
fill="currentColor"
>
<path
d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"
d="M10.2,18.6l0.7,2.9l2.9-0.7l6.3-10.6l-3.5-2.2L10.2,18.6z M21.4,6.4L19.3,5c-0.2-0.1-0.4-0.1-0.6-0.1
c-0.2,0-0.3,0.2-0.5,0.3l-1,1.7l3.5,2.2l1.1-1.8C22,7,21.9,6.6,21.4,6.4z"
/>
<g>
<polygon class="st0" points="7.1,15.4 12.9,10.4 1.4,10.4 " />
<rect x="5.5" y="2.9" class="st0" width="3.3" height="7.5" />
</g>
<rect x="1.4" y="16.6" class="st0" width="8.2" height="2" />
</svg>
</button>
<span class="stroke-bar"></span>

View File

@ -31,7 +31,6 @@
<span class="ucap-image-viewer-spacer"></span>
<button
*ngIf="!imageOnly"
mat-icon-button
class="ucap-image-viewer-action"
matTooltip="{{ 'common.messages.zoomReset' | translate }}"
@ -58,7 +57,6 @@
</svg>
</button>
<button
*ngIf="!imageOnly"
mat-icon-button
class="ucap-image-viewer-action"
matTooltip="{{ 'common.messages.zoomOut' | translate }}"
@ -84,7 +82,6 @@
</svg>
</button>
<button
*ngIf="!imageOnly"
mat-icon-button
class="ucap-image-viewer-action"
matTooltip="{{ 'common.messages.zoomIn' | translate }}"
@ -110,6 +107,7 @@
<line x1="8" y1="11" x2="14" y2="11"></line>
</svg>
</button>
<button
*ngIf="!imageOnly"
mat-icon-button
@ -119,23 +117,20 @@
aria-label=""
(click)="onClickDownload()"
>
<!--<mat-icon>get_app</mat-icon>-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="butt"
stroke-linejoin="round"
viewBox="0 0 20 19.01"
width="20"
height="20"
fill="currentColor"
>
<path
d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"
<polygon
points="12.01 9 11.96 0 7.96 0.02 8.01 9.02 3.01 9.05 10.04 15.01 17.01 8.97 12.01 9"
/>
<rect y="17.01" width="20" height="2" />
</svg>
</button>
<button
*ngIf="!imageOnly"
mat-icon-button
@ -145,21 +140,22 @@
aria-label=""
(click)="onClickSaveAs()"
>
<!--<mat-icon>get_app</mat-icon>-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="butt"
stroke-linejoin="round"
width="24"
height="24"
fill="currentColor"
>
<path
d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"
d="M10.2,18.6l0.7,2.9l2.9-0.7l6.3-10.6l-3.5-2.2L10.2,18.6z M21.4,6.4L19.3,5c-0.2-0.1-0.4-0.1-0.6-0.1
c-0.2,0-0.3,0.2-0.5,0.3l-1,1.7l3.5,2.2l1.1-1.8C22,7,21.9,6.6,21.4,6.4z"
/>
<g>
<polygon class="st0" points="7.1,15.4 12.9,10.4 1.4,10.4 " />
<rect x="5.5" y="2.9" class="st0" width="3.3" height="7.5" />
</g>
<rect x="1.4" y="16.6" class="st0" width="8.2" height="2" />
</svg>
</button>
<span class="stroke-bar"></span>
@ -212,11 +208,15 @@
<ng-template #imageOnlyImg>
<img
ucapImage
#downloadImage
[base]="imageOnlyData.imageRootUrl"
[path]="imageOnlyData.imageUrl"
[default]="imageOnlyData.defaultImage"
style="cursor: pointer; width: auto;"
style="cursor: pointer;"
[style.width]="'auto'"
[style.height]="imageHeight + 'px'"
(click)="onClickClose()"
(load)="onLoadFileDownloadUrl(downloadImage)"
/>
</ng-template>
<ng-template #defaultImg>

View File

@ -11,21 +11,17 @@
aria-label=""
(click)="onClickDownload()"
>
<!--<mat-icon>get_app</mat-icon>-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="butt"
stroke-linejoin="round"
viewBox="0 0 20 19.01"
width="20"
height="20"
fill="currentColor"
>
<path
d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"
<polygon
points="12.01 9 11.96 0 7.96 0.02 8.01 9.02 3.01 9.05 10.04 15.01 17.01 8.97 12.01 9"
/>
<rect y="17.01" width="20" height="2" />
</svg>
</button>
<button
@ -36,21 +32,22 @@
aria-label=""
(click)="onClickSaveAs()"
>
<!--<mat-icon>get_app</mat-icon>-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="butt"
stroke-linejoin="round"
width="24"
height="24"
fill="currentColor"
>
<path
d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"
d="M10.2,18.6l0.7,2.9l2.9-0.7l6.3-10.6l-3.5-2.2L10.2,18.6z M21.4,6.4L19.3,5c-0.2-0.1-0.4-0.1-0.6-0.1
c-0.2,0-0.3,0.2-0.5,0.3l-1,1.7l3.5,2.2l1.1-1.8C22,7,21.9,6.6,21.4,6.4z"
/>
<g>
<polygon class="st0" points="7.1,15.4 12.9,10.4 1.4,10.4 " />
<rect x="5.5" y="2.9" class="st0" width="3.3" height="7.5" />
</g>
<rect x="1.4" y="16.6" class="st0" width="8.2" height="2" />
</svg>
</button>
<span class="stroke-bar"></span>

View File

@ -32,21 +32,17 @@
aria-label=""
(click)="onClickDownload()"
>
<!--<mat-icon>get_app</mat-icon>-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="butt"
stroke-linejoin="round"
viewBox="0 0 20 19.01"
width="20"
height="20"
fill="currentColor"
>
<path
d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"
<polygon
points="12.01 9 11.96 0 7.96 0.02 8.01 9.02 3.01 9.05 10.04 15.01 17.01 8.97 12.01 9"
/>
<rect y="17.01" width="20" height="2" />
</svg>
</button>
<button
@ -57,21 +53,22 @@
aria-label=""
(click)="onClickSaveAs()"
>
<!--<mat-icon>get_app</mat-icon>-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="butt"
stroke-linejoin="round"
width="24"
height="24"
fill="currentColor"
>
<path
d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"
d="M10.2,18.6l0.7,2.9l2.9-0.7l6.3-10.6l-3.5-2.2L10.2,18.6z M21.4,6.4L19.3,5c-0.2-0.1-0.4-0.1-0.6-0.1
c-0.2,0-0.3,0.2-0.5,0.3l-1,1.7l3.5,2.2l1.1-1.8C22,7,21.9,6.6,21.4,6.4z"
/>
<g>
<polygon class="st0" points="7.1,15.4 12.9,10.4 1.4,10.4 " />
<rect x="5.5" y="2.9" class="st0" width="3.3" height="7.5" />
</g>
<rect x="1.4" y="16.6" class="st0" width="8.2" height="2" />
</svg>
</button>
<span class="stroke-bar"></span>

View File

@ -1,4 +1,4 @@
<div fxLayout="column" fxFlex="1 1 auto" class="rightDrawer-notice">
<div fxLayout="column" fxFlex="1 1 auto" class="integrated-search-frame">
<div class="search-area">
<ucap-integrated-search-form
[searchWord]="!!searchWord ? searchWord : ''"

View File

@ -57,6 +57,7 @@
width: 100%;
overflow: hidden;
display: flex;
height: calc(100% - 160px);
table {
table-layout: fixed;
width: 100%;

View File

@ -1,49 +1,15 @@
$tablet-l-width: 1024px;
$tablet-s-width: 768px;
::ng-deep .sticker-selector {
height: 210px;
border-top: 1px solid #cccccc;
.mat-tab-header {
.mat-tab-label {
//padding: 0 10px;
min-width: 16%;
}
}
.mat-tab-body-wrapper {
height: 150px !important;
overflow: auto;
}
@media screen and (max-width: #{$tablet-s-width}) {
height: 180px;
.mat-tab-body-wrapper {
height: 130px;
}
}
}
.sticker-item-box {
flex-wrap: wrap;
padding: 10px 20px 0;
overflow: auto;
.sticker-item {
width: 60px;
margin-bottom: 10px;
display: inline-flex;
cursor: pointer;
}
}
@media screen and (max-width: #{$tablet-s-width}) {
.sticker-item-box {
.sticker-item {
width: 50px;
}
.sticker-selector {
.mat-tab-group {
height: 200px;
}
}
.selected-sticker {
height: 80px;
border-top: 1px solid #cccccc;
position: relative;
padding: 10px 20px;
text-align: right;
@ -60,3 +26,27 @@ $tablet-s-width: 768px;
color: #ffffff;
}
}
.sticker-item-box {
flex-wrap: wrap;
padding: 10px 20px 0;
overflow: auto;
height: 150px !important;
overflow: auto;
@media screen and (max-width: #{$tablet-s-width}) {
height: 130px;
}
.sticker-item {
width: 60px;
height: 60px;
margin-bottom: 10px;
display: inline-flex;
cursor: pointer;
@media screen and (max-width: #{$tablet-s-width}) {
width: 50px;
height: 50px;
}
}
}

View File

@ -9,10 +9,10 @@
<div #messageContainer class="notice">
{{ data.message }}
</div>
<mat-card-actions class="button-form flex-row">
<button mat-flat-button (click)="onClickConfirm()" class="mat-primary">
{{ 'common.messages.confirm' | translate }}
</button>
</mat-card-actions>
</mat-card-content>
<mat-card-actions class="button-form flex-row">
<button mat-stroked-button (click)="onClickConfirm()" class="mat-primary">
{{ 'common.messages.confirm' | translate }}
</button>
</mat-card-actions>
</mat-card>

View File

@ -1,5 +1,14 @@
form {
.mat-form-field {
width: 100%;
.confirm-card {
width: 100%;
height: 100%;
.mat-card-content {
display: flex;
flex-flow: column;
.mat-card-actions {
display: flex;
align-self: flex-end;
flex-flow: row;
margin-top: auto;
}
}
}

View File

@ -14,17 +14,17 @@
<div #messageContainer class="notice">
{{ data.message }}
</div>
<mat-card-actions *ngIf="!hideAction" class="button-form flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.no' | translate }}
</button>
<button mat-flat-button (click)="onClickChoice(true)" class="mat-primary">
{{ 'common.messages.yes' | translate }}
</button>
</mat-card-actions>
</mat-card-content>
<mat-card-actions *ngIf="!hideAction" class="button-form flex-row">
<button
mat-stroked-button
(click)="onClickChoice(false)"
class="mat-primary"
>
{{ 'common.messages.no' | translate }}
</button>
<button mat-flat-button (click)="onClickChoice(true)" class="mat-primary">
{{ 'common.messages.yes' | translate }}
</button>
</mat-card-actions>
</mat-card>

View File

@ -1,18 +1,27 @@
.mat-card-header {
.mat-card-header-text {
margin: 0;
}
.btn-dialog-close {
font-size: 20px;
display: flex;
margin-left: auto;
align-self: flex-start;
color: #444444;
}
}
.confirm-card {
width: 100%;
height: 100%;
form {
.mat-form-field {
width: 100%;
.mat-card-header {
.mat-card-header-text {
margin: 0;
}
.btn-dialog-close {
font-size: 20px;
display: flex;
margin-left: auto;
align-self: flex-start;
color: #444444;
}
}
.mat-card-content {
display: flex;
flex-flow: column;
.mat-card-actions {
display: flex;
align-self: flex-end;
flex-flow: row;
margin-top: auto;
}
}
}