This commit is contained in:
leejinho 2020-01-08 18:27:59 +09:00
commit 68b971f93b
17 changed files with 339 additions and 95 deletions

View File

@ -50,7 +50,7 @@
<div class="room-info"> <div class="room-info">
<h3 class="room-name"> <h3 class="room-name">
<ng-container *ngIf="!roomInfo || !userInfoList"> <ng-container *ngIf="!roomInfo || !userInfoList">
대화방명을 가져오고 있습니다.. {{ 'chat.getRoomNameInProgress' | translate }}
</ng-container> </ng-container>
<ng-container *ngIf="!!roomInfo && !!userInfoList"> <ng-container *ngIf="!!roomInfo && !!userInfoList">
<ng-container [ngSwitch]="roomInfo.roomType"> <ng-container [ngSwitch]="roomInfo.roomType">
@ -90,7 +90,7 @@
> >
<span class="bg-accent-dark" <span class="bg-accent-dark"
>{{ getConvertTimer(roomInfo.timeRoomInterval) }} </span >{{ getConvertTimer(roomInfo.timeRoomInterval) }} </span
>비밀 대화방입니다. >{{ 'chat.isRoomTypeSecret' | translate }}
</div> </div>
<!-- Timer Room Info --> <!-- Timer Room Info -->
</div> </div>
@ -104,13 +104,13 @@
<mat-icon <mat-icon
class="amber-fg" class="amber-fg"
*ngIf="roomInfo.receiveAlarm" *ngIf="roomInfo.receiveAlarm"
matTooltip="알림 켜짐" matTooltip="{{ 'chat.notificationIsOn' | translate }}"
>notifications_active</mat-icon >notifications_active</mat-icon
> >
<mat-icon <mat-icon
class="secondary-text" class="secondary-text"
*ngIf="!roomInfo.receiveAlarm" *ngIf="!roomInfo.receiveAlarm"
matTooltip="알림 꺼짐" matTooltip="{{ 'chat.notificationIsOff' | translate }}"
>notifications_off</mat-icon >notifications_off</mat-icon
> >
</button> </button>

View File

