Merge branch 'master' of https://git.loafle.net/ucap-web/next-ucap-messenger
This commit is contained in:
commit
3995f3ef01
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "ucap-webmessenger",
|
"name": "ucap-webmessenger",
|
||||||
"version": "0.0.5",
|
"version": "0.0.6",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "LG CNS",
|
"name": "LG CNS",
|
||||||
"email": "lgucap@lgcns.com"
|
"email": "lgucap@lgcns.com"
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
.left-side-tabs-body {
|
.left-side-tabs-body {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: calc(100% - 60px);
|
|
||||||
div[id^='tabs'] {
|
div[id^='tabs'] {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -31,7 +30,6 @@
|
||||||
|
|
||||||
.mat-tab-group {
|
.mat-tab-group {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 60px;
|
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
</button> -->
|
</button> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-search">
|
<div class="list-search-frame">
|
||||||
<div class="searchbox">
|
<div class="searchbox">
|
||||||
<form [formGroup]="fgSearch" class="w-100-p">
|
<form [formGroup]="fgSearch" class="w-100-p">
|
||||||
<mat-form-field floatLabel="never">
|
<mat-form-field floatLabel="never">
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
</perfect-scrollbar>
|
</perfect-scrollbar>
|
||||||
<!-- <cdk-virtual-scroll-viewport
|
<!-- <cdk-virtual-scroll-viewport
|
||||||
#cvsvChatList
|
#cvsvChatList
|
||||||
itemSize="80"
|
itemSize="60"
|
||||||
perfectScrollbar
|
perfectScrollbar
|
||||||
fxFlexFill
|
fxFlexFill
|
||||||
>
|
>
|
||||||
|
@ -96,7 +96,7 @@
|
||||||
</ucap-room-list-item>
|
</ucap-room-list-item>
|
||||||
</perfect-scrollbar>
|
</perfect-scrollbar>
|
||||||
<!-- <cdk-virtual-scroll-viewport
|
<!-- <cdk-virtual-scroll-viewport
|
||||||
itemSize="20"
|
itemSize="60"
|
||||||
class="app-layout-chat-left-sidenav-chat-list-viewport"
|
class="app-layout-chat-left-sidenav-chat-list-viewport"
|
||||||
>
|
>
|
||||||
<ucap-room-list-item
|
<ucap-room-list-item
|
||||||
|
|
|
@ -13,63 +13,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-search {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
padding: 0;
|
|
||||||
font-size: 14px;
|
|
||||||
background-color: #f9f9f9;
|
|
||||||
border-bottom: 1px solid #dddddd;
|
|
||||||
.searchbox {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
::ng-deep .searchbox {
|
|
||||||
.mat-form-field {
|
|
||||||
display: block;
|
|
||||||
.mat-form-field-wrapper {
|
|
||||||
padding: 0;
|
|
||||||
padding-bottom: 0 !important;
|
|
||||||
height: 100%;
|
|
||||||
.mat-form-field-flex {
|
|
||||||
height: 59px;
|
|
||||||
padding: 0 10px 0 20px;
|
|
||||||
align-items: center;
|
|
||||||
.mat-form-field-infix {
|
|
||||||
width: 100%;
|
|
||||||
font-size: 14px;
|
|
||||||
border: none;
|
|
||||||
min-height: 20px;
|
|
||||||
}
|
|
||||||
.mat-form-field-suffix {
|
|
||||||
.mat-icon {
|
|
||||||
line-height: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.mat-form-field-appearance-legacy {
|
|
||||||
.mat-form-field-wrapper {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.mat-form-field-underline {
|
|
||||||
bottom: 0;
|
|
||||||
background-color: unset !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-layout-chat-left-sidenav-chat-header {
|
.app-layout-chat-left-sidenav-chat-header {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-layout-chat-left-sidenav-chat-list {
|
.app-layout-chat-left-sidenav-chat-list {
|
||||||
height: calc(100% - 120px);
|
//height: calc(100% - 120px);
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-result {
|
.search-result {
|
||||||
height: calc(100% - 130px);
|
//height: calc(100% - 130px);
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
.result-num {
|
.result-num {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
</button> -->
|
</button> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-search">
|
<div class="list-search-frame">
|
||||||
<div class="searchbox">
|
<div class="searchbox">
|
||||||
<form [formGroup]="fgSearch" class="w-100-p">
|
<form [formGroup]="fgSearch" class="w-100-p">
|
||||||
<mat-form-field floatLabel="never">
|
<mat-form-field floatLabel="never">
|
||||||
|
|
|
@ -16,55 +16,6 @@
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-search {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
padding: 0;
|
|
||||||
font-size: 14px;
|
|
||||||
background-color: #f9f9f9;
|
|
||||||
border-bottom: 1px solid #dddddd;
|
|
||||||
.searchbox {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
::ng-deep .searchbox {
|
|
||||||
.mat-form-field {
|
|
||||||
display: block;
|
|
||||||
.mat-form-field-wrapper {
|
|
||||||
padding: 0;
|
|
||||||
padding-bottom: 0 !important;
|
|
||||||
height: 100%;
|
|
||||||
.mat-form-field-flex {
|
|
||||||
height: 59px;
|
|
||||||
padding: 0 10px 0 20px;
|
|
||||||
align-items: center;
|
|
||||||
.mat-form-field-infix {
|
|
||||||
width: 90%;
|
|
||||||
font-size: 14px;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
.mat-form-field-suffix {
|
|
||||||
.mat-icon {
|
|
||||||
line-height: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.mat-form-field-appearance-legacy {
|
|
||||||
.mat-form-field-wrapper {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.mat-form-field-underline {
|
|
||||||
bottom: 0;
|
|
||||||
background-color: unset !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.mat-tab-label-active {
|
.mat-tab-label-active {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +25,7 @@
|
||||||
::ng-deep .message-box {
|
::ng-deep .message-box {
|
||||||
.message-section {
|
.message-section {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: calc(100% - 120px);
|
//height: calc(100% - 120px);
|
||||||
.message-tab {
|
.message-tab {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="!isShowSearch" class="search-list">
|
<div *ngIf="!isShowSearch" class="search-list">
|
||||||
<cdk-virtual-scroll-viewport
|
<cdk-virtual-scroll-viewport
|
||||||
itemSize="64"
|
itemSize="60"
|
||||||
#cvsvDeptUser
|
#cvsvDeptUser
|
||||||
perfectScrollbar
|
perfectScrollbar
|
||||||
fxFlexFill
|
fxFlexFill
|
||||||
|
@ -89,7 +89,7 @@
|
||||||
<div *ngIf="isShowSearch" class="search-result">
|
<div *ngIf="isShowSearch" class="search-result">
|
||||||
<cdk-virtual-scroll-viewport
|
<cdk-virtual-scroll-viewport
|
||||||
#cvsvDeptSearchUser
|
#cvsvDeptSearchUser
|
||||||
itemSize="64"
|
itemSize="60"
|
||||||
perfectScrollbar
|
perfectScrollbar
|
||||||
fxFlexFill
|
fxFlexFill
|
||||||
>
|
>
|
||||||
|
|
|
@ -16,15 +16,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.current-head {
|
.current-head {
|
||||||
/*display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 0 10px;
|
|
||||||
height: 70px;
|
|
||||||
background-color: #eeeeee;
|
|
||||||
background: #f15f79;
|
|
||||||
background: -webkit-linear-gradient(to right, #352a37, #f15f79);
|
|
||||||
background: linear-gradient(to right, #352a37, #ef4c73);
|
|
||||||
color: #ffffff;*/
|
|
||||||
h3 {
|
h3 {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
|
@ -52,7 +43,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.oraganization-tab {
|
.oraganization-tab {
|
||||||
height: calc(100% - 120px);
|
// height: calc(100% - 120px);
|
||||||
flex-direction: inherit;
|
flex-direction: inherit;
|
||||||
display: flex;
|
display: flex;
|
||||||
.oraganization-tab-tree {
|
.oraganization-tab-tree {
|
||||||
|
|
|
@ -82,7 +82,7 @@
|
||||||
{{ roomInfoSubject.value.roomName }}
|
{{ roomInfoSubject.value.roomName }}
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template #roomNameNotExist>
|
<ng-template #roomNameNotExist>
|
||||||
{{ _roomUserInfos | ucapTranslate: 'name':',' }}
|
{{ getRoomNameByRoomUser(_roomUserInfos) }}
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -6,7 +6,8 @@ import {
|
||||||
AfterViewInit,
|
AfterViewInit,
|
||||||
Output,
|
Output,
|
||||||
EventEmitter,
|
EventEmitter,
|
||||||
Inject
|
Inject,
|
||||||
|
ChangeDetectorRef
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import {
|
import {
|
||||||
ucapAnimations,
|
ucapAnimations,
|
||||||
|
@ -67,7 +68,12 @@ import {
|
||||||
RightDrawer,
|
RightDrawer,
|
||||||
KEY_STICKER_HISTORY
|
KEY_STICKER_HISTORY
|
||||||
} from '@app/types';
|
} from '@app/types';
|
||||||
import { RoomInfo, UserInfo, RoomType } from '@ucap-webmessenger/protocol-room';
|
import {
|
||||||
|
RoomInfo,
|
||||||
|
UserInfo,
|
||||||
|
RoomType,
|
||||||
|
UserInfoShort
|
||||||
|
} from '@ucap-webmessenger/protocol-room';
|
||||||
import { tap, take, map, catchError, finalize } from 'rxjs/operators';
|
import { tap, take, map, catchError, finalize } from 'rxjs/operators';
|
||||||
import {
|
import {
|
||||||
FormComponent as UCapUiChatFormComponent,
|
FormComponent as UCapUiChatFormComponent,
|
||||||
|
@ -119,6 +125,8 @@ import {
|
||||||
} from '../dialogs/chat/mass-detail.component';
|
} from '../dialogs/chat/mass-detail.component';
|
||||||
import { NativeService, UCAP_NATIVE_SERVICE } from '@ucap-webmessenger/native';
|
import { NativeService, UCAP_NATIVE_SERVICE } from '@ucap-webmessenger/native';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
import { TranslatePipe } from 'projects/ucap-webmessenger-ui/src/lib/pipes/translate.pipe';
|
||||||
|
import { TranslateService as UiTranslateService } from '@ucap-webmessenger/ui';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-layout-messenger-messages',
|
selector: 'app-layout-messenger-messages',
|
||||||
|
@ -223,7 +231,9 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
private localStorageService: LocalStorageService,
|
private localStorageService: LocalStorageService,
|
||||||
private commonApiService: CommonApiService,
|
private commonApiService: CommonApiService,
|
||||||
private clipboardService: ClipboardService,
|
private clipboardService: ClipboardService,
|
||||||
|
private uiTranslateService: UiTranslateService,
|
||||||
private translateService: TranslateService,
|
private translateService: TranslateService,
|
||||||
|
private changeDetectorRef: ChangeDetectorRef,
|
||||||
private dialogService: DialogService,
|
private dialogService: DialogService,
|
||||||
private snackBarService: SnackBarService,
|
private snackBarService: SnackBarService,
|
||||||
@Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService,
|
@Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService,
|
||||||
|
@ -461,6 +471,18 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getRoomNameByRoomUser(roomUserInfos: (UserInfo | UserInfoShort)[]) {
|
||||||
|
let roomName = new TranslatePipe(
|
||||||
|
this.uiTranslateService,
|
||||||
|
this.changeDetectorRef
|
||||||
|
).transform(roomUserInfos, 'name', ',');
|
||||||
|
|
||||||
|
if (!roomName || roomName.trim().length === 0) {
|
||||||
|
roomName = this.translateService.instant('chat.noRoomUser');
|
||||||
|
}
|
||||||
|
return roomName;
|
||||||
|
}
|
||||||
|
|
||||||
/** 대화전송 가능한 방인지 판단 */
|
/** 대화전송 가능한 방인지 판단 */
|
||||||
getEnableSend() {
|
getEnableSend() {
|
||||||
if (!this.roomInfoSubject.value) {
|
if (!this.roomInfoSubject.value) {
|
||||||
|
@ -1505,13 +1527,11 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!!result && !!result.choice && result.choice) {
|
if (!!result && !!result.choice && result.choice) {
|
||||||
const userSeqs: number[] = this.userInfoListSubject.value.map(
|
// include me here..
|
||||||
userInfo => {
|
const userSeqs: number[] = this.userInfoListSubject.value
|
||||||
if (userInfo.isJoinRoom) {
|
.filter(userInfo => userInfo.isJoinRoom)
|
||||||
return userInfo.seq;
|
.map(userInfo => userInfo.seq);
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (
|
if (
|
||||||
!!result.selectedUserList &&
|
!!result.selectedUserList &&
|
||||||
result.selectedUserList.length > 0
|
result.selectedUserList.length > 0
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
/>
|
/>
|
||||||
<video
|
<video
|
||||||
controls
|
controls
|
||||||
|
controlsList="nodownload nofullscreen"
|
||||||
*ngIf="selectedFile.info.type === FileType.Video"
|
*ngIf="selectedFile.info.type === FileType.Video"
|
||||||
[src]="getImageUrl(selectedFile)"
|
[src]="getImageUrl(selectedFile)"
|
||||||
class="preview-video"
|
class="preview-video"
|
||||||
|
|
|
@ -14,7 +14,7 @@ import * as AppStore from '@app/store';
|
||||||
import * as SyncStore from '@app/store/messenger/sync';
|
import * as SyncStore from '@app/store/messenger/sync';
|
||||||
import * as RoomStore from '@app/store/messenger/room';
|
import * as RoomStore from '@app/store/messenger/room';
|
||||||
|
|
||||||
import { UserInfo, RoomInfo } from '@ucap-webmessenger/protocol-room';
|
import { UserInfo, RoomInfo, RoomType } from '@ucap-webmessenger/protocol-room';
|
||||||
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
|
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
|
||||||
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
|
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
|
||||||
import {
|
import {
|
||||||
|
@ -154,11 +154,11 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!!result && !!result.choice && result.choice) {
|
if (!!result && !!result.choice && result.choice) {
|
||||||
const userSeqs: number[] = this.userInfoList.map(userInfo => {
|
// include me here..
|
||||||
if (userInfo.isJoinRoom) {
|
const userSeqs: number[] = this.userInfoList
|
||||||
return userInfo.seq;
|
.filter(userInfo => userInfo.isJoinRoom)
|
||||||
}
|
.map(userInfo => userInfo.seq);
|
||||||
});
|
|
||||||
if (!!result.selectedUserList && result.selectedUserList.length > 0) {
|
if (!!result.selectedUserList && result.selectedUserList.length > 0) {
|
||||||
result.selectedUserList.forEach(user => {
|
result.selectedUserList.forEach(user => {
|
||||||
if (userSeqs.indexOf(user.seq) < 0) {
|
if (userSeqs.indexOf(user.seq) < 0) {
|
||||||
|
@ -168,9 +168,6 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userSeqs.length > 0) {
|
if (userSeqs.length > 0) {
|
||||||
// include me
|
|
||||||
userSeqs.push(this.loginRes.userSeq);
|
|
||||||
|
|
||||||
this.store.dispatch(
|
this.store.dispatch(
|
||||||
RoomStore.inviteOrOpen({
|
RoomStore.inviteOrOpen({
|
||||||
req: {
|
req: {
|
||||||
|
@ -220,6 +217,9 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
if (this.roomInfo.roomType !== RoomType.Multi) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (buddy.seq === this.loginRes.userSeq) {
|
if (buddy.seq === this.loginRes.userSeq) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -424,7 +424,7 @@ export class MessageDetailDialogComponent implements OnInit {
|
||||||
// single :: success
|
// single :: success
|
||||||
this.snackBarService.open(
|
this.snackBarService.open(
|
||||||
this.translateService.instant(
|
this.translateService.instant(
|
||||||
'common.file.errors.savedToPath',
|
'common.file.results.savedToPath',
|
||||||
{ path: attachFile.downloadType }
|
{ path: attachFile.downloadType }
|
||||||
),
|
),
|
||||||
'',
|
'',
|
||||||
|
@ -437,7 +437,7 @@ export class MessageDetailDialogComponent implements OnInit {
|
||||||
// all
|
// all
|
||||||
this.snackBarService.open(
|
this.snackBarService.open(
|
||||||
this.translateService.instant(
|
this.translateService.instant(
|
||||||
'common.file.errors.savedAll'
|
'common.file.results.savedAll'
|
||||||
),
|
),
|
||||||
'',
|
'',
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<div class="item-list">
|
<div class="item-list">
|
||||||
<cdk-virtual-scroll-viewport
|
<cdk-virtual-scroll-viewport
|
||||||
itemSize="64"
|
itemSize="60"
|
||||||
#cvsvDeptUser
|
#cvsvDeptUser
|
||||||
perfectScrollbar
|
perfectScrollbar
|
||||||
fxFlexFill
|
fxFlexFill
|
||||||
|
|
|
@ -2,17 +2,13 @@
|
||||||
.app-layout-native-title-bar {
|
.app-layout-native-title-bar {
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-webkit-app-region: drag;
|
-webkit-app-region: drag;
|
||||||
|
|
||||||
position: fixed;
|
position: fixed;
|
||||||
right: 0;
|
right: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
height: 60px;
|
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
//background: rgba(37, 27, 30, 0.9);
|
|
||||||
//border-bottom: 1px solid #d5dadb;
|
|
||||||
|
|
||||||
.app-layout-native-title-bar-logo {
|
.app-layout-native-title-bar-logo {
|
||||||
width: 32px;
|
width: 32px;
|
||||||
|
|
|
@ -33,6 +33,7 @@ import { AppUserInfo, KEY_APP_USER_INFO } from '@app/types/app-user-info.type';
|
||||||
import { LogoutInfo, KEY_LOGOUT_INFO } from '@app/types';
|
import { LogoutInfo, KEY_LOGOUT_INFO } from '@app/types';
|
||||||
import { AppAuthenticationService } from '@app/services/authentication.service';
|
import { AppAuthenticationService } from '@app/services/authentication.service';
|
||||||
import { logoutInitialize } from '@app/store/account/authentication';
|
import { logoutInitialize } from '@app/store/account/authentication';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-page-account-login',
|
selector: 'app-page-account-login',
|
||||||
|
@ -85,6 +86,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
|
||||||
constructor(
|
constructor(
|
||||||
private store: Store<any>,
|
private store: Store<any>,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
|
private translateService: TranslateService,
|
||||||
private dialogService: DialogService,
|
private dialogService: DialogService,
|
||||||
private protocolService: ProtocolService,
|
private protocolService: ProtocolService,
|
||||||
private localStorageService: LocalStorageService,
|
private localStorageService: LocalStorageService,
|
||||||
|
@ -114,7 +116,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
|
||||||
(this.rotateInfomationIndex + 1) % this.rotateInfomation.length;
|
(this.rotateInfomationIndex + 1) % this.rotateInfomation.length;
|
||||||
}, 8000);
|
}, 8000);
|
||||||
|
|
||||||
this.defatulLoginBtnText = 'LOGIN';
|
this.defatulLoginBtnText = this.translateService.instant('accounts.login');
|
||||||
this.defatulWaitingTime = 5 * 60; // sec
|
this.defatulWaitingTime = 5 * 60; // sec
|
||||||
|
|
||||||
this.store.dispatch(
|
this.store.dispatch(
|
||||||
|
@ -140,8 +142,10 @@ export class LoginPageComponent implements OnInit, OnDestroy {
|
||||||
>(AlertDialogComponent, {
|
>(AlertDialogComponent, {
|
||||||
width: '360px',
|
width: '360px',
|
||||||
data: {
|
data: {
|
||||||
title: '로그인',
|
title: '',
|
||||||
html: `아이디 또는 패스워드가<br/>일치하지 않습니다.`
|
html: this.translateService.instant(
|
||||||
|
'accounts.errors.loginFail'
|
||||||
|
)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -154,8 +158,10 @@ export class LoginPageComponent implements OnInit, OnDestroy {
|
||||||
>(AlertDialogComponent, {
|
>(AlertDialogComponent, {
|
||||||
width: '360px',
|
width: '360px',
|
||||||
data: {
|
data: {
|
||||||
title: '로그인',
|
title: '',
|
||||||
html: `비밀번호 오류 횟수 초과입니다.<br/>비밀번호를 확인하신 후<br/>잠시 후 다시 시작해 주세요.`
|
html: this.translateService.instant(
|
||||||
|
'accounts.errors.loginFailOverTry'
|
||||||
|
)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -182,11 +188,26 @@ export class LoginPageComponent implements OnInit, OnDestroy {
|
||||||
KEY_LOGOUT_INFO
|
KEY_LOGOUT_INFO
|
||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (!!personLogout && !!personLogout.reasonCode) {
|
||||||
!!personLogout &&
|
let msg = this.translateService.instant('accounts.results.doLogout');
|
||||||
!!personLogout.reasonCode &&
|
switch (personLogout.reasonCode) {
|
||||||
personLogout.reasonCode === ServerErrorCode.ERRCD_DUPLICATE
|
case ServerErrorCode.ERRCD_DUPLICATE:
|
||||||
) {
|
msg = this.translateService.instant(
|
||||||
|
'accounts.results.doLogoutDuplicate',
|
||||||
|
{
|
||||||
|
ip: personLogout.ip,
|
||||||
|
mac: personLogout.mac
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case ServerErrorCode.ERRCD_FORCE_INIT:
|
||||||
|
msg = this.translateService.instant(
|
||||||
|
'accounts.results.doLogoutByOthers'
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
const result = this.dialogService.open<
|
const result = this.dialogService.open<
|
||||||
AlertDialogComponent,
|
AlertDialogComponent,
|
||||||
AlertDialogData,
|
AlertDialogData,
|
||||||
|
@ -195,7 +216,7 @@ export class LoginPageComponent implements OnInit, OnDestroy {
|
||||||
width: '360px',
|
width: '360px',
|
||||||
data: {
|
data: {
|
||||||
title: '',
|
title: '',
|
||||||
html: `다른 디바이스에서 로그인하였습니다.<br/> * Ip : ${personLogout.ip}<br/> * Mac : ${personLogout.mac}`
|
html: msg
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -206,7 +227,9 @@ export class LoginPageComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
// Daesang..
|
// Daesang..
|
||||||
this.fixedCompany = environment.companyConfig.fixedCompanyCode;
|
this.fixedCompany = environment.companyConfig.fixedCompanyCode;
|
||||||
this.fixedNotiBtnText = '이용 주의사항';
|
this.fixedNotiBtnText = this.translateService.instant(
|
||||||
|
'accounts.usageNotes'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: row;
|
flex-flow: row;
|
||||||
padding-top: 57px;
|
|
||||||
border-top: none;
|
border-top: none;
|
||||||
.split-area {
|
.split-area {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
|
@ -110,5 +110,27 @@ export class AppAuthenticationService {
|
||||||
this.sessionStorageService.remove(KEY_LOGIN_INFO);
|
this.sessionStorageService.remove(KEY_LOGIN_INFO);
|
||||||
this.sessionStorageService.remove(KEY_URL_INFO);
|
this.sessionStorageService.remove(KEY_URL_INFO);
|
||||||
this.sessionStorageService.remove(KEY_AUTH_INFO);
|
this.sessionStorageService.remove(KEY_AUTH_INFO);
|
||||||
|
|
||||||
|
let appUserInfo = this.localStorageService.encGet<AppUserInfo>(
|
||||||
|
KEY_APP_USER_INFO,
|
||||||
|
environment.customConfig.appKey
|
||||||
|
);
|
||||||
|
|
||||||
|
appUserInfo = {
|
||||||
|
...appUserInfo,
|
||||||
|
settings: {
|
||||||
|
...appUserInfo.settings,
|
||||||
|
general: {
|
||||||
|
...appUserInfo.settings.general,
|
||||||
|
autoLogin: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.localStorageService.encSet<AppUserInfo>(
|
||||||
|
KEY_APP_USER_INFO,
|
||||||
|
appUserInfo,
|
||||||
|
environment.customConfig.appKey
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,6 +113,7 @@ import { MessageType } from '@ucap-webmessenger/api-message';
|
||||||
import { LogoutInfo, KEY_LOGOUT_INFO } from '@app/types';
|
import { LogoutInfo, KEY_LOGOUT_INFO } from '@app/types';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { deleteMessageSuccess } from '@app/store/messenger/message';
|
import { deleteMessageSuccess } from '@app/store/messenger/message';
|
||||||
|
import { ServerErrorCode } from '@ucap-webmessenger/protocol';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AppNotificationService {
|
export class AppNotificationService {
|
||||||
|
@ -161,6 +162,12 @@ export class AppNotificationService {
|
||||||
'Notification::authenticationProtocolService::LogoutRemoteNotification',
|
'Notification::authenticationProtocolService::LogoutRemoteNotification',
|
||||||
noti
|
noti
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.sessionStorageService.set<LogoutInfo>(KEY_LOGOUT_INFO, {
|
||||||
|
personLogout: true,
|
||||||
|
reasonCode: ServerErrorCode.ERRCD_FORCE_INIT,
|
||||||
|
forceType: noti.requestDeviceType
|
||||||
|
} as LogoutInfo);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -5,4 +5,5 @@ export interface LogoutInfo {
|
||||||
reasonCode?: number;
|
reasonCode?: number;
|
||||||
ip?: string;
|
ip?: string;
|
||||||
mac?: string;
|
mac?: string;
|
||||||
|
forceType?: string;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,15 @@
|
||||||
"consentOfPrivacy": "Agreement of ",
|
"consentOfPrivacy": "Agreement of ",
|
||||||
"changePassword": "Change password",
|
"changePassword": "Change password",
|
||||||
"resetPassword": "Reset password",
|
"resetPassword": "Reset password",
|
||||||
|
"usageNotes": "Usage Notes",
|
||||||
"passwordExpired": "Password expired",
|
"passwordExpired": "Password expired",
|
||||||
"descriptionOfPasswordExpired": "Password has expired.<br/>Please change your password and log in again.",
|
"descriptionOfPasswordExpired": "Password has expired.<br/>Please change your password and log in again.",
|
||||||
"confirmLogout": "Do you want to log out?",
|
"confirmLogout": "Do you want to log out?",
|
||||||
"results": {
|
"results": {
|
||||||
"changedPassword": "Password changed. Please log in again."
|
"changedPassword": "Password changed. Please log in again.",
|
||||||
|
"doLogout": "You have been logged out.",
|
||||||
|
"doLogoutDuplicate": "You logged in from another device.<br/> * Ip : {{ip}}<br/> * Mac : {{mac}}",
|
||||||
|
"doLogoutByOthers": "Forced logout by user."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"requireLoginId": "Login ID is required.",
|
"requireLoginId": "Login ID is required.",
|
||||||
|
@ -38,7 +42,9 @@
|
||||||
"notAllowedConsecutiveAlphaNumOver3TimesForPassword": "You cannot use consecutive numbers or letters more than 3 times.",
|
"notAllowedConsecutiveAlphaNumOver3TimesForPassword": "You cannot use consecutive numbers or letters more than 3 times.",
|
||||||
"notSatisfiedCombineForPassword": "Combination of two or more kinds of letters, numbers and special characters.",
|
"notSatisfiedCombineForPassword": "Combination of two or more kinds of letters, numbers and special characters.",
|
||||||
"minLengthCombineForPassword": "Password must be {{lengthOfPassword}} characters if {{countOfCombine}} combination.",
|
"minLengthCombineForPassword": "Password must be {{lengthOfPassword}} characters if {{countOfCombine}} combination.",
|
||||||
"failToChangePassword": "Failed to change password."
|
"failToChangePassword": "Failed to change password.",
|
||||||
|
"loginFail": "Username or password do not match.",
|
||||||
|
"loginFailOverTry": "Password error count exceeded. <br/> Check your password <br/> Please try again later."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
|
@ -203,6 +209,7 @@
|
||||||
"btnAttachFile": "Attach files",
|
"btnAttachFile": "Attach files",
|
||||||
"btnSticker": "Sticker",
|
"btnSticker": "Sticker",
|
||||||
"btnTranslate": "Translate",
|
"btnTranslate": "Translate",
|
||||||
|
"noRoomUser": "No chat users",
|
||||||
"event": {
|
"event": {
|
||||||
"inviteToRoomWith": "{{owner}} invited {{inviter}}.",
|
"inviteToRoomWith": "{{owner}} invited {{inviter}}.",
|
||||||
"exitFromRoomWith": "{{exitor}} has left.",
|
"exitFromRoomWith": "{{exitor}} has left.",
|
||||||
|
|
|
@ -15,11 +15,15 @@
|
||||||
"consentOfPrivacy": "개인정보 동의",
|
"consentOfPrivacy": "개인정보 동의",
|
||||||
"changePassword": "비밀번호 변경",
|
"changePassword": "비밀번호 변경",
|
||||||
"resetPassword": "비밀번호 초기화",
|
"resetPassword": "비밀번호 초기화",
|
||||||
|
"usageNotes": "이용 주의사항",
|
||||||
"passwordExpired": "비밀번호 만기",
|
"passwordExpired": "비밀번호 만기",
|
||||||
"descriptionOfPasswordExpired": "비밀번호가 만료되었습니다.<br/>비밀번호 변경 후 다시 로그인 하세요.",
|
"descriptionOfPasswordExpired": "비밀번호가 만료되었습니다.<br/>비밀번호 변경 후 다시 로그인 하세요.",
|
||||||
"confirmLogout": "로그아웃 하시겠습니까?",
|
"confirmLogout": "로그아웃 하시겠습니까?",
|
||||||
"results": {
|
"results": {
|
||||||
"changedPassword": "비밀번호가 변경되었습니다. 다시 로그인하여 주십시오"
|
"changedPassword": "비밀번호가 변경되었습니다. 다시 로그인하여 주십시오",
|
||||||
|
"doLogout": "로그아웃 되었습니다.",
|
||||||
|
"doLogoutDuplicate": "다른 디바이스에서 로그인하였습니다.<br/> * Ip : {{ip}}<br/> * Mac : {{mac}}",
|
||||||
|
"doLogoutByOthers": "사용자에 의해 강제로그아웃 하였습니다."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"requireLoginId": "로그인 아이디를 입력해 주세요.",
|
"requireLoginId": "로그인 아이디를 입력해 주세요.",
|
||||||
|
@ -38,7 +42,9 @@
|
||||||
"notAllowedConsecutiveAlphaNumOver3TimesForPassword": "연속되는 숫자나 문자를 3번이상 사용할 수 없습니다",
|
"notAllowedConsecutiveAlphaNumOver3TimesForPassword": "연속되는 숫자나 문자를 3번이상 사용할 수 없습니다",
|
||||||
"notSatisfiedCombineForPassword": "문자, 숫자, 특수문자 중 2종류 이상 조합을 해야 합니다",
|
"notSatisfiedCombineForPassword": "문자, 숫자, 특수문자 중 2종류 이상 조합을 해야 합니다",
|
||||||
"minLengthCombineForPassword": "비밀번호는 {{countOfCombine}}가지가 조합된 경우 {{lengthOfPassword}}자를 넘어야 합니다",
|
"minLengthCombineForPassword": "비밀번호는 {{countOfCombine}}가지가 조합된 경우 {{lengthOfPassword}}자를 넘어야 합니다",
|
||||||
"failToChangePassword": "비밀번호 변경에 실패하였습니다."
|
"failToChangePassword": "비밀번호 변경에 실패하였습니다.",
|
||||||
|
"loginFail": "아이디 또는 패스워드가<br/>일치하지 않습니다.",
|
||||||
|
"loginFailOverTry": "비밀번호 오류 횟수 초과입니다.<br/>비밀번호를 확인하신 후<br/>잠시 후 다시 시작해 주세요."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
|
@ -203,6 +209,7 @@
|
||||||
"btnAttachFile": "첨부파일",
|
"btnAttachFile": "첨부파일",
|
||||||
"btnSticker": "스티커",
|
"btnSticker": "스티커",
|
||||||
"btnTranslate": "번역",
|
"btnTranslate": "번역",
|
||||||
|
"noRoomUser": "대화상대 없음",
|
||||||
"event": {
|
"event": {
|
||||||
"inviteToRoomWith": "{{owner}}이 {{inviter}}을 초대했습니다.",
|
"inviteToRoomWith": "{{owner}}이 {{inviter}}을 초대했습니다.",
|
||||||
"exitFromRoomWith": "{{exitor}}님이 퇴장하셨습니다.",
|
"exitFromRoomWith": "{{exitor}}님이 퇴장하셨습니다.",
|
||||||
|
|
|
@ -16,7 +16,7 @@ body {
|
||||||
color: #333;
|
color: #333;
|
||||||
font-family: '나눔고딕', Malgun Gothic, '맑은고딕', Arial, Dotum, '돋움',
|
font-family: '나눔고딕', Malgun Gothic, '맑은고딕', Arial, Dotum, '돋움',
|
||||||
Gulim, '굴림';
|
Gulim, '굴림';
|
||||||
font-size: 13px;
|
font-size: 14px;
|
||||||
line-height: 18px !important;
|
line-height: 18px !important;
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
-moz-box-sizing: border-box;
|
-moz-box-sizing: border-box;
|
||||||
|
@ -259,7 +259,7 @@ $daesang-grey: (
|
||||||
background-color: mat-color($accent, B100);
|
background-color: mat-color($accent, B100);
|
||||||
}
|
}
|
||||||
.main-container {
|
.main-container {
|
||||||
border: 3px solid mat-color($accent, B100);
|
border-color: mat-color($accent, B100);
|
||||||
}
|
}
|
||||||
.global-menu {
|
.global-menu {
|
||||||
background-color: mat-color($accent, B100);
|
background-color: mat-color($accent, B100);
|
||||||
|
@ -337,7 +337,6 @@ $daesang-grey: (
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
height: 60px;
|
|
||||||
background-color: #eeeeee;
|
background-color: #eeeeee;
|
||||||
background: $gradient-light;
|
background: $gradient-light;
|
||||||
background: -webkit-linear-gradient(
|
background: -webkit-linear-gradient(
|
||||||
|
@ -349,10 +348,6 @@ $daesang-grey: (
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-search{
|
|
||||||
height:60px;
|
|
||||||
}
|
|
||||||
|
|
||||||
mat-tab-group[vertical] {
|
mat-tab-group[vertical] {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
|
|
@ -46,8 +46,10 @@ export const decodeLogoutRemote: ProtocolDecoder<LogoutRemoteResponse> = (
|
||||||
} as LogoutRemoteResponse);
|
} as LogoutRemoteResponse);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const decodeLogoutRemoteNotification: ProtocolDecoder<
|
export const decodeLogoutRemoteNotification: ProtocolDecoder<LogoutRemoteNotification> = (
|
||||||
LogoutRemoteNotification
|
message: ProtocolMessage
|
||||||
> = (message: ProtocolMessage) => {
|
) => {
|
||||||
return { requestDeviceType: message.bodyList[0] } as LogoutRemoteNotification;
|
return decodeProtocolMessage(message, {
|
||||||
|
requestDeviceType: message.bodyList[0]
|
||||||
|
} as LogoutRemoteNotification);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<cdk-virtual-scroll-viewport
|
<cdk-virtual-scroll-viewport
|
||||||
#cvsvGroup
|
#cvsvGroup
|
||||||
itemSize="64"
|
itemSize="60"
|
||||||
perfectScrollbar
|
perfectScrollbar
|
||||||
fxFlexFill
|
fxFlexFill
|
||||||
>
|
>
|
||||||
|
|
|
@ -13,8 +13,6 @@
|
||||||
|
|
||||||
.tree-node-frame {
|
.tree-node-frame {
|
||||||
border-bottom: 1px solid #dddddd;
|
border-bottom: 1px solid #dddddd;
|
||||||
height: 64px;
|
|
||||||
|
|
||||||
.tree-node-header {
|
.tree-node-header {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
*ngIf="!!message.resType && message.resType === ContentType.AttachFile"
|
*ngIf="!!message.resType && message.resType === ContentType.AttachFile"
|
||||||
>attach_file</mat-icon
|
>attach_file</mat-icon
|
||||||
>
|
>
|
||||||
{{ message.title }}
|
<span class="final-message">{{ message.title }}</span>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<div class="date">
|
<div class="date">
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
.message-list {
|
.message-list {
|
||||||
&.list-item {
|
&.list-item {
|
||||||
dl {
|
dl {
|
||||||
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: column;
|
flex-flow: column;
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
width: calc(100% - 80px);
|
width: calc(100% - 90px);
|
||||||
dt {
|
dt {
|
||||||
.name {
|
.name {
|
||||||
font-size: 1.1em;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
display: block;
|
display: block;
|
||||||
|
@ -22,21 +22,21 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
dd {
|
dd {
|
||||||
color: #777777;
|
display: flex;
|
||||||
white-space: nowrap;
|
|
||||||
word-wrap: normal;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
justify-items: center;
|
||||||
font-size: 0.9em;
|
.final-message {
|
||||||
|
white-space: nowrap;
|
||||||
|
word-wrap: normal;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.date {
|
.date {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: column;
|
flex-flow: column;
|
||||||
font-size: 0.9em;
|
|
||||||
height: 40px;
|
height: 40px;
|
||||||
.noti-new {
|
.noti-new {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<div class="list-search">
|
<div class="list-search-frame">
|
||||||
<div class="selectbox">
|
<div class="selectbox">
|
||||||
<!--<mat-label>회사선택</mat-label>-->
|
<!--<mat-label>회사선택</mat-label>-->
|
||||||
<mat-select [(value)]="companyCode">
|
<mat-select [(value)]="companyCode">
|
||||||
|
@ -30,16 +30,3 @@
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!--검색창만 있는 경우--------------------------------------------------------------------------
|
|
||||||
<div class="list-search">
|
|
||||||
<div class="searchbox">
|
|
||||||
<input
|
|
||||||
matInput
|
|
||||||
#searchWordInput
|
|
||||||
placeholder="name"
|
|
||||||
(keydown.enter)="onKeyDownEnter(searchWordInput.value)"
|
|
||||||
/>
|
|
||||||
<div class="btn-search"><i class="material-icons">search</i></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
|
|
|
@ -11,55 +11,3 @@
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-search {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
position: relative;
|
|
||||||
height: 60px;
|
|
||||||
align-items: center;
|
|
||||||
padding: 0 10px 0 20px;
|
|
||||||
font-size: 14px;
|
|
||||||
background-color: #f9f9f9;
|
|
||||||
border-bottom: 1px solid #dddddd;
|
|
||||||
.selectbox {
|
|
||||||
display: inline-flex;
|
|
||||||
width: 38%;
|
|
||||||
margin-right: 2%;
|
|
||||||
}
|
|
||||||
.searchbox {
|
|
||||||
width: 60%;
|
|
||||||
display: flex;
|
|
||||||
input {
|
|
||||||
display: inline-flex;
|
|
||||||
width: 100%;
|
|
||||||
font-size: 14px;
|
|
||||||
padding-left: 0;
|
|
||||||
&:focus {
|
|
||||||
& + .mat-form-field-label-wrapper {
|
|
||||||
.mat-form-field-appearance-legacy {
|
|
||||||
.mat-form-field-label {
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn-search {
|
|
||||||
color: #777777;
|
|
||||||
font-size: 12px;
|
|
||||||
display: inline-flex;
|
|
||||||
margin-left: auto;
|
|
||||||
flex: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.selectbox {
|
|
||||||
display: inline-flex;
|
|
||||||
width: 45%;
|
|
||||||
margin-right: 1%;
|
|
||||||
}
|
|
||||||
+ .searchbox {
|
|
||||||
width: 54%;
|
|
||||||
display: inline-flex;
|
|
||||||
}
|
|
||||||
|
|
|
@ -16,22 +16,22 @@
|
||||||
</div>
|
</div>
|
||||||
<span
|
<span
|
||||||
*ngIf="getPresence(PresenceType.MOBILE) === 'mobileOn'"
|
*ngIf="getPresence(PresenceType.MOBILE) === 'mobileOn'"
|
||||||
class="text-accent-color badge-mobile-state"
|
class="text-accent-color marker-mobile-state"
|
||||||
>
|
>
|
||||||
<mat-icon>phone_android</mat-icon>
|
<mat-icon>phone_android</mat-icon>
|
||||||
</span>
|
</span>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="info">
|
<dd class="info">
|
||||||
<div class="detail">
|
<div class="user-info">
|
||||||
<div class="user-info">
|
<div class="user">
|
||||||
<span
|
<span
|
||||||
*ngIf="getWorkstatusInfo('text').length > 0"
|
*ngIf="getWorkstatusInfo('text').length > 0"
|
||||||
class="work-status"
|
class="work-status"
|
||||||
[ngClass]="getWorkstatusInfo('style')"
|
[ngClass]="getWorkstatusInfo('style')"
|
||||||
>{{ getWorkstatusInfo('text') }}</span
|
>{{ getWorkstatusInfo('text') }}</span
|
||||||
>
|
>
|
||||||
<span class="name">
|
<span class="detail">
|
||||||
<b>{{ userInfo | ucapTranslate: 'name' }}</b>
|
<b class="name">{{ userInfo | ucapTranslate: 'name' }}</b>
|
||||||
<span class="grade">{{ userInfo | ucapTranslate: 'grade' }}</span>
|
<span class="grade">{{ userInfo | ucapTranslate: 'grade' }}</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -48,16 +48,6 @@ $thumbnail-msize: 40px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*.list-item {
|
|
||||||
@extend %list-item;
|
|
||||||
&:hover {
|
|
||||||
background-color: $bg-list-hover;
|
|
||||||
}
|
|
||||||
.mat-checkbox {
|
|
||||||
padding-left: 10px;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
.item-default {
|
.item-default {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -77,36 +67,29 @@ $thumbnail-msize: 40px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
width: calc(100% - 50px);
|
width: calc(100% - 50px);
|
||||||
transform: translateY(2px);
|
transform: translateY(2px);
|
||||||
.detail {
|
.user-info {
|
||||||
.user-info {
|
.user {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: row;
|
flex-flow: row;
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
.work-status {
|
.work-status {
|
||||||
margin-right: 4px;
|
display: inline-flex;
|
||||||
border-radius: 4px;
|
justify-content: center;
|
||||||
padding: 0 6px;
|
|
||||||
color: #ffffff;
|
|
||||||
font-size: 0.9em;
|
|
||||||
width: 40px;
|
|
||||||
justify-items: center;
|
justify-items: center;
|
||||||
|
color: #ffffff;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
min-width: 32px;
|
||||||
|
margin-right: 4px;
|
||||||
|
border-radius: 24px;
|
||||||
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
.name {
|
.detail {
|
||||||
margin-bottom: 2px;
|
|
||||||
color: $font-dark;
|
color: $font-dark;
|
||||||
width: calc(100% - 40px);
|
width: calc(100% - 40px);
|
||||||
@include ellipsis(1);
|
@include ellipsis(1);
|
||||||
b {
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
.grade {
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.dept {
|
.dept {
|
||||||
font-size: 0.9em;
|
|
||||||
color: $font-mid;
|
color: $font-mid;
|
||||||
@include ellipsis(1);
|
@include ellipsis(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
[default]="defaultPath"
|
[default]="defaultPath"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<span *ngIf="roomInfo.isTimeRoom" class="text-warn-color badge-timer">
|
<span *ngIf="roomInfo.isTimeRoom" class="text-warn-color marker-timer">
|
||||||
<mat-icon>timer</mat-icon>
|
<mat-icon>timer</mat-icon>
|
||||||
</span>
|
</span>
|
||||||
<!-- <div style="position: relative;">
|
<!-- <div style="position: relative;">
|
||||||
|
@ -24,8 +24,8 @@
|
||||||
</div> -->
|
</div> -->
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="info">
|
<dd class="info">
|
||||||
<div class="detail">
|
<div class="room-info">
|
||||||
<div class="room-name">
|
<div class="detail">
|
||||||
<div class="name">
|
<div class="name">
|
||||||
<ng-container [ngSwitch]="roomInfo.roomType">
|
<ng-container [ngSwitch]="roomInfo.roomType">
|
||||||
<ng-container *ngSwitchCase="RoomType.Mytalk">
|
<ng-container *ngSwitchCase="RoomType.Mytalk">
|
||||||
|
@ -51,13 +51,13 @@
|
||||||
{{ roomInfo.roomName }}
|
{{ roomInfo.roomName }}
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template #roomNameNotExist>
|
<ng-template #roomNameNotExist>
|
||||||
{{ _roomUserInfos | ucapTranslate: 'name':',' }}
|
{{ getRoomNameByRoomUser(_roomUserInfos) }}
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="num bg-accent-light"
|
class="member bg-accent-light"
|
||||||
*ngIf="roomInfo.roomType === RoomType.Multi"
|
*ngIf="roomInfo.roomType === RoomType.Multi"
|
||||||
>
|
>
|
||||||
{{ roomInfo.joinUserCount }}{{ 'common.units.persons' | translate }}
|
{{ roomInfo.joinUserCount }}{{ 'common.units.persons' | translate }}
|
||||||
|
@ -66,7 +66,7 @@
|
||||||
<mat-icon>notifications_off</mat-icon>
|
<mat-icon>notifications_off</mat-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="room-msg">
|
<div class="final-message">
|
||||||
{{ finalEventMessage }}
|
{{ finalEventMessage }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -87,13 +87,12 @@
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<span
|
<span
|
||||||
class="notiBadge"
|
class="noti-sum"
|
||||||
*ngIf="roomInfo.noReadCnt > 0"
|
*ngIf="roomInfo.noReadCnt > 0"
|
||||||
[matBadgeHidden]="roomInfo.noReadCnt === 0"
|
[matBadgeHidden]="roomInfo.noReadCnt === 0"
|
||||||
[matBadge]="roomInfo.noReadCnt"
|
[matBadge]="roomInfo.noReadCnt"
|
||||||
matBadgeOverlap="true"
|
matBadgeOverlap="true"
|
||||||
matBadgeColor="accent"
|
matBadgeColor="accent"
|
||||||
matBadgePosition="below after"
|
matBadgePosition="below after"
|
||||||
>
|
></span>
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -78,20 +78,19 @@ $thumbnail-msize: 40px;
|
||||||
.info {
|
.info {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex: 0 0 auto;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
||||||
.detail {
|
.room-info {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
width: calc(100% - 80px);
|
width: calc(100% - 80px);
|
||||||
.room-name {
|
.detail {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
color: $font-dark;
|
color: $font-dark;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
.name {
|
.name {
|
||||||
font-size: 1.1em;
|
|
||||||
@include ellipsis(1);
|
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
.mat-icon {
|
.mat-icon {
|
||||||
|
@ -105,8 +104,7 @@ $thumbnail-msize: 40px;
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
line-height: unset;
|
line-height: unset;
|
||||||
}
|
}
|
||||||
.num {
|
.member {
|
||||||
font-size: 0.9em;
|
|
||||||
flex: none;
|
flex: none;
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
@ -114,10 +112,8 @@ $thumbnail-msize: 40px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.room-msg {
|
.final-message {
|
||||||
font-size: 12px;
|
|
||||||
color: $font-mid;
|
color: $font-mid;
|
||||||
@include ellipsis(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.date {
|
.date {
|
||||||
|
@ -127,7 +123,8 @@ $thumbnail-msize: 40px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
color: $font-mid;
|
color: $font-mid;
|
||||||
@include ellipsis(1);
|
align-items: flex-start;
|
||||||
|
margin-top: -2px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,21 +142,3 @@ $thumbnail-msize: 40px;
|
||||||
background-color: $bg-list-hover;
|
background-color: $bg-list-hover;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.noti {
|
|
||||||
position: absolute;
|
|
||||||
right: 22px;
|
|
||||||
bottom: 22px;
|
|
||||||
max-width: 60px;
|
|
||||||
padding: 0 6px;
|
|
||||||
font-size: 11px;
|
|
||||||
color: #ffffff;
|
|
||||||
@include ellipsis(1);
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notiBadge {
|
|
||||||
position: absolute !important;
|
|
||||||
right: 22px;
|
|
||||||
bottom: 22px;
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,7 +4,8 @@ import {
|
||||||
Input,
|
Input,
|
||||||
Output,
|
Output,
|
||||||
EventEmitter,
|
EventEmitter,
|
||||||
ViewChildren
|
ViewChildren,
|
||||||
|
ChangeDetectorRef
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import {
|
import {
|
||||||
RoomInfo,
|
RoomInfo,
|
||||||
|
@ -15,8 +16,9 @@ import {
|
||||||
import { NGXLogger } from 'ngx-logger';
|
import { NGXLogger } from 'ngx-logger';
|
||||||
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
|
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
|
||||||
import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
|
import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
|
||||||
import { FormsModule } from '@angular/forms';
|
import { TranslatePipe } from 'projects/ucap-webmessenger-ui/src/lib/pipes/translate.pipe';
|
||||||
import { MatCheckbox } from '@angular/material';
|
import { TranslateService as uiTranslateService } from '@ucap-webmessenger/ui';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ucap-room-list-item',
|
selector: 'ucap-room-list-item',
|
||||||
|
@ -50,7 +52,12 @@ export class ListItemComponent implements OnInit {
|
||||||
finalEventMessage: string;
|
finalEventMessage: string;
|
||||||
RoomType = RoomType;
|
RoomType = RoomType;
|
||||||
|
|
||||||
constructor(private logger: NGXLogger) {}
|
constructor(
|
||||||
|
private logger: NGXLogger,
|
||||||
|
private uiTranslateService: uiTranslateService,
|
||||||
|
private translateService: TranslateService,
|
||||||
|
private changeDetectorRef: ChangeDetectorRef
|
||||||
|
) {}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
if (this.roomInfo.isTimeRoom) {
|
if (this.roomInfo.isTimeRoom) {
|
||||||
|
@ -96,6 +103,18 @@ export class ListItemComponent implements OnInit {
|
||||||
.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getRoomNameByRoomUser(roomUserInfos: (RoomUserInfo | UserInfoShort)[]) {
|
||||||
|
let roomName = new TranslatePipe(
|
||||||
|
this.uiTranslateService,
|
||||||
|
this.changeDetectorRef
|
||||||
|
).transform(roomUserInfos, 'name', ',');
|
||||||
|
|
||||||
|
if (!roomName || roomName.trim().length === 0) {
|
||||||
|
roomName = this.translateService.instant('chat.noRoomUser');
|
||||||
|
}
|
||||||
|
return roomName;
|
||||||
|
}
|
||||||
|
|
||||||
// getChecked(value: boolean, roomInfo: RoomInfo) {
|
// getChecked(value: boolean, roomInfo: RoomInfo) {
|
||||||
// if (value && !this.multiCheckable) {
|
// if (value && !this.multiCheckable) {
|
||||||
// if (this.selected === roomInfo.roomSeq) {
|
// if (this.selected === roomInfo.roomSeq) {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
// Partials
|
// Partials
|
||||||
@import 'partials/breakpoints';
|
@import 'partials/breakpoints';
|
||||||
|
@import 'partials/main-frame';
|
||||||
@import 'partials/forms';
|
@import 'partials/forms';
|
||||||
@import 'partials/general';
|
@import 'partials/general';
|
||||||
@import 'partials/helpers';
|
@import 'partials/helpers';
|
||||||
|
@ -14,6 +15,7 @@
|
||||||
@import 'partials/scrollbars';
|
@import 'partials/scrollbars';
|
||||||
@import 'partials/paginator';
|
@import 'partials/paginator';
|
||||||
@import 'partials/presence';
|
@import 'partials/presence';
|
||||||
|
@import 'partials/search-frame';
|
||||||
@import 'partials/list-item';
|
@import 'partials/list-item';
|
||||||
@import 'partials/dialogs';
|
@import 'partials/dialogs';
|
||||||
|
|
||||||
|
|
|
@ -1,32 +1,40 @@
|
||||||
@charset 'utf-8';
|
@charset 'utf-8';
|
||||||
|
|
||||||
.ellipsis {
|
@mixin ellipsis($row) {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
display: block;
|
@if $row == 1 {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
word-wrap: normal;
|
word-wrap: normal;
|
||||||
}
|
} @else if $row >= 2 {
|
||||||
.ellipsis2 {
|
display: -webkit-box;
|
||||||
overflow: hidden;
|
-webkit-line-clamp: $row;
|
||||||
text-overflow: ellipsis;
|
-webkit-box-orient: vertical;
|
||||||
-webkit-line-clamp: 2;
|
word-wrap: break-word;
|
||||||
-webkit-box-orient: vertical;
|
}
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$listH-row2: 64px;
|
$listH-row2: 60px;
|
||||||
$line-basic: 1px solid #dddddd;
|
$line-basic: 1px solid #dddddd;
|
||||||
%list-item {
|
%list-item {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 14px;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: $listH-row2;
|
height: $listH-row2;
|
||||||
border-bottom: $line-basic;
|
border-bottom: $line-basic;
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//expansion-panel 높이
|
||||||
|
.group-tree {
|
||||||
|
.tree-node-frame {
|
||||||
|
height: $listH-row2;
|
||||||
|
.group-name {
|
||||||
|
font-size: 0.96em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.mat-card-header .mat-card-title {
|
.mat-card-header .mat-card-title {
|
||||||
margin: 0 -16px;
|
margin: 0 -16px;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
|
@ -56,7 +64,12 @@ $line-basic: 1px solid #dddddd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
span[class*='badge'] {
|
&.checkbox {
|
||||||
|
.mat-checkbox {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
span[class*='marker'] {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
width: 20px;
|
width: 20px;
|
||||||
|
@ -77,4 +90,37 @@ $line-basic: 1px solid #dddddd;
|
||||||
min-height: 18px;
|
min-height: 18px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.noti-sum.mat-badge {
|
||||||
|
position: absolute;
|
||||||
|
right: 30px;
|
||||||
|
bottom: 20px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//list-item 폰트 사이즈
|
||||||
|
.list-item {
|
||||||
|
font-size: 1em;
|
||||||
|
.name {
|
||||||
|
font-weight: 600;
|
||||||
|
@include ellipsis(1);
|
||||||
|
}
|
||||||
|
.grade {
|
||||||
|
font-size: 0.8em;
|
||||||
|
margin-left: 4px;
|
||||||
|
color: #777777;
|
||||||
|
}
|
||||||
|
.work-status,
|
||||||
|
.member {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
.final-message,
|
||||||
|
.dept {
|
||||||
|
font-size: 0.86em;
|
||||||
|
@include ellipsis(1);
|
||||||
|
}
|
||||||
|
.date {
|
||||||
|
font-size: 0.7em;
|
||||||
|
@include ellipsis(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
$frame-border: 3px;
|
||||||
|
$frame-outside: 50px;
|
||||||
|
$current-head: 50px;
|
||||||
|
$search-frame: 50px;
|
||||||
|
|
||||||
|
@mixin div-box-shadow {
|
||||||
|
width: calc(100% - #{$frame-outside});
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-toolbar {
|
||||||
|
&.mat-toolbar-single-row {
|
||||||
|
height: $frame-outside;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-container {
|
||||||
|
padding-top: $frame-outside;
|
||||||
|
border-width: $frame-border;
|
||||||
|
border-style: solid;
|
||||||
|
.mat-tab-group {
|
||||||
|
&.global-menu {
|
||||||
|
width: $frame-outside;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.left-side-tabs-body {
|
||||||
|
@include div-box-shadow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.current-head {
|
||||||
|
height: $frame-outside;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 글로벌 메뉴 별 리스트 높이 값
|
||||||
|
.left-side-tabs-contents {
|
||||||
|
.left-group-side {
|
||||||
|
.search-result {
|
||||||
|
height: calc(100% - #{$current-head + $search-frame});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.app-layout-chat-left-sidenav-chat-list {
|
||||||
|
height: calc(100% - #{$current-head + $search-frame});
|
||||||
|
}
|
||||||
|
.oraganization-tab {
|
||||||
|
height: calc(100% - #{$current-head + $search-frame});
|
||||||
|
}
|
||||||
|
.message-section {
|
||||||
|
height: calc(100% - #{$current-head + $search-frame});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,112 @@
|
||||||
|
$search-font-size: 14px;
|
||||||
|
|
||||||
|
@mixin list-search {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
position: relative;
|
||||||
|
height: $search-frame;
|
||||||
|
align-items: center;
|
||||||
|
// padding: 0 10px 0 20px;
|
||||||
|
font-size: $search-font-size;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
border-bottom: 1px solid #dddddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-search-frame {
|
||||||
|
@include list-search;
|
||||||
|
.searchbox {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
align-items: center;
|
||||||
|
input {
|
||||||
|
display: inline-flex;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 1em;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
.btn-search {
|
||||||
|
color: #777777;
|
||||||
|
font-size: 12px;
|
||||||
|
display: inline-flex;
|
||||||
|
margin-left: auto;
|
||||||
|
flex: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*.list-search-frame {
|
||||||
|
.selectbox {
|
||||||
|
display: inline-flex;
|
||||||
|
width: 40%;
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
& + .searchbox {
|
||||||
|
width: 60%;
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
.list-search-frame {
|
||||||
|
.searchbox {
|
||||||
|
height: 100%;
|
||||||
|
.mat-form-field {
|
||||||
|
width: 100%;
|
||||||
|
height: $search-frame;
|
||||||
|
.mat-form-field-wrapper {
|
||||||
|
padding: 0;
|
||||||
|
padding-bottom: 0 !important;
|
||||||
|
height: 100%;
|
||||||
|
.mat-form-field-flex {
|
||||||
|
height: 100%;
|
||||||
|
align-items: center;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
padding: 0 20px;
|
||||||
|
.mat-form-field-infix {
|
||||||
|
font-size: 14px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.mat-form-field-suffix {
|
||||||
|
margin-left: auto;
|
||||||
|
.mat-icon {
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.mat-form-field-appearance-legacy {
|
||||||
|
.mat-form-field-wrapper {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.mat-form-field-underline {
|
||||||
|
bottom: 0;
|
||||||
|
background-color: unset !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.selectbox {
|
||||||
|
display: inline-flex;
|
||||||
|
width: 46%;
|
||||||
|
padding-left: 20px;
|
||||||
|
|
||||||
|
& + .searchbox {
|
||||||
|
width: 54%;
|
||||||
|
display: inline-flex;
|
||||||
|
input {
|
||||||
|
display: inline-flex;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 1em;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
.btn-search {
|
||||||
|
color: #777777;
|
||||||
|
font-size: 12px;
|
||||||
|
display: inline-flex;
|
||||||
|
margin-left: auto;
|
||||||
|
flex: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user