Merge branch 'master' of https://git.loafle.net/ucap-web/next-ucap-messenger
This commit is contained in:
commit
ddb52c3fb4
|
@ -28,7 +28,8 @@ import {
|
||||||
NotificationChannel,
|
NotificationChannel,
|
||||||
ChatChannel,
|
ChatChannel,
|
||||||
MessengerChannel,
|
MessengerChannel,
|
||||||
MessageChannel
|
MessageChannel,
|
||||||
|
AppChannel
|
||||||
} from '@ucap-webmessenger/native-electron';
|
} from '@ucap-webmessenger/native-electron';
|
||||||
import { ElectronNotificationService } from '@ucap-webmessenger/electron-notification';
|
import { ElectronNotificationService } from '@ucap-webmessenger/electron-notification';
|
||||||
import { ElectronUpdateWindowService } from '@ucap-webmessenger/electron-update-window';
|
import { ElectronUpdateWindowService } from '@ucap-webmessenger/electron-update-window';
|
||||||
|
@ -231,8 +232,7 @@ function createTray() {
|
||||||
// selector: 'terminate:',
|
// selector: 'terminate:',
|
||||||
click: () => {
|
click: () => {
|
||||||
// 메신저에 로그아웃 후 종료
|
// 메신저에 로그아웃 후 종료
|
||||||
appWindow = null;
|
appExit();
|
||||||
app.exit();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
@ -715,6 +715,10 @@ ipcMain.on(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ipcMain.on(AppChannel.Exit, (event: IpcMainEvent, ...args: any[]) => {
|
||||||
|
appExit();
|
||||||
|
});
|
||||||
|
|
||||||
autoUpdater.on('checking-for-update', () => {
|
autoUpdater.on('checking-for-update', () => {
|
||||||
log.info('Checking for update...');
|
log.info('Checking for update...');
|
||||||
});
|
});
|
||||||
|
@ -748,3 +752,8 @@ autoUpdater.on('update-downloaded', info => {
|
||||||
updateWindowService.setDownloadComplete();
|
updateWindowService.setDownloadComplete();
|
||||||
autoUpdater.quitAndInstall(true, true);
|
autoUpdater.quitAndInstall(true, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function appExit() {
|
||||||
|
appWindow = null;
|
||||||
|
app.exit();
|
||||||
|
}
|
||||||
|
|
|
@ -563,7 +563,8 @@ export class GroupComponent implements OnInit, OnDestroy {
|
||||||
>(SelectGroupDialogComponent, {
|
>(SelectGroupDialogComponent, {
|
||||||
width: '600px',
|
width: '600px',
|
||||||
data: {
|
data: {
|
||||||
title: this.translateService.instant('group.selectTargetGroup')
|
title: this.translateService.instant('group.selectTargetGroup'),
|
||||||
|
ignoreGroup: [group]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -88,10 +88,10 @@
|
||||||
</mat-tab-group>
|
</mat-tab-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div [style.display]="isSearch ? 'block' : 'none'">
|
<div class="message-section" [style.display]="isSearch ? 'block' : 'none'">
|
||||||
<div class="search-sub">
|
<div class="search-sub">
|
||||||
<form [formGroup]="fgSearchType" class="w-100-p">
|
<form [formGroup]="fgSearchType" class="w-100-p">
|
||||||
<mat-form-field>
|
<mat-form-field style="width: 100px;">
|
||||||
<mat-select
|
<mat-select
|
||||||
formControlName="searchMessageType"
|
formControlName="searchMessageType"
|
||||||
(selectionChange)="onChangeSelection($event)"
|
(selectionChange)="onChangeSelection($event)"
|
||||||
|
@ -127,13 +127,15 @@
|
||||||
</mat-radio-group>
|
</mat-radio-group>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div style="height: calc(100% - 65.5px)">
|
||||||
|
<perfect-scrollbar fxFlex="1 1 auto">
|
||||||
<ucap-message-list-item
|
<ucap-message-list-item
|
||||||
*ngFor="let message of messageSearchList$ | async"
|
*ngFor="let message of messageSearchList$ | async"
|
||||||
[message]="message"
|
[message]="message"
|
||||||
(click)="onClickDetail(message)"
|
(click)="onClickDetail(message)"
|
||||||
class="message-item"
|
class="message-item"
|
||||||
></ucap-message-list-item>
|
></ucap-message-list-item>
|
||||||
|
</perfect-scrollbar>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -81,6 +81,7 @@
|
||||||
(click)="onToggleUser(userInfo)"
|
(click)="onToggleUser(userInfo)"
|
||||||
(contextmenu)="onContextMenuOrgUser($event, userInfo)"
|
(contextmenu)="onContextMenuOrgUser($event, userInfo)"
|
||||||
[matTooltip]="getTooltip(userInfo)"
|
[matTooltip]="getTooltip(userInfo)"
|
||||||
|
matTooltipShowDelay="500"
|
||||||
matTooltipPosition="after"
|
matTooltipPosition="after"
|
||||||
>
|
>
|
||||||
</ucap-profile-user-list-item>
|
</ucap-profile-user-list-item>
|
||||||
|
@ -105,6 +106,7 @@
|
||||||
(click)="onToggleUser(userInfo)"
|
(click)="onToggleUser(userInfo)"
|
||||||
(contextmenu)="onContextMenuOrgUser($event, userInfo)"
|
(contextmenu)="onContextMenuOrgUser($event, userInfo)"
|
||||||
[matTooltip]="getTooltip(userInfo)"
|
[matTooltip]="getTooltip(userInfo)"
|
||||||
|
matTooltipShowDelay="500"
|
||||||
matTooltipPosition="after"
|
matTooltipPosition="after"
|
||||||
>
|
>
|
||||||
</ucap-profile-user-list-item>
|
</ucap-profile-user-list-item>
|
||||||
|
|
|
@ -638,6 +638,102 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
|
|
||||||
if (!!this.isShowTranslation && this.destLocale.trim().length > 0) {
|
if (!!this.isShowTranslation && this.destLocale.trim().length > 0) {
|
||||||
/** CASE : Translation */
|
/** CASE : Translation */
|
||||||
|
// 번역할 대화 없이 스티커만 전송할 경우.
|
||||||
|
if (!message || message.trim().length === 0) {
|
||||||
|
this.sendMessageOfSticker(message);
|
||||||
|
} else {
|
||||||
|
this.sendMessageOfTranslate(message);
|
||||||
|
}
|
||||||
|
} else if (!!this.selectedSticker) {
|
||||||
|
/** CASE : Sticker */
|
||||||
|
this.sendMessageOfSticker(message);
|
||||||
|
} else if (
|
||||||
|
message.trim().length >
|
||||||
|
environment.productConfig.CommonSetting.masstextLength
|
||||||
|
) {
|
||||||
|
/** CASE : MASS TEXT */
|
||||||
|
this.sendMessageOfMassText(message);
|
||||||
|
} else {
|
||||||
|
/** CASE : Normal Text */
|
||||||
|
this.sendMessageOfNormal(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Send Normal message */
|
||||||
|
sendMessageOfNormal(message: string) {
|
||||||
|
this.store.dispatch(
|
||||||
|
EventStore.send({
|
||||||
|
senderSeq: this.loginResSubject.value.userSeq,
|
||||||
|
req: {
|
||||||
|
roomSeq: this.roomInfoSubject.value.roomSeq,
|
||||||
|
eventType: EventType.Character,
|
||||||
|
sentMessage: message
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/** Send Sticker message */
|
||||||
|
async sendMessageOfSticker(message: string, isCheck: boolean = true) {
|
||||||
|
if (
|
||||||
|
!!isCheck &&
|
||||||
|
!!message &&
|
||||||
|
message.trim().length >
|
||||||
|
environment.productConfig.CommonSetting.masstextLength
|
||||||
|
) {
|
||||||
|
const result = await this.dialogService.open<
|
||||||
|
AlertDialogComponent,
|
||||||
|
AlertDialogData,
|
||||||
|
AlertDialogResult
|
||||||
|
>(AlertDialogComponent, {
|
||||||
|
width: '360px',
|
||||||
|
data: {
|
||||||
|
title: this.translateService.instant('chat.errors.label'),
|
||||||
|
message: this.translateService.instant(
|
||||||
|
'chat.errors.maxLengthOfMassText',
|
||||||
|
{
|
||||||
|
maxLength: environment.productConfig.CommonSetting.masstextLength
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const stickerJson: StickerEventJson = {
|
||||||
|
name: '스티커',
|
||||||
|
file: this.selectedSticker.index,
|
||||||
|
chat: !!message ? message.trim() : ''
|
||||||
|
};
|
||||||
|
this.store.dispatch(
|
||||||
|
EventStore.send({
|
||||||
|
senderSeq: this.loginResSubject.value.userSeq,
|
||||||
|
req: {
|
||||||
|
roomSeq: this.roomInfoSubject.value.roomSeq,
|
||||||
|
eventType: EventType.Sticker,
|
||||||
|
sentMessage: JSON.stringify(stickerJson)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
this.isShowStickerSelector = false;
|
||||||
|
this.setStickerHistory(this.selectedSticker);
|
||||||
|
this.selectedSticker = null;
|
||||||
|
}
|
||||||
|
/** Send Masstext message */
|
||||||
|
sendMessageOfMassText(message: string) {
|
||||||
|
this.store.dispatch(
|
||||||
|
EventStore.sendMass({
|
||||||
|
senderSeq: this.loginResSubject.value.userSeq,
|
||||||
|
req: {
|
||||||
|
roomSeq: this.roomInfoSubject.value.roomSeq,
|
||||||
|
eventType: EventType.MassText,
|
||||||
|
// sentMessage: message.replace(/\n/gi, '\r\n')
|
||||||
|
sentMessage: message
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/** Send Translation message */
|
||||||
|
sendMessageOfTranslate(message: string) {
|
||||||
const destLocale = this.destLocale;
|
const destLocale = this.destLocale;
|
||||||
const original = message;
|
const original = message;
|
||||||
const roomSeq = this.roomInfoSubject.value.roomSeq;
|
const roomSeq = this.roomInfoSubject.value.roomSeq;
|
||||||
|
@ -663,9 +759,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
if (res.statusCode === StatusCode.Success) {
|
if (res.statusCode === StatusCode.Success) {
|
||||||
let sentMessage = '';
|
let sentMessage = '';
|
||||||
let eventType = EventType.Translation;
|
let eventType = EventType.Translation;
|
||||||
let previewObject:
|
let previewObject: TranslationEventJson | MassTranslationEventJson;
|
||||||
| TranslationEventJson
|
|
||||||
| MassTranslationEventJson;
|
|
||||||
|
|
||||||
if (res.translationSeq > 0) {
|
if (res.translationSeq > 0) {
|
||||||
// Mass Text Translation
|
// Mass Text Translation
|
||||||
|
@ -726,80 +820,6 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
.subscribe(() => {
|
.subscribe(() => {
|
||||||
this.isTranslationProcess = false;
|
this.isTranslationProcess = false;
|
||||||
});
|
});
|
||||||
} else if (!!this.selectedSticker) {
|
|
||||||
/** CASE : Sticker */
|
|
||||||
if (
|
|
||||||
!!message &&
|
|
||||||
message.trim().length >
|
|
||||||
environment.productConfig.CommonSetting.masstextLength
|
|
||||||
) {
|
|
||||||
const result = await this.dialogService.open<
|
|
||||||
AlertDialogComponent,
|
|
||||||
AlertDialogData,
|
|
||||||
AlertDialogResult
|
|
||||||
>(AlertDialogComponent, {
|
|
||||||
width: '360px',
|
|
||||||
data: {
|
|
||||||
title: this.translateService.instant('chat.errors.label'),
|
|
||||||
message: this.translateService.instant(
|
|
||||||
'chat.errors.maxLengthOfMassText',
|
|
||||||
{
|
|
||||||
maxLength:
|
|
||||||
environment.productConfig.CommonSetting.masstextLength
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const stickerJson: StickerEventJson = {
|
|
||||||
name: '스티커',
|
|
||||||
file: this.selectedSticker.index,
|
|
||||||
chat: !!message ? message.trim() : ''
|
|
||||||
};
|
|
||||||
this.store.dispatch(
|
|
||||||
EventStore.send({
|
|
||||||
senderSeq: this.loginResSubject.value.userSeq,
|
|
||||||
req: {
|
|
||||||
roomSeq: this.roomInfoSubject.value.roomSeq,
|
|
||||||
eventType: EventType.Sticker,
|
|
||||||
sentMessage: JSON.stringify(stickerJson)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
this.isShowStickerSelector = false;
|
|
||||||
this.setStickerHistory(this.selectedSticker);
|
|
||||||
this.selectedSticker = null;
|
|
||||||
} else if (
|
|
||||||
message.trim().length >
|
|
||||||
environment.productConfig.CommonSetting.masstextLength
|
|
||||||
) {
|
|
||||||
/** CASE : MASS TEXT */
|
|
||||||
this.store.dispatch(
|
|
||||||
EventStore.sendMass({
|
|
||||||
senderSeq: this.loginResSubject.value.userSeq,
|
|
||||||
req: {
|
|
||||||
roomSeq: this.roomInfoSubject.value.roomSeq,
|
|
||||||
eventType: EventType.MassText,
|
|
||||||
// sentMessage: message.replace(/\n/gi, '\r\n')
|
|
||||||
sentMessage: message
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
/** CASE : Normal Text */
|
|
||||||
this.store.dispatch(
|
|
||||||
EventStore.send({
|
|
||||||
senderSeq: this.loginResSubject.value.userSeq,
|
|
||||||
req: {
|
|
||||||
roomSeq: this.roomInfoSubject.value.roomSeq,
|
|
||||||
eventType: EventType.Character,
|
|
||||||
sentMessage: message
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onClickReceiveAlarm() {
|
onClickReceiveAlarm() {
|
||||||
|
@ -1592,6 +1612,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
const trgtUserSeq: number[] = [];
|
const trgtUserSeq: number[] = [];
|
||||||
result.group.userSeqs.map(seq => trgtUserSeq.push(seq));
|
result.group.userSeqs.map(seq => trgtUserSeq.push(seq));
|
||||||
this.userInfoListSubject.value
|
this.userInfoListSubject.value
|
||||||
|
.filter(v => v.isJoinRoom)
|
||||||
.filter(v => result.group.userSeqs.indexOf(v.seq) < 0)
|
.filter(v => result.group.userSeqs.indexOf(v.seq) < 0)
|
||||||
.forEach(user => {
|
.forEach(user => {
|
||||||
trgtUserSeq.push(user.seq);
|
trgtUserSeq.push(user.seq);
|
||||||
|
|
|
@ -63,6 +63,7 @@
|
||||||
<mat-list-option
|
<mat-list-option
|
||||||
*ngFor="let groupBuddy of groupBuddyList$ | async"
|
*ngFor="let groupBuddy of groupBuddyList$ | async"
|
||||||
[value]="groupBuddy.group"
|
[value]="groupBuddy.group"
|
||||||
|
[disabled]="getDisabled(groupBuddy)"
|
||||||
class="group-name"
|
class="group-name"
|
||||||
>
|
>
|
||||||
<span class="title-name ellipsis"> {{ groupBuddy.group.name }} </span>
|
<span class="title-name ellipsis"> {{ groupBuddy.group.name }} </span>
|
||||||
|
|
|
@ -24,6 +24,7 @@ import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
export interface SelectGroupDialogData {
|
export interface SelectGroupDialogData {
|
||||||
title: string;
|
title: string;
|
||||||
|
ignoreGroup?: GroupDetailData[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SelectGroupDialogResult {
|
export interface SelectGroupDialogResult {
|
||||||
|
@ -71,6 +72,44 @@ export class SelectGroupDialogComponent implements OnInit {
|
||||||
)
|
)
|
||||||
]).pipe(
|
]).pipe(
|
||||||
map(([buddyList, groupList]) => {
|
map(([buddyList, groupList]) => {
|
||||||
|
// sort..
|
||||||
|
if (!!groupList && groupList.length > 0) {
|
||||||
|
const tempOrderArr: GroupDetailData[] = [];
|
||||||
|
let myDeptGroup: GroupDetailData;
|
||||||
|
let defaultGroup: GroupDetailData;
|
||||||
|
const normalGroup: GroupDetailData[] = [];
|
||||||
|
|
||||||
|
groupList.forEach(group => {
|
||||||
|
if (
|
||||||
|
!!environment.productConfig.CommonSetting.useMyDeptGroup &&
|
||||||
|
environment.productConfig.CommonSetting.myDeptGroupSeq ===
|
||||||
|
group.seq
|
||||||
|
) {
|
||||||
|
myDeptGroup = group;
|
||||||
|
} else if (0 === group.seq) {
|
||||||
|
defaultGroup = group;
|
||||||
|
} else {
|
||||||
|
normalGroup.push(group);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!!myDeptGroup) {
|
||||||
|
tempOrderArr.push(myDeptGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
tempOrderArr.push(
|
||||||
|
...normalGroup.sort((a, b) =>
|
||||||
|
a.name < b.name ? -1 : a.name > b.name ? 1 : 0
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!!defaultGroup) {
|
||||||
|
tempOrderArr.push(defaultGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
groupList = tempOrderArr;
|
||||||
|
}
|
||||||
|
|
||||||
/** 수정불가 그룹 */
|
/** 수정불가 그룹 */
|
||||||
let fixedGroupSeqs: number[];
|
let fixedGroupSeqs: number[];
|
||||||
if (!!environment.productConfig.CommonSetting.fixedGroupSeqs) {
|
if (!!environment.productConfig.CommonSetting.fixedGroupSeqs) {
|
||||||
|
@ -90,6 +129,17 @@ export class SelectGroupDialogComponent implements OnInit {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 선택 무시 그룹 필터링. */
|
||||||
|
if (!!this.data.ignoreGroup && this.data.ignoreGroup.length > 0) {
|
||||||
|
if (
|
||||||
|
this.data.ignoreGroup.filter(
|
||||||
|
groupDetail => groupDetail.seq === group.seq
|
||||||
|
).length > 0
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
groupBuddyList.push({
|
groupBuddyList.push({
|
||||||
group,
|
group,
|
||||||
buddyList: buddyList.filter(buddy => {
|
buddyList: buddyList.filter(buddy => {
|
||||||
|
@ -140,4 +190,18 @@ export class SelectGroupDialogComponent implements OnInit {
|
||||||
group: this.selectedGroup
|
group: this.selectedGroup
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getDisabled(groupBuddyList: {
|
||||||
|
group: GroupDetailData;
|
||||||
|
buddyList: UserInfo[];
|
||||||
|
}): boolean {
|
||||||
|
if (!!this.data.ignoreGroup && this.data.ignoreGroup.length > 0) {
|
||||||
|
return (
|
||||||
|
this.data.ignoreGroup.filter(
|
||||||
|
groupDetail => groupDetail.seq === groupBuddyList.group.seq
|
||||||
|
).length > 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,7 +257,8 @@
|
||||||
yPosition="below"
|
yPosition="below"
|
||||||
(closed)="onClosedProfileMenu($event)"
|
(closed)="onClosedProfileMenu($event)"
|
||||||
>
|
>
|
||||||
<div class="setting">
|
<ng-template matMenuContent>
|
||||||
|
<div class="setting" style="width: 200px;">
|
||||||
<button mat-menu-item [matMenuTriggerFor]="presenseMenu">
|
<button mat-menu-item [matMenuTriggerFor]="presenseMenu">
|
||||||
<ng-container [ngSwitch]="myStatus.pcStatus">
|
<ng-container [ngSwitch]="myStatus.pcStatus">
|
||||||
<ng-container *ngSwitchCase="StatusCode.OnLine">
|
<ng-container *ngSwitchCase="StatusCode.OnLine">
|
||||||
|
@ -324,9 +325,16 @@
|
||||||
{{ 'accounts.logout' | translate }}
|
{{ 'accounts.logout' | translate }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="setting">
|
||||||
|
<button mat-menu-item (click)="onClickQuit()">
|
||||||
|
{{ 'common.messages.quit' | translate }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
|
||||||
<mat-menu #presenseMenu="matMenu" class="status-pc-set">
|
<mat-menu #presenseMenu="matMenu" class="status-pc-set">
|
||||||
|
<ng-template matMenuContent>
|
||||||
<div class="setting">
|
<div class="setting">
|
||||||
<button mat-menu-item (click)="onClickStatusOnline($event)">
|
<button mat-menu-item (click)="onClickStatusOnline($event)">
|
||||||
<span class="presence pcOn"> </span>
|
<span class="presence pcOn"> </span>
|
||||||
|
@ -419,22 +427,30 @@
|
||||||
</ucap-inline-edit-input>
|
</ucap-inline-edit-input>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
</ng-template>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
|
||||||
<mat-menu #awayTimeMenu="matMenu">
|
<mat-menu #awayTimeMenu="matMenu">
|
||||||
|
<ng-template matMenuContent>
|
||||||
<div mat-menu-item (click)="$event.stopPropagation()">
|
<div mat-menu-item (click)="$event.stopPropagation()">
|
||||||
{{ 'presence.settingOfAwayTime' | translate }}
|
{{ 'presence.settingOfAwayTime' | translate }}
|
||||||
</div>
|
</div>
|
||||||
<mat-radio-group aria-label="Select an option" [value]="myIdleCheckTime">
|
<mat-radio-group aria-label="Select an option" [value]="myIdleCheckTime">
|
||||||
<div mat-menu-item *ngFor="let awayTime of awayTimeList">
|
<div mat-menu-item *ngFor="let awayTime of awayTimeList">
|
||||||
<mat-radio-button [value]="awayTime" (change)="onChangeAwayTime($event)">
|
<mat-radio-button
|
||||||
{{ awayTime }}{{ 'common.units.minute' | translate }}</mat-radio-button
|
[value]="awayTime"
|
||||||
|
(change)="onChangeAwayTime($event)"
|
||||||
|
>
|
||||||
|
{{ awayTime
|
||||||
|
}}{{ 'common.units.minute' | translate }}</mat-radio-button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</mat-radio-group>
|
</mat-radio-group>
|
||||||
|
</ng-template>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
|
||||||
<mat-menu #informationMenu="matMenu">
|
<mat-menu #informationMenu="matMenu">
|
||||||
|
<<<<<<< HEAD
|
||||||
<div
|
<div
|
||||||
class="version-info-container menu-item"
|
class="version-info-container menu-item"
|
||||||
(click)="$event.stopPropagation()"
|
(click)="$event.stopPropagation()"
|
||||||
|
@ -461,8 +477,45 @@
|
||||||
<span class="version-info-button">
|
<span class="version-info-button">
|
||||||
<button *ngIf="checkingUpdateIsExist" mat-flat-button
|
<button *ngIf="checkingUpdateIsExist" mat-flat-button
|
||||||
class="mat-primary" (click)="onClickApplyUpdate($event)">{{ 'information.applyUpdates' | translate }}</button>
|
class="mat-primary" (click)="onClickApplyUpdate($event)">{{ 'information.applyUpdates' | translate }}</button>
|
||||||
|
=======
|
||||||
|
<ng-template matMenuContent>
|
||||||
|
<div
|
||||||
|
class="version-info-container menu-item"
|
||||||
|
(click)="$event.stopPropagation()"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span>
|
||||||
|
{{ 'information.installedVersion' | translate }}:{{ appVersion }}
|
||||||
|
>>>>>>> 86c2a7cb2a2195023425b1653f1cc8472b09a8d9
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div *ngIf="checkingUpdate">
|
||||||
|
<div *ngIf="checkingUpdateIsProcessing" style="display: flex;">
|
||||||
|
<mat-spinner
|
||||||
|
*ngIf="checkingUpdate && checkingUpdateIsProcessing"
|
||||||
|
diameter="20"
|
||||||
|
strokeWidth="1"
|
||||||
|
></mat-spinner>
|
||||||
|
{{ 'information.checkForUpdatesInProgress' | translate }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div *ngIf="!checkingUpdateIsProcessing" style="display: flex;">
|
||||||
|
<span>
|
||||||
|
{{ 'information.latestVersion' | translate }}:{{
|
||||||
|
checkingUpdateAppVersion
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
<button
|
||||||
|
*ngIf="checkingUpdateIsExist"
|
||||||
|
mat-button
|
||||||
|
(click)="onClickApplyUpdate($event)"
|
||||||
|
>
|
||||||
|
{{ 'information.applyUpdates' | translate }}
|
||||||
|
</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</ng-template>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
|
|
@ -309,6 +309,10 @@ export class TopBarComponent implements OnInit, OnDestroy {
|
||||||
this.store.dispatch(AuthenticationStore.logoutConfirmation());
|
this.store.dispatch(AuthenticationStore.logoutConfirmation());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onClickQuit(): void {
|
||||||
|
this.nativeService.appExit();
|
||||||
|
}
|
||||||
|
|
||||||
getMyProfileImageWidget(): string {
|
getMyProfileImageWidget(): string {
|
||||||
if (!!this.loginRes) {
|
if (!!this.loginRes) {
|
||||||
return this.loginRes.userInfo.profileImageFile;
|
return this.loginRes.userInfo.profileImageFile;
|
||||||
|
|
|
@ -406,6 +406,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"messages": {
|
"messages": {
|
||||||
|
"quit": "Quit",
|
||||||
"yes": "Yes",
|
"yes": "Yes",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
"confirm": "Confirm",
|
"confirm": "Confirm",
|
||||||
|
|
|
@ -406,6 +406,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"messages": {
|
"messages": {
|
||||||
|
"quit": "종료",
|
||||||
"yes": "예",
|
"yes": "예",
|
||||||
"no": "아니오",
|
"no": "아니오",
|
||||||
"confirm": "확인",
|
"confirm": "확인",
|
||||||
|
|
|
@ -221,6 +221,8 @@ export class BrowserNativeService extends NativeService {
|
||||||
|
|
||||||
windowMaximize(): void {}
|
windowMaximize(): void {}
|
||||||
|
|
||||||
|
appExit(): void {}
|
||||||
|
|
||||||
zoomTo(factor: number): Promise<number> {
|
zoomTo(factor: number): Promise<number> {
|
||||||
return new Promise<number>((resolve, reject) => {
|
return new Promise<number>((resolve, reject) => {
|
||||||
resolve(-1);
|
resolve(-1);
|
||||||
|
|
|
@ -22,7 +22,8 @@ import {
|
||||||
ChatChannel,
|
ChatChannel,
|
||||||
MessengerChannel,
|
MessengerChannel,
|
||||||
MessageChannel,
|
MessageChannel,
|
||||||
ProcessChannel
|
ProcessChannel,
|
||||||
|
AppChannel
|
||||||
} from '../types/channel.type';
|
} from '../types/channel.type';
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { TranslateLoaderService } from '../translate/electron-loader';
|
import { TranslateLoaderService } from '../translate/electron-loader';
|
||||||
|
@ -388,6 +389,10 @@ export class ElectronNativeService implements NativeService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
appExit(): void {
|
||||||
|
this.ipcRenderer.send(AppChannel.Exit);
|
||||||
|
}
|
||||||
|
|
||||||
zoomTo(factor: number): Promise<number> {
|
zoomTo(factor: number): Promise<number> {
|
||||||
return new Promise<number>((resolve, reject) => {
|
return new Promise<number>((resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -53,3 +53,7 @@ export enum IdleStateChannel {
|
||||||
StartCheck = 'UCAP::idleState::startCheck',
|
StartCheck = 'UCAP::idleState::startCheck',
|
||||||
ChangeLimitTime = 'UCAP::idleState::changeLimitTime'
|
ChangeLimitTime = 'UCAP::idleState::changeLimitTime'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum AppChannel {
|
||||||
|
Exit = 'UCAP::app::exit'
|
||||||
|
}
|
||||||
|
|
|
@ -68,6 +68,7 @@ export abstract class NativeService {
|
||||||
abstract windowMinimize(): void;
|
abstract windowMinimize(): void;
|
||||||
abstract windowMaximize(): void;
|
abstract windowMaximize(): void;
|
||||||
abstract zoomTo(factor: number): Promise<number>;
|
abstract zoomTo(factor: number): Promise<number>;
|
||||||
|
abstract appExit(): void;
|
||||||
|
|
||||||
abstract idleStateChanged(): Observable<WindowIdle>;
|
abstract idleStateChanged(): Observable<WindowIdle>;
|
||||||
abstract changeLimitOfIdleState(limitTime: number): void;
|
abstract changeLimitOfIdleState(limitTime: number): void;
|
||||||
|
|
|
@ -142,6 +142,7 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
readToHereEvent: Info<EventJson>;
|
readToHereEvent: Info<EventJson>;
|
||||||
swapped = false;
|
swapped = false;
|
||||||
|
hidden = false;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private logger: NGXLogger,
|
private logger: NGXLogger,
|
||||||
|
@ -384,9 +385,10 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
to: Info<EventJson>,
|
to: Info<EventJson>,
|
||||||
preCallback: () => void,
|
preCallback: () => void,
|
||||||
postCallback: () => void,
|
postCallback: () => void,
|
||||||
useSwap: boolean = true
|
useHide: boolean,
|
||||||
|
useSwap: boolean
|
||||||
) {
|
) {
|
||||||
this.preSwapScroll(useSwap);
|
this.preSwapScroll(useHide, useSwap);
|
||||||
if (!!preCallback) {
|
if (!!preCallback) {
|
||||||
preCallback();
|
preCallback();
|
||||||
}
|
}
|
||||||
|
@ -395,12 +397,12 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
if (!!postCallback) {
|
if (!!postCallback) {
|
||||||
postCallback();
|
postCallback();
|
||||||
}
|
}
|
||||||
this.postSwapScroll(useSwap);
|
this.postSwapScroll(useHide, useSwap);
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
preSwapScroll(useSwap: boolean = true) {
|
preSwapScroll(useHide: boolean, useSwap: boolean) {
|
||||||
if (useSwap && !this.swapped) {
|
if (useSwap && !this.swapped) {
|
||||||
this.chatMessagesBuffer.nativeElement.innerHTML = this.chatMessagesContainer.nativeElement.innerHTML;
|
this.chatMessagesBuffer.nativeElement.innerHTML = this.chatMessagesContainer.nativeElement.innerHTML;
|
||||||
this.chatMessagesBuffer.nativeElement.scrollTop = this.chatMessagesContainer.nativeElement.scrollTop;
|
this.chatMessagesBuffer.nativeElement.scrollTop = this.chatMessagesContainer.nativeElement.scrollTop;
|
||||||
|
@ -408,10 +410,13 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
this.swapped = true;
|
this.swapped = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (useHide && !this.hidden) {
|
||||||
this.chatMessagesContainer.nativeElement.classList.add('hide');
|
this.chatMessagesContainer.nativeElement.classList.add('hide');
|
||||||
|
this.hidden = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
postSwapScroll(useSwap: boolean = true) {
|
postSwapScroll(useHide: boolean, useSwap: boolean) {
|
||||||
if (useSwap && this.swapped) {
|
if (useSwap && this.swapped) {
|
||||||
this.chatMessagesBuffer.nativeElement.innerHTML = '';
|
this.chatMessagesBuffer.nativeElement.innerHTML = '';
|
||||||
this.chatMessagesBuffer.nativeElement.scrollTop = 0;
|
this.chatMessagesBuffer.nativeElement.scrollTop = 0;
|
||||||
|
@ -419,7 +424,10 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
this.swapped = false;
|
this.swapped = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (useHide && this.hidden) {
|
||||||
this.chatMessagesContainer.nativeElement.classList.remove('hide');
|
this.chatMessagesContainer.nativeElement.classList.remove('hide');
|
||||||
|
this.hidden = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ready(): void {
|
ready(): void {
|
||||||
|
@ -434,7 +442,9 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
() => {},
|
() => {},
|
||||||
() => {
|
() => {
|
||||||
this.firstCheckReadHere = false;
|
this.firstCheckReadHere = false;
|
||||||
}
|
},
|
||||||
|
true,
|
||||||
|
true
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
this.swapScroll(
|
this.swapScroll(
|
||||||
|
@ -442,7 +452,9 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
() => {},
|
() => {},
|
||||||
() => {
|
() => {
|
||||||
this.storedScrollItem = undefined;
|
this.storedScrollItem = undefined;
|
||||||
}
|
},
|
||||||
|
true,
|
||||||
|
true
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if (this.scrollUpInitalized) {
|
} else if (this.scrollUpInitalized) {
|
||||||
|
@ -460,18 +472,34 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
() => {},
|
() => {},
|
||||||
() => {
|
() => {
|
||||||
this.firstCheckReadHere = false;
|
this.firstCheckReadHere = false;
|
||||||
}
|
},
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
if (
|
||||||
|
this.virtualScroller.viewPortInfo.endIndex ===
|
||||||
|
this.eventList.length - 2
|
||||||
|
) {
|
||||||
|
this.swapScroll(
|
||||||
|
this.eventList[this.eventList.length - 1],
|
||||||
|
() => {},
|
||||||
|
() => {},
|
||||||
|
false,
|
||||||
|
false
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
this.swapScroll(
|
this.swapScroll(
|
||||||
this.eventList[this.eventList.length - 1],
|
this.eventList[this.eventList.length - 1],
|
||||||
() => {},
|
() => {},
|
||||||
() => {},
|
() => {},
|
||||||
|
true,
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
initEventMore() {
|
initEventMore() {
|
||||||
// 방정보가 바뀌면 이전대화 보기 관련 값들을 초기화 한다.
|
// 방정보가 바뀌면 이전대화 보기 관련 값들을 초기화 한다.
|
||||||
|
@ -499,7 +527,7 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
||||||
if (this.scrollUpInitalized && this.eventRemained) {
|
if (this.scrollUpInitalized && this.eventRemained) {
|
||||||
this.storeScrollPosition();
|
this.storeScrollPosition();
|
||||||
|
|
||||||
this.preSwapScroll();
|
this.preSwapScroll(true, true);
|
||||||
|
|
||||||
this.moreEvent.emit(this.eventList[0].seq);
|
this.moreEvent.emit(this.eventList[0].seq);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user