@ -42,7 +42,25 @@
} }
}, },
"profile": { "profile": {
"my": "My profile",
"open": "Open profile", "open": "Open profile",
"changeProfileImage": "Change image of profile",
"favorit": "Favorit",
"addBuddy": "Add a buddy",
"removeBuddy": "Remove a buddy",
"fieldCompany": "Company",
"fieldResponsibilities": "Responsibilities",
"fieldWorkplace": "Workplace",
"fieldJob": "Job",
"fieldCustomerInfo": "CustomerInfo",
"fieldEmail": "Email",
"fieldOfficePhoneNumber": "Office phone",
"fieldHandphone": "Cellphone",
"fieldMyTalk": "MyTalk",
"fieldOneToOneTalk": "1:1 Talk",
"fieldSMS": "SMS",
"fieldVideoConference": "Video conference",
"fieldMessage": "Message",
"errors": { "errors": {
"label": "Profile error", "label": "Profile error",
"failToChangeProfileImage": "Failed to change profile image." "failToChangeProfileImage": "Failed to change profile image."
@ -52,7 +70,44 @@
"label": "Settings", "label": "Settings",
"typeGenernal": "Genernal", "typeGenernal": "Genernal",
"typeNotification": "Notification", "typeNotification": "Notification",
"typeChat": "Chat" "typeChat": "Chat",
"chat": {
"label": "Chat",
"fontFamily": "Font family",
"fontSize": "Font size",
"file": "File transfer",
"downloadPath": "Download path"
},
"genernal": {
"theme": "Theme",
"application": "Application",
"autoStartOnBoot": "Auto start on OS boot time",
"autoHideWindow": "Hide window on excuted",
"login": "Login",
"autoLogin": "Auto login",
"language": "Language",
"hrLanguage": "HR language",
"timezone": "Timezone"
},
"notification": {
"chat": "Chat",
"receival": "Get notified",
"receive": "Receive",
"notReceive": "Not receive",
"method": "Notification method",
"methodTypeSound": "Sound",
"methodTypeAlert": "Alert",
"methodTypeSoundAndAlert": "Sound + Alert",
"settingOfAlertWindow": "Alert",
"mobile": "Mobile",
"receiveForMobile": "Mobile notifications",
"receiveForMobileTypeAlways": "Always get mobile notifications",
"descriptionReceiveForMobileTypeAlways": "Receive mobile notifications only when PC version is absent on release",
"message": "Message",
"receiveForMessage": "Message notifications",
"receiveForMessageTypePopup": "Alert view when receiving a message",
"descriptionReceiveForMobileTypePopup": "Only get notifications on release"
}
}, },
"presence": { "presence": {
"online": "Online", "online": "Online",
@ -127,6 +182,10 @@
"ejectFromRoom": "Eject from room", "ejectFromRoom": "Eject from room",
"confirmEjectFromRoom": "Do you want to eject member[{{targetMember}}] from room?", "confirmEjectFromRoom": "Do you want to eject member[{{targetMember}}] from room?",
"badgeDescriptionForUnread": "There is an unconfirmed message.", "badgeDescriptionForUnread": "There is an unconfirmed message.",
"getRoomNameInProgress": "Getting chat room name.",
"isRoomTypeSecret": "This room is secret type",
"notificationIsOn": "Notification is on",
"notificationIsOff": "Notification is off",
"event": { "event": {
"inviteToRoomWith": "{{owner}} invited {{inviter}}.", "inviteToRoomWith": "{{owner}} invited {{inviter}}.",
"exitFromRoomWith": "{{exitor}} has left.", "exitFromRoomWith": "{{exitor}} has left.",
@ -173,10 +232,13 @@
}, },
"message": { "message": {
"label": "Message", "label": "Message",
"fieldTitle": "Title",
"fieldReceiver": "Receiver",
"new": "New message", "new": "New message",
"remove": "Remove message", "remove": "Remove message",
"modify": "Modify message", "modify": "Modify message",
"sendTo": "Send message", "sendTo": "Send message",
"sendReservation": "Send reservation",
"placeholderForSearch": "search for name, title, content", "placeholderForSearch": "search for name, title, content",
"messageTypeAll": "All", "messageTypeAll": "All",
"messageTypeReceiving": "Receiving", "messageTypeReceiving": "Receiving",
@ -208,7 +270,8 @@
"errors": { "errors": {
"label": "Message error", "label": "Message error",
"failToSending": "The message failed to send.", "failToSending": "The message failed to send.",
"failToModify": "The message failed to modify." "failToModify": "The message failed to modify.",
"minTimeReservation": "It can be set only 30 minutes after the current time."
} }
}, },
"notice": { "notice": {
@ -248,7 +311,12 @@
"hourFrom": "hour", "hourFrom": "hour",
"minute": "minute", "minute": "minute",
"second": "second", "second": "second",
"persons": "person(s)" "persons": "person(s)",
"hourLaterWith": "(An) {{hour}} hour(s) later",
"tomorrowMorning": "Tomorrow morning",
"tomorrowAfternoon": "Tomorrow afternoon",
"weekLaterWith": "(A) {{week}} week(s) later",
"monthLaterWith": "(A) {{month}} month(s) later"
}, },
"file": { "file": {
"name": "Name of file", "name": "Name of file",

View File

@ -42,7 +42,25 @@
} }
}, },
"profile": { "profile": {
"my": "내 프로필",
"open": "프로필 보기", "open": "프로필 보기",
"changeProfileImage": "프로필 이미지 변경",
"favorit": "즐겨찾기",
"addBuddy": "동료추가",
"removeBuddy": "동료삭제",
"fieldCompany": "회사",
"fieldResponsibilities": "담당업무",
"fieldWorkplace": "근무지",
"fieldJob": "직무",
"fieldCustomerInfo": "거래처",
"fieldEmail": "이메일",
"fieldOfficePhoneNumber": "사무실",
"fieldHandphone": "핸드폰",
"fieldMyTalk": "MyTalk",
"fieldOneToOneTalk": "1:1 대화",
"fieldSMS": "SMS",
"fieldVideoConference": "화상회의",
"fieldMessage": "쪽지",
"errors": { "errors": {
"label": "프로필 에러", "label": "프로필 에러",
"failToChangeProfileImage": "프로필 이미지 변경에 실패 하였습니다." "failToChangeProfileImage": "프로필 이미지 변경에 실패 하였습니다."
@ -52,7 +70,44 @@
"label": "설정", "label": "설정",
"typeGenernal": "일반", "typeGenernal": "일반",
"typeNotification": "알림", "typeNotification": "알림",
"typeChat": "대화" "typeChat": "대화",
"chat": {
"label": "대화",
"fontFamily": "글꼴",
"fontSize": "글 크기",
"file": "파일 전송",
"downloadPath": "다운로드 폴더"
},
"genernal": {
"theme": "테마",
"application": "응용 프로그램",
"autoStartOnBoot": "Windows 실행 시 자동 실행",
"autoHideWindow": "실행 시 창 숨기기",
"login": "로그인",
"autoLogin": "실행 시 자동 로그인",
"language": "언어",
"hrLanguage": "인사 정보 언어",
"timezone": "시간대"
},
"notification": {
"chat": "메시지",
"receival": "알림 받기",
"receive": "알림 받음",
"notReceive": "알림 받지 않음",
"method": "알림 방법",
"methodTypeSound": "소리",
"methodTypeAlert": "알림창",
"methodTypeSoundAndAlert": "소리 + 알림창",
"settingOfAlertWindow": "알림창 설정",
"mobile": "모바일",
"receiveForMobile": "모바일 알림",
"receiveForMobileTypeAlways": "항상 모바일 알림을 받음",
"descriptionReceiveForMobileTypeAlways": "해제 시 PC버전이 부재중인 경우에만 모바일 알림을 받음",
"message": "쪽지",
"receiveForMessage": "쪽지 알림",
"receiveForMessageTypePopup": "쪽지 수신 시 팝업보기",
"descriptionReceiveForMobileTypePopup": "해제 시 쪽지 알림만 받음"
}
}, },
"presence": { "presence": {
"online": "온라인", "online": "온라인",
@ -67,8 +122,8 @@
"nameFavorit": "즐겨찾기", "nameFavorit": "즐겨찾기",
"nameMyDept": "소속부서", "nameMyDept": "소속부서",
"nameDefault": "기본", "nameDefault": "기본",
"favorite": "즐겨찾기 등록", "favorit": "즐겨찾기 등록",
"unfavorite": "즐겨찾기 해제", "unfavorit": "즐겨찾기 해제",
"removeBuddyFromGroup": "그룹에서 삭제", "removeBuddyFromGroup": "그룹에서 삭제",
"copyBuddyToGroup": "대화 상대 복사", "copyBuddyToGroup": "대화 상대 복사",
"moveBuddyToGroup": "대화 상대 이동", "moveBuddyToGroup": "대화 상대 이동",
@ -127,6 +182,10 @@
"ejectFromRoom": "강퇴", "ejectFromRoom": "강퇴",
"confirmEjectFromRoom": "{{targetMember}} 님을 대화방에서 퇴장 시키겠습니까?", "confirmEjectFromRoom": "{{targetMember}} 님을 대화방에서 퇴장 시키겠습니까?",
"badgeDescriptionForUnread": "확인하지 않은 메시지가 있습니다.", "badgeDescriptionForUnread": "확인하지 않은 메시지가 있습니다.",
"getRoomNameInProgress": "대화방명을 가져오고 있습니다.",
"isRoomTypeSecret": "비밀 대화방입니다.",
"notificationIsOn": "알림 켜짐",
"notificationIsOff": "알림 꺼짐",
"event": { "event": {
"inviteToRoomWith": "{{owner}}이 {{inviter}}을 초대했습니다.", "inviteToRoomWith": "{{owner}}이 {{inviter}}을 초대했습니다.",
"exitFromRoomWith": "{{exitor}}님이 퇴장하셨습니다.", "exitFromRoomWith": "{{exitor}}님이 퇴장하셨습니다.",
@ -173,10 +232,13 @@
}, },
"message": { "message": {
"label": "쪽지", "label": "쪽지",
"fieldTitle": "제목",
"fieldReceiver": "수신자",
"new": "새로운 쪽지", "new": "새로운 쪽지",
"remove": "쪽지 삭제", "remove": "쪽지 삭제",
"modify": "쪽지 수정", "modify": "쪽지 수정",
"sendTo": "쪽지 보내기", "sendTo": "쪽지 보내기",
"sendReservation": "쪽지 예약 보내기",
"placeholderForSearch": "이름, 제목, 내용 검색", "placeholderForSearch": "이름, 제목, 내용 검색",
"messageTypeAll": "전체", "messageTypeAll": "전체",
"messageTypeReceiving": "수신", "messageTypeReceiving": "수신",
@ -208,7 +270,8 @@
"errors": { "errors": {
"label": "쪽지 에러", "label": "쪽지 에러",
"failToSending": "쪽지를 전송에 실패 하였습니다.", "failToSending": "쪽지를 전송에 실패 하였습니다.",
"failToModify": "쪽지 수정에 실패 하였습니다." "failToModify": "쪽지 수정에 실패 하였습니다.",
"minTimeReservation": "현재 시각으로부터 30분 이후로만 설정 가능합니다."
} }
}, },
"notice": { "notice": {
@ -248,7 +311,12 @@
"hourFrom": "시간", "hourFrom": "시간",
"minute": "분", "minute": "분",
"second": "초", "second": "초",
"persons": "명" "persons": "명",
"hourLaterWith": "{{hour}}시간 뒤",
"tomorrowMorning": "내일 아침",
"tomorrowAfternoon": "내일 오후",
"weekLaterWith": "{{week}}주일 뒤",
"monthLaterWith": "{{month}}달 뒤"
}, },
"file": { "file": {
"name": "파일 이름", "name": "파일 이름",

View File

@ -5,7 +5,7 @@
'chat.event.inviteToRoomWith' 'chat.event.inviteToRoomWith'
| translate | translate
: { : {
owner: message.sentMessageJson.owner, owner: getI18nForSir(message.sentMessageJson.owner),
inviter: getI18nForSir(message.sentMessageJson.inviter) inviter: getI18nForSir(message.sentMessageJson.inviter)
} }
}} }}

View File

@ -55,7 +55,9 @@
<ng-container [ngSwitch]="node.nodeType"> <ng-container [ngSwitch]="node.nodeType">
<span *ngSwitchCase="NodeType.Profile"> <span *ngSwitchCase="NodeType.Profile">
<span class="title-name ellipsis">내 프로필</span> <span class="title-name ellipsis">{{
'profile.my' | translate
}}</span>
</span> </span>
<span *ngSwitchCase="NodeType.Favorit"> <span *ngSwitchCase="NodeType.Favorit">
<span class="title-name ellipsis">{{ <span class="title-name ellipsis">{{
@ -81,7 +83,8 @@
</ng-container> </ng-container>
<span class="text-accent-color number"> <span class="text-accent-color number">
({{ node.countOfChildren }}명)</span ({{ node.countOfChildren
}}{{ 'common.units.persons' | translate }})</span
> >
<mat-checkbox <mat-checkbox

View File

@ -1,7 +1,11 @@
<mat-card class="mat-elevation-z0 ucap-message-write"> <mat-card class="mat-elevation-z0 ucap-message-write">
<form name="messageWriteForm" [formGroup]="messageWriteForm" novalidate> <form name="messageWriteForm" [formGroup]="messageWriteForm" novalidate>
<mat-form-field class="message-title"> <mat-form-field class="message-title">
<input matInput formControlName="title" placeholder="제목" /> <input
matInput
formControlName="title"
placeholder="{{ 'message.fieldTitle' | translate }}"
/>
</mat-form-field> </mat-form-field>
<mat-card-content class="message-write-body"> <mat-card-content class="message-write-body">
@ -43,7 +47,7 @@
</mat-chip> </mat-chip>
<input <input
[matChipInputFor]="chipList" [matChipInputFor]="chipList"
placeholder="수신자" placeholder="{{ 'message.fieldReceiver' | translate }}"
readonly readonly
(click)="onClickReceiverList()" (click)="onClickReceiverList()"
/> />
@ -80,12 +84,13 @@
(click)="onClickCancel()" (click)="onClickCancel()"
class="mat-primary" class="mat-primary"
> >
취소 {{ 'common.messages.cancel' | translate }}
</button> </button>
<mat-menu #appMenu="matMenu" yPosition="above"> <mat-menu #appMenu="matMenu" yPosition="above">
<button mat-menu-item (click)="onClickSendSchedule()"> <button mat-menu-item (click)="onClickSendSchedule()">
<span class="mdi mdi-send-clock"></span><span>예약 보내기</span> <span class="mdi mdi-send-clock"></span
><span>{{ 'message.sendReservation' | translate }}</span>
</button> </button>
</mat-menu> </mat-menu>
@ -100,7 +105,7 @@
0 === contentLength || 0 === contentLength ||
1000 < contentLength 1000 < contentLength
" "
>보내기</ucap-split-button >{{ 'message.sendTo' | translate }}</ucap-split-button
> >
<button <button
*ngIf="isModify" *ngIf="isModify"
@ -115,7 +120,7 @@
" "
class="mat-primary" class="mat-primary"
> >
예약 보내기 {{ 'message.sendReservation' | translate }}
</button> </button>
</div> </div>
</mat-card-actions> </mat-card-actions>

View File

@ -1,7 +1,7 @@
<mat-card class="confirm-card mat-elevation-z"> <mat-card class="confirm-card mat-elevation-z">
<mat-card-header> <mat-card-header>
<mat-card-title> <mat-card-title>
예약 발송 {{ 'message.sendReservation' | translate }}
</mat-card-title> </mat-card-title>
</mat-card-header> </mat-card-header>
<mat-card-content> <mat-card-content>
@ -46,7 +46,7 @@
class="preset-button" class="preset-button"
(click)="onClickPresetHour(1)" (click)="onClickPresetHour(1)"
> >
1시간 뒤 {{ 'common.units.hourLaterWith' | translate: { hour: 1 } }}
</button> </button>
</mat-list-item> </mat-list-item>
<mat-list-item role="listitem"> <mat-list-item role="listitem">
@ -55,7 +55,7 @@
class="preset-button" class="preset-button"
(click)="onClickPresetHour(2)" (click)="onClickPresetHour(2)"
> >
2시간 뒤 {{ 'common.units.hourLaterWith' | translate: { hour: 2 } }}
</button> </button>
</mat-list-item> </mat-list-item>
<mat-list-item role="listitem"> <mat-list-item role="listitem">
@ -64,7 +64,7 @@
class="preset-button" class="preset-button"
(click)="onClickPresetTommorowMorning()" (click)="onClickPresetTommorowMorning()"
> >
내일 아침 {{ 'common.units.tomorrowMorning' | translate }}
</button> </button>
</mat-list-item> </mat-list-item>
<mat-list-item role="listitem"> <mat-list-item role="listitem">
@ -73,7 +73,7 @@
class="preset-button" class="preset-button"
(click)="onClickPresetTommorowAfternoon()" (click)="onClickPresetTommorowAfternoon()"
> >
내일 오후 {{ 'common.units.tomorrowAfternoon' | translate }}
</button> </button>
</mat-list-item> </mat-list-item>
<mat-list-item role="listitem"> <mat-list-item role="listitem">
@ -82,7 +82,7 @@
class="preset-button" class="preset-button"
(click)="onClickPresetDay(7)" (click)="onClickPresetDay(7)"
> >
일주일 뒤 {{ 'common.units.weekLaterWith' | translate: { week: 1 } }}
</button> </button>
</mat-list-item> </mat-list-item>
<mat-list-item role="listitem"> <mat-list-item role="listitem">
@ -91,7 +91,7 @@
class="preset-button" class="preset-button"
(click)="onClickPresetDay(30)" (click)="onClickPresetDay(30)"
> >
한달 뒤 {{ 'common.units.monthLaterWith' | translate: { month: 2 } }}
</button> </button>
</mat-list-item> </mat-list-item>
</mat-list> </mat-list>
@ -104,7 +104,7 @@
<div class="actions-container"> <div class="actions-container">
<div class="actions-message"> <div class="actions-message">
<span *ngIf="dateIsToEarly"> <span *ngIf="dateIsToEarly">
현재 시각으로부터 30분 이후로만 설정 가능합니다. {{ 'message.errors.minTimeReservation' | translate }}
</span> </span>
</div> </div>
<div class="actions-spacer"></div> <div class="actions-spacer"></div>
@ -114,7 +114,7 @@
(click)="onClickCancel()" (click)="onClickCancel()"
class="mat-primary" class="mat-primary"
> >
취소 {{ 'common.messages.cancel' | translate }}
</button> </button>
<button <button
mat-stroked-button mat-stroked-button
@ -122,7 +122,7 @@
(click)="onClickSend()" (click)="onClickSend()"
class="mat-primary" class="mat-primary"
> >
예약 발송 {{ 'message.sendReservation' | translate }}
</button> </button>
</div> </div>
</div> </div>

View File

@ -31,6 +31,7 @@ import { ListItemComponent } from './components/list-item.component';
import { WriteComponent } from './components/write.component'; import { WriteComponent } from './components/write.component';
import { ScheduleSendDialogComponent } from './dialogs/schedule-send.dialog.component'; import { ScheduleSendDialogComponent } from './dialogs/schedule-send.dialog.component';
import { TranslateModule } from '@ngx-translate/core';
const COMPONENTS = [ListItemComponent, WriteComponent]; const COMPONENTS = [ListItemComponent, WriteComponent];
const DIALOGS = [ScheduleSendDialogComponent]; const DIALOGS = [ScheduleSendDialogComponent];
@ -57,10 +58,11 @@ const SERVICES = [];
MatInputModule, MatInputModule,
MatListModule, MatListModule,
MatMomentDateModule, MatMomentDateModule,
MatMenuModule, MatMenuModule,
MatButtonToggleModule, MatButtonToggleModule,
TranslateModule,
PerfectScrollbarModule, PerfectScrollbarModule,
UCapUiModule UCapUiModule

View File

@ -14,7 +14,7 @@
mat-mini-fab mat-mini-fab
class="mat-elevation-z6 btn-upload-profile-image" class="mat-elevation-z6 btn-upload-profile-image"
*ngIf="isMe && editableProfileImage" *ngIf="isMe && editableProfileImage"
matTooltip="프로필 이미지 변경" matTooltip="{{ 'profile.changeProfileImage' | translate }}"
matTooltipPosition="above" matTooltipPosition="above"
[disabled]=" [disabled]="
profileImageFileUploadItem && profileImageFileUploadItem &&
@ -79,7 +79,7 @@
stroke-linejoin="round" stroke-linejoin="round"
[ngClass]="[isFavorit ? 'on' : '']" [ngClass]="[isFavorit ? 'on' : '']"
(click)="onToggleFavorit()" (click)="onToggleFavorit()"
matTooltip="즐겨찾기" matTooltip="{{ 'profile.favorite' | translate }}"
> >
<polygon <polygon
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
@ -100,7 +100,7 @@
class="on" class="on"
*ngIf="!isBuddy" *ngIf="!isBuddy"
(click)="onClickAddBuddy()" (click)="onClickAddBuddy()"
matTooltip="동료추가" matTooltip="{{ 'profile.addBuddy' | translate }}"
> >
<!-- not buddy --> <!-- not buddy -->
<path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path> <path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
@ -122,7 +122,7 @@
class="on" class="on"
*ngIf="getShowBuddyDelBtn()" *ngIf="getShowBuddyDelBtn()"
(click)="onClickDelBuddy()" (click)="onClickDelBuddy()"
matTooltip="동료삭제" matTooltip="{{ 'profile.removeBuddy' | translate }}"
> >
<!-- is buddy --> <!-- is buddy -->
<path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path> <path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
@ -157,32 +157,36 @@
</li> </li>
--> -->
<li class="company"> <li class="company">
<dt class="division">회사</dt> <dt class="division">{{ 'profile.fieldCompany' | translate }}</dt>
<dd>{{ userInfo.companyName | ucapStringEmptycheck }}</dd> <dd>{{ userInfo.companyName | ucapStringEmptycheck }}</dd>
</li> </li>
<li> <li>
<dt class="division">담당업무</dt> <dt class="division">
{{ 'profile.fieldResponsibilities' | translate }}
</dt>
<dd>{{ userInfo.responsibilities | ucapStringEmptycheck }}</dd> <dd>{{ userInfo.responsibilities | ucapStringEmptycheck }}</dd>
</li> </li>
<li> <li>
<dt>근무지</dt> <dt>{{ 'profile.fieldworkplace' | translate }}</dt>
<dd>{{ userInfo.workplace | ucapStringEmptycheck }}</dd> <dd>{{ userInfo.workplace | ucapStringEmptycheck }}</dd>
</li> </li>
<li> <li>
<dt class="division">직무</dt> <dt class="division">{{ 'profile.fieldJob' | translate }}</dt>
<dd>{{ userInfo.job | ucapStringEmptycheck }}</dd> <dd>{{ userInfo.job | ucapStringEmptycheck }}</dd>
</li> </li>
<li> <li>
<dt>거래처</dt> <dt>{{ 'profile.fieldCustomerInfo' | translate }}</dt>
<dd>{{ userInfo.customerInfo | ucapStringEmptycheck }}</dd> <dd>{{ userInfo.customerInfo | ucapStringEmptycheck }}</dd>
</li> </li>
<li> <li>
<dt class="division">이메일</dt> <dt class="division">{{ 'profile.fieldEmail' | translate }}</dt>
<dd>{{ userInfo.email | ucapStringEmptycheck }}</dd> <dd>{{ userInfo.email | ucapStringEmptycheck }}</dd>
</li> </li>
<li> <li>
<dt class="division">사무실</dt> <dt class="division">
{{ 'profile.fieldOfficePhoneNumber' | translate }}
</dt>
<dd> <dd>
{{ {{
userInfo.lineNumber userInfo.lineNumber
@ -194,7 +198,7 @@
mat-mini-fab mat-mini-fab
class="mat-elevation-z userInfo-call" class="mat-elevation-z userInfo-call"
*ngIf="!isMe" *ngIf="!isMe"
matTooltip="전화" matTooltip="{{ 'profile.fieldOfficePhoneNumber' | translate }}"
matTooltipPosition="above" matTooltipPosition="above"
[disabled]="getDisabledBtn('LINE')" [disabled]="getDisabledBtn('LINE')"
(click)="onClickCall('LINE')" (click)="onClickCall('LINE')"
@ -217,7 +221,7 @@
</button> </button>
</li> </li>
<li> <li>
<dt class="division">핸드폰</dt> <dt class="division">{{ 'profile.fieldHandphone' | translate }}</dt>
<dd> <dd>
{{ {{
userInfo.hpNumber | ucapStringFormatterPhone | ucapStringEmptycheck userInfo.hpNumber | ucapStringFormatterPhone | ucapStringEmptycheck
@ -227,7 +231,7 @@
mat-mini-fab mat-mini-fab
class="mat-elevation-z userInfo-call" class="mat-elevation-z userInfo-call"
*ngIf="!isMe" *ngIf="!isMe"
matTooltip="모바일" matTooltip="{{ 'profile.fieldHandphone' | translate }}"
matTooltipPosition="above" matTooltipPosition="above"
[disabled]="getDisabledBtn('MOBILE')" [disabled]="getDisabledBtn('MOBILE')"
(click)="onClickCall('MOBILE')" (click)="onClickCall('MOBILE')"
@ -257,7 +261,10 @@
<button <button
mat-mini-fab mat-mini-fab
class="mat-elevation-z bg-accent-darkest" class="mat-elevation-z bg-accent-darkest"
[matTooltip]="isMe ? 'MyTalk' : '1:1 대화'" matTooltip="{{
(isMe ? 'profile.fieldMyTalk' : 'profile.fieldOneToOneTalk')
| translate
}}"
matTooltipPosition="above" matTooltipPosition="above"
(click)="onClickOpenChat()" (click)="onClickOpenChat()"
> >
@ -294,8 +301,12 @@
/> />
</svg> </svg>
</button> </button>
<span *ngIf="!isMe" class="button-text">대화</span> <span *ngIf="!isMe" class="button-text">{{
<span *ngIf="isMe" class="button-text">myTalk</span> 'profile.fieldOneToOneTalk' | translate
}}</span>
<span *ngIf="isMe" class="button-text">{{
'profile.fieldMyTalk' | translate
}}</span>
</div> </div>
<div class="button-text-item" *ngIf="!isMe"> <div class="button-text-item" *ngIf="!isMe">
@ -303,7 +314,7 @@
mat-mini-fab mat-mini-fab
class="mat-elevation-z" class="mat-elevation-z"
*ngIf="!isMe" *ngIf="!isMe"
matTooltip="SMS" matTooltip="{{ 'profile.fieldSMS' | translate }}"
matTooltipPosition="above" matTooltipPosition="above"
[disabled]="getDisabledBtn('SMS')" [disabled]="getDisabledBtn('SMS')"
(click)="onClickSMS()" (click)="onClickSMS()"
@ -314,7 +325,7 @@
/> />
</svg> </svg>
</button> </button>
<span class="button-text">SMS</span> <span class="button-text">{{ 'profile.fieldSMS' | translate }}</span>
</div> </div>
<div class="button-text-item" *ngIf="!isMe"> <div class="button-text-item" *ngIf="!isMe">
@ -322,7 +333,7 @@
mat-mini-fab mat-mini-fab
class="mat-elevation-z bg-accent-darkest" class="mat-elevation-z bg-accent-darkest"
*ngIf="!isMe" *ngIf="!isMe"
matTooltip="화상회의" matTooltip="{{ 'profile.fieldVideoConference' | translate }}"
matTooltipPosition="above" matTooltipPosition="above"
(click)="onClickVideoConference()" (click)="onClickVideoConference()"
> >
@ -332,7 +343,9 @@
/> />
</svg> </svg>
</button> </button>
<span class="button-text">화상</span> <span class="button-text">{{
'profile.fieldVideoConference' | translate
}}</span>
</div> </div>
<div class="button-text-item" *ngIf="!isMe"> <div class="button-text-item" *ngIf="!isMe">
@ -340,7 +353,7 @@
mat-mini-fab mat-mini-fab
class="mat-elevation-z bg-accent-darkest" class="mat-elevation-z bg-accent-darkest"
*ngIf="!isMe" *ngIf="!isMe"
matTooltip="쪽지" matTooltip="{{ 'profile.fieldMessage' | translate }}"
matTooltipPosition="above" matTooltipPosition="above"
(click)="onClickMessage()" (click)="onClickMessage()"
> >
@ -348,7 +361,9 @@
<path d="M0 0l20 10L0 20V0zm0 8v4l10-2L0 8z" /> <path d="M0 0l20 10L0 20V0zm0 8v4l10-2L0 8z" />
</svg> </svg>
</button> </button>
<span class="button-text">쪽지</span> <span class="button-text">{{
'profile.fieldMessage' | translate
}}</span>
</div> </div>
</div> </div>
</mat-card-actions> </mat-card-actions>

View File

@ -19,6 +19,7 @@ import { ListItemComponent } from './components/list-item.component';
import { UserListItemComponent } from './components/user-list-item.component'; import { UserListItemComponent } from './components/user-list-item.component';
import { ProfileComponent } from './components/profile.component'; import { ProfileComponent } from './components/profile.component';
import { MyProfileWidgetComponent } from './components/my-profile-widget.component'; import { MyProfileWidgetComponent } from './components/my-profile-widget.component';
import { TranslateModule } from '@ngx-translate/core';
const COMPONENTS = [ const COMPONENTS = [
ListItemComponent, ListItemComponent,
@ -44,6 +45,8 @@ const SERVICES = [];
MatTooltipModule, MatTooltipModule,
MatProgressSpinnerModule, MatProgressSpinnerModule,
TranslateModule,
UCapUiModule UCapUiModule
], ],
exports: [...COMPONENTS], exports: [...COMPONENTS],

View File

@ -60,7 +60,8 @@
class="num bg-accent-light" class="num bg-accent-light"
*ngIf="roomInfo.roomType === RoomType.Multi" *ngIf="roomInfo.roomType === RoomType.Multi"
> >
{{ roomInfo.joinUserCount }}명 {{ roomInfo.joinUserCount }}
{{ 'common.units.persons' | translate }}
</div> </div>
<div *ngIf="!checkable && !roomInfo.receiveAlarm"> <div *ngIf="!checkable && !roomInfo.receiveAlarm">
<mat-icon>notifications_off</mat-icon> <mat-icon>notifications_off</mat-icon>

View File

@ -8,9 +8,14 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { ListItemComponent } from './components/list-item.component'; import { ListItemComponent } from './components/list-item.component';
import { MatBadgeModule, MatCheckboxModule, MatRippleModule } from '@angular/material'; import {
MatBadgeModule,
MatCheckboxModule,
MatRippleModule
} from '@angular/material';
import { UCapUiModule } from '@ucap-webmessenger/ui'; import { UCapUiModule } from '@ucap-webmessenger/ui';
import { TranslateModule } from '@ngx-translate/core';
const COMPONENTS = [ListItemComponent]; const COMPONENTS = [ListItemComponent];
const DIRECTIVES = []; const DIRECTIVES = [];
@ -29,6 +34,8 @@ const SERVICES = [];
MatBadgeModule, MatBadgeModule,
MatCheckboxModule, MatCheckboxModule,
TranslateModule,
UCapUiModule UCapUiModule
], ],
exports: [...COMPONENTS, ...DIRECTIVES], exports: [...COMPONENTS, ...DIRECTIVES],

View File

@ -1,8 +1,10 @@
<div> <div>
<mat-list> <mat-list>
<h1 mat-subheader>대화</h1> <h1 mat-subheader>{{ 'settings.chat.label' | translate }}</h1>
<mat-list-item> <mat-list-item>
<span class="item-title">글꼴</span> <span class="item-title">{{
'settings.chat.fontFamily' | translate
}}</span>
<span class="item-input"> <span class="item-input">
<mat-form-field> <mat-form-field>
<mat-select <mat-select
@ -17,7 +19,7 @@
</span> </span>
</mat-list-item> </mat-list-item>
<mat-list-item> <mat-list-item>
<span class="item-title">크기</span> <span class="item-title">{{ 'settings.chat.fontSize' | translate }}</span>
<span class="item-input"> <span class="item-input">
<mat-form-field> <mat-form-field>
<mat-select <mat-select
@ -37,12 +39,14 @@
<mat-divider></mat-divider> <mat-divider></mat-divider>
<h1 mat-subheader *ngIf="_isNodeWebkit">파일 전송</h1> <h1 mat-subheader *ngIf="_isNodeWebkit">
{{ 'settings.chat.file' | translate }}
</h1>
<mat-list-item *ngIf="_isNodeWebkit"> <mat-list-item *ngIf="_isNodeWebkit">
<mat-form-field fxFlexFill> <mat-form-field fxFlexFill>
<input <input
matInput matInput
placeholder="다운로드 폴더" placeholder="{{ 'settings.chat.downloadPath' | translate }}"
[value]="setting.downloadPath" [value]="setting.downloadPath"
readonly readonly
(click)="onClickDownloadPath()" (click)="onClickDownloadPath()"

View File

@ -1,6 +1,6 @@
<div> <div>
<mat-list> <mat-list>
<h1 mat-subheader>테마</h1> <h1 mat-subheader>{{ 'settings.genernal.theme' | translate }}</h1>
<!--<ul class="theme-list"> <!--<ul class="theme-list">
<li <li
class="theme-box default" class="theme-box default"
@ -37,19 +37,19 @@
<mat-divider></mat-divider> <mat-divider></mat-divider>
<h1 mat-subheader>응용 프로그램</h1> <h1 mat-subheader>{{ 'settings.genernal.application' | translate }}</h1>
<mat-list-item> <mat-list-item>
<mat-checkbox <mat-checkbox
[checked]="setting.autoLaunch" [checked]="setting.autoLaunch"
(change)="onChangeAutoStart($event)" (change)="onChangeAutoStart($event)"
>Windows 실행 시 자동 실행</mat-checkbox >{{ 'settings.genernal.autoStartOnBoot' | translate }}</mat-checkbox
> >
</mat-list-item> </mat-list-item>
<mat-list-item> <mat-list-item>
<mat-checkbox <mat-checkbox
[checked]="setting.startupHideWindow" [checked]="setting.startupHideWindow"
(change)="onChangeStartupHideWindow($event)" (change)="onChangeStartupHideWindow($event)"
>실행 시 창 숨기기</mat-checkbox >{{ 'settings.genernal.autoHideWindow' | translate }}</mat-checkbox
> >
</mat-list-item> </mat-list-item>
<!-- <mat-list-item> <!-- <mat-list-item>
@ -62,18 +62,18 @@
<mat-divider></mat-divider> <mat-divider></mat-divider>
<h1 mat-subheader>로그인</h1> <h1 mat-subheader>{{ 'settings.genernal.login' | translate }}</h1>
<mat-list-item> <mat-list-item>
<mat-checkbox <mat-checkbox
[checked]="setting.autoLogin" [checked]="setting.autoLogin"
(change)="onChangeAutoLogin($event)" (change)="onChangeAutoLogin($event)"
>실행 시 자동 로그인</mat-checkbox >{{ 'settings.genernal.autoLogin' | translate }}</mat-checkbox
> >
</mat-list-item> </mat-list-item>
<mat-divider></mat-divider> <mat-divider></mat-divider>
<h1 mat-subheader>언어</h1> <h1 mat-subheader>{{ 'settings.genernal.language' | translate }}</h1>
<mat-list-item> <mat-list-item>
<mat-form-field fxFlexFill> <mat-form-field fxFlexFill>
<mat-select <mat-select
@ -92,7 +92,7 @@
<mat-divider></mat-divider> <mat-divider></mat-divider>
<h1 mat-subheader>인사 정보 언어</h1> <h1 mat-subheader>{{ 'settings.genernal.hrLanguage' | translate }}</h1>
<mat-list-item> <mat-list-item>
<mat-form-field fxFlexFill> <mat-form-field fxFlexFill>
<mat-select <mat-select

View File

@ -1,8 +1,10 @@
<div> <div>
<mat-list> <mat-list>
<h1 mat-subheader>메시지</h1> <h1 mat-subheader>{{ 'settings.notification.chat' | translate }}</h1>
<mat-list-item> <mat-list-item>
<span class="item-title">알림 받기</span> <span class="item-title">{{
'settings.notification.receival' | translate
}}</span>
</mat-list-item> </mat-list-item>
<mat-list-item> <mat-list-item>
<span class="item-input" fullWidth> <span class="item-input" fullWidth>
@ -11,27 +13,30 @@
[value]="setting.use ? 'true' : 'false'" [value]="setting.use ? 'true' : 'false'"
(change)="onChangeUse($event)" (change)="onChangeUse($event)"
> >
<mat-radio-button value="true">알림 받음</mat-radio-button> <mat-radio-button value="true">{{
<mat-radio-button value="false">알림 받지 않음</mat-radio-button> 'settings.notification.receive' | translate
}}</mat-radio-button>
<mat-radio-button value="false">{{
'settings.notification.notReceive' | translate
}}</mat-radio-button>
</mat-radio-group> </mat-radio-group>
</span> </span>
</mat-list-item> </mat-list-item>
<mat-list-item> <mat-list-item>
<span class="item-title">알림 방법</span> <span class="item-title">{{
'settings.notification.method' | translate
}}</span>
<span class="item-input"> <span class="item-input">
<mat-form-field> <mat-form-field>
<mat-select <mat-select
[value]="setting.method" [value]="setting.method"
(selectionChange)="onSelectionChangeMethod($event)" (selectionChange)="onSelectionChangeMethod($event)"
> >
<mat-option [value]="NotificationMethod.Sound"> <mat-option
소리 *ngFor="let notificationMethod of notificationMethodList"
</mat-option> [value]="notificationMethod.type"
<mat-option [value]="NotificationMethod.Alert"> >
알림창 {{ notificationMethod.name }}
</mat-option>
<mat-option [value]="NotificationMethod.SoundAndAlert">
소리 + 알림창
</mat-option> </mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
@ -39,7 +44,9 @@
</mat-list-item> </mat-list-item>
<mat-list-item> <mat-list-item>
<span class="item-title">알림창 설정</span> <span class="item-title">{{
'settings.notification.settingOfAlertWindow' | translate
}}</span>
<span class="item-input"> <span class="item-input">
<mat-form-field> <mat-form-field>
<mat-select <mat-select
@ -57,34 +64,48 @@
<mat-divider></mat-divider> <mat-divider></mat-divider>
<h1 mat-subheader>모바일</h1> <h1 mat-subheader>{{ 'settings.notification.mobile' | translate }}</h1>
<mat-list-item> <mat-list-item>
<span class="item-title">모바일 알림</span> <span class="item-title">{{
'settings.notification.receiveForMobile' | translate
}}</span>
</mat-list-item> </mat-list-item>
<mat-list-item> <mat-list-item>
<span class="item-input" fullWidth> <span class="item-input" fullWidth>
<mat-checkbox <mat-checkbox
[checked]="setting.receiveForMobile" [checked]="setting.receiveForMobile"
(change)="onChangeReceiveForMobile($event)" (change)="onChangeReceiveForMobile($event)"
>항상 모바일 알림을 받음</mat-checkbox >{{
'settings.notification.receiveForMobileTypeAlways' | translate
}}</mat-checkbox
> >
<br />(해제 시 PC버전이 부재중인 경우에만 모바일 알림을 받음) <br />({{
'settings.notification.descriptionReceiveForMobileTypeAlways'
| translate
}})
</span> </span>
</mat-list-item> </mat-list-item>
<mat-divider></mat-divider> <mat-divider></mat-divider>
<h1 mat-subheader>쪽지</h1> <h1 mat-subheader>{{ 'settings.notification.message' | translate }}</h1>
<mat-list-item> <mat-list-item>
<span class="item-title">쪽지 알림</span> <span class="item-title">{{
'settings.notification.receiveForMessage' | translate
}}</span>
</mat-list-item> </mat-list-item>
<mat-list-item> <mat-list-item>
<span class="item-input" fullWidth> <span class="item-input" fullWidth>
<mat-checkbox <mat-checkbox
[checked]="setting.receiveForMessage" [checked]="setting.receiveForMessage"
(change)="onChangeReceiveForMessage($event)" (change)="onChangeReceiveForMessage($event)"
>쪽지 수신 시 팝업보기</mat-checkbox >{{
'settings.notification.receiveForMessageTypePopup' | translate
}}</mat-checkbox
> >
<br />(해제 시 쪽지 알림만 받음) <br />({{
'settings.notification.descriptionReceiveForMobileTypePopup'
| translate
}})
</span> </span>
</mat-list-item> </mat-list-item>
</mat-list> </mat-list>

View File

@ -4,7 +4,8 @@ import {
ChangeDetectorRef, ChangeDetectorRef,
Input, Input,
Output, Output,
EventEmitter EventEmitter,
OnDestroy
} from '@angular/core'; } from '@angular/core';
import { NotificationSetting } from '../models/settings'; import { NotificationSetting } from '../models/settings';
import { import {
@ -14,28 +15,48 @@ import {
} from '@angular/material'; } from '@angular/material';
import { NGXLogger } from 'ngx-logger'; import { NGXLogger } from 'ngx-logger';
import { NotificationMethod } from '@ucap-webmessenger/core'; import { NotificationMethod } from '@ucap-webmessenger/core';
import { TranslateService } from '@ngx-translate/core';
import { Subscription, merge } from 'rxjs';
@Component({ @Component({
selector: 'ucap-settings-notification', selector: 'ucap-settings-notification',
templateUrl: './notification.component.html', templateUrl: './notification.component.html',
styleUrls: ['./notification.component.scss'] styleUrls: ['./notification.component.scss']
}) })
export class NotificationComponent implements OnInit { export class NotificationComponent implements OnInit, OnDestroy {
@Input() @Input()
setting: NotificationSetting; setting: NotificationSetting;
@Output() @Output()
changed = new EventEmitter<NotificationSetting>(); changed = new EventEmitter<NotificationSetting>();
notificationMethodList: { type: NotificationMethod; name: string }[];
langChangeSubscription: Subscription;
NotificationMethod = NotificationMethod; NotificationMethod = NotificationMethod;
constructor( constructor(
private translateService: TranslateService,
private changeDetectorRef: ChangeDetectorRef, private changeDetectorRef: ChangeDetectorRef,
private logger: NGXLogger private logger: NGXLogger
) {} ) {}
ngOnInit() { ngOnInit() {
this.logger.debug('setting', this.setting); this.logger.debug('setting', this.setting);
this.langChangeSubscription = merge(
this.translateService.onLangChange,
this.translateService.onDefaultLangChange,
this.translateService.onTranslationChange
).subscribe(() => {
this.setNotificationMethodList();
});
}
ngOnDestroy(): void {
if (!!this.langChangeSubscription) {
this.langChangeSubscription.unsubscribe();
}
} }
onChangeUse(event: MatRadioChange) { onChangeUse(event: MatRadioChange) {
@ -62,4 +83,27 @@ export class NotificationComponent implements OnInit {
this.setting = setting; this.setting = setting;
this.changed.emit(this.setting); this.changed.emit(this.setting);
} }
private setNotificationMethodList() {
const langs = this.translateService.instant([
'settings.notification.methodTypeSound',
'settings.notification.methodTypeAlert',
'settings.notification.methodTypeSoundAndAlert'
]);
this.notificationMethodList = [
{
type: NotificationMethod.Sound,
name: langs['settings.notification.methodTypeSound']
},
{
type: NotificationMethod.Alert,
name: langs['settings.notification.methodTypeAlert']
},
{
type: NotificationMethod.SoundAndAlert,
name: langs['settings.notification.methodTypeSoundAndAlert']
}
];
}
} }

View File

@ -20,6 +20,7 @@ import { NotificationComponent } from './components/notification.component';
import { PermissionComponent } from './components/permission.component'; import { PermissionComponent } from './components/permission.component';
import { PrivacyComponent } from './components/privacy.component'; import { PrivacyComponent } from './components/privacy.component';
import { ChatComponent } from './components/chat.component'; import { ChatComponent } from './components/chat.component';
import { TranslateModule } from '@ngx-translate/core';
const COMPONENTS = [ const COMPONENTS = [
CallComponent, CallComponent,
@ -44,7 +45,9 @@ const SERVICES = [];
MatSelectModule, MatSelectModule,
MatSlideToggleModule, MatSlideToggleModule,
MatTabsModule, MatTabsModule,
MatRadioModule MatRadioModule,
TranslateModule
], ],
exports: [...COMPONENTS], exports: [...COMPONENTS],
declarations: [...COMPONENTS] declarations: [...COMPONENTS]