Merge branch 'master' of https://git.loafle.net/ucap-web/next-ucap-messenger
This commit is contained in:
commit
6f4c450b33
|
@ -554,10 +554,12 @@ ipcMain.on(
|
|||
if (!err) {
|
||||
event.returnValue = savePath;
|
||||
} else {
|
||||
log.info('SaveFile err', err);
|
||||
event.returnValue = undefined;
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
log.info('SaveFile error', error);
|
||||
event.returnValue = undefined;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,13 +76,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
/*::ng-deep .ps {
|
||||
.ps-content {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}*/
|
||||
// perfect-scrollbar right로 2px이동
|
||||
::ng-deep .ps__rail-y {
|
||||
& > .ps__thumb-y {
|
||||
|
|
|
@ -16,7 +16,9 @@
|
|||
class="left-side-tabs-contents"
|
||||
[style.display]="MainMenu.Chat === currentTabLable ? 'block' : 'none'"
|
||||
>
|
||||
<app-layout-chat-left-sidenav-chat></app-layout-chat-left-sidenav-chat>
|
||||
<app-layout-chat-left-sidenav-chat
|
||||
[isVisible]="currentTabLable === MainMenu.Chat"
|
||||
></app-layout-chat-left-sidenav-chat>
|
||||
</div>
|
||||
<div
|
||||
#tabs
|
||||
|
|
|
@ -32,10 +32,3 @@
|
|||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
/*::ng-deep .cdk-virtual-scroll-orientation-vertical {
|
||||
.cdk-virtual-scroll-content-wrapper {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
contain: unset;
|
||||
}
|
||||
}*/
|
||||
|
|
|
@ -37,6 +37,7 @@ import { FormGroup, FormBuilder } from '@angular/forms';
|
|||
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
||||
import { PerfectScrollbarDirective } from 'ngx-perfect-scrollbar';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { VirtualScrollerComponent } from 'ngx-virtual-scroller';
|
||||
|
||||
@Component({
|
||||
selector: 'app-layout-chat-left-sidenav-chat',
|
||||
|
@ -48,8 +49,8 @@ export class ChatComponent implements OnInit, OnDestroy, AfterViewChecked {
|
|||
@Input()
|
||||
isVisible = true;
|
||||
|
||||
@ViewChild('cvsvChatList', { static: false })
|
||||
cvsvChatList: CdkVirtualScrollViewport;
|
||||
@ViewChild('vsChatRoomList', { static: false })
|
||||
private vsChatRoomList: VirtualScrollerComponent;
|
||||
|
||||
@ViewChild(PerfectScrollbarDirective, { static: false })
|
||||
psDirectiveRef?: PerfectScrollbarDirective;
|
||||
|
@ -192,14 +193,18 @@ export class ChatComponent implements OnInit, OnDestroy, AfterViewChecked {
|
|||
|
||||
ngAfterViewChecked(): void {
|
||||
if (
|
||||
!!this.cvsvChatList &&
|
||||
!!this.vsChatRoomList &&
|
||||
!!this.roomList &&
|
||||
this.roomList.length > 0 &&
|
||||
!this.isInitList &&
|
||||
this.isVisible
|
||||
) {
|
||||
this.isInitList = true;
|
||||
this.cvsvChatList.checkViewportSize();
|
||||
this.vsChatRoomList.refresh();
|
||||
|
||||
if (!!this.psDirectiveRef) {
|
||||
this.psDirectiveRef.update();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,10 +32,7 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
/*::ng-deep .mat-tab-body-content {
|
||||
height: 100%;
|
||||
overflow: unset;
|
||||
}*/
|
||||
|
||||
.mat-menu-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
|
@ -298,6 +298,7 @@ export class OrganizationComponent
|
|||
this.isVisible
|
||||
) {
|
||||
this.isInitList = true;
|
||||
this.vsDeptUser.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,65 +22,5 @@ $tablet-s-width: 768px;
|
|||
width: 50%;
|
||||
min-width: 50%;
|
||||
}
|
||||
.mat-tab-header-pagination {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::ng-deep .footer-fix {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
min-height: 40px;
|
||||
width: 100%;
|
||||
flex-direction: column;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
border-top: 1px solid #dddddd;
|
||||
.btn-box {
|
||||
height: 50px;
|
||||
padding-bottom: 10px;
|
||||
width: 100%;
|
||||
background-color: #ffffff;
|
||||
button {
|
||||
margin: 5px;
|
||||
font-size: 0.9em;
|
||||
padding: 0 12px;
|
||||
}
|
||||
}
|
||||
.mat-paginator-page-size {
|
||||
@media screen and (max-width: #{$tablet-s-width}), (max-height: 800px) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*right-drawer tab 레이아웃
|
||||
::ng-deep .rightDrawer-tab {
|
||||
.mat-tab-labels {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
border-bottom: 2px solid #dddddd;
|
||||
flex: 1 1 auto;
|
||||
justify-content: space-around;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
min-width: 0 !important;
|
||||
|
||||
.mat-tab-label {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
.mat-tab-header-pagination.mat-tab-header-pagination-disabled {
|
||||
display: none !important;
|
||||
}
|
||||
.message-tab {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
& > .mat-tab-header {
|
||||
width: 100%;
|
||||
.mat-tab-label {
|
||||
min-width: 33%;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
|
|
@ -100,6 +100,7 @@
|
|||
</div>
|
||||
<div class="search-list">
|
||||
<perfect-scrollbar class="album-scrollbar">
|
||||
<div class="albumlist-content">
|
||||
<div
|
||||
*ngFor="let fileInfo of filteredList"
|
||||
class="img-item"
|
||||
|
@ -160,6 +161,7 @@
|
|||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</perfect-scrollbar>
|
||||
</div>
|
||||
<div
|
||||
|
|
|
@ -115,30 +115,25 @@ $tablet-s-width: 768px;
|
|||
}
|
||||
}
|
||||
|
||||
::ng-deep .album-scrollbar {
|
||||
.ps {
|
||||
.ps-content {
|
||||
display: flex;
|
||||
flex-flow: wrap;
|
||||
height: auto;
|
||||
justify-content: stretch;
|
||||
align-content: space-between;
|
||||
width: 100%;
|
||||
.albumlist-content {
|
||||
display: flex;
|
||||
flex-flow: wrap;
|
||||
height: auto;
|
||||
justify-content: stretch;
|
||||
align-content: space-between;
|
||||
width: 100%;
|
||||
.img-item {
|
||||
cursor: pointer;
|
||||
margin-bottom: 10px;
|
||||
position: relative;
|
||||
width: 32%;
|
||||
margin-right: 2%;
|
||||
&:nth-child(3n + 0) {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.img-item {
|
||||
cursor: pointer;
|
||||
margin-bottom: 10px;
|
||||
position: relative;
|
||||
width: 32%;
|
||||
margin-right: 2%;
|
||||
&:nth-child(3n + 0) {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.preview-image,
|
||||
.preview-video {
|
||||
max-height: 140px;
|
||||
|
|
|
@ -148,6 +148,32 @@ $tablet-s-width: 768px;
|
|||
font-size: 1em;
|
||||
}
|
||||
}
|
||||
.footer-fix {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
min-height: 40px;
|
||||
width: 100%;
|
||||
flex-direction: column;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
border-top: 1px solid #dddddd;
|
||||
.btn-box {
|
||||
height: 50px;
|
||||
padding-bottom: 10px;
|
||||
width: 100%;
|
||||
background-color: #ffffff;
|
||||
button {
|
||||
margin: 5px;
|
||||
font-size: 0.9em;
|
||||
padding: 0 12px;
|
||||
}
|
||||
}
|
||||
.mat-paginator-page-size {
|
||||
@media screen and (max-width: #{$tablet-s-width}), (max-height: 800px) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mat-paginator-container {
|
||||
display: flex;
|
||||
|
|
|
@ -95,27 +95,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
/*::ng-deep .mat-paginator {
|
||||
.mat-paginator-container {
|
||||
justify-content: center;
|
||||
}
|
||||
.mat-paginator-navigation-first {
|
||||
order: 1;
|
||||
}
|
||||
.mat-paginator-navigation-previous {
|
||||
order: 2;
|
||||
}
|
||||
// override material paginator page switch
|
||||
.mat-paginator-range-label {
|
||||
order: 3;
|
||||
}
|
||||
.mat-paginator-navigation-next {
|
||||
order: 4;
|
||||
}
|
||||
.mat-paginator-navigation-last {
|
||||
order: 5;
|
||||
}
|
||||
}*/
|
||||
.mat-form-field-appearance-legacy {
|
||||
.mat-form-field-infix {
|
||||
padding: 6px;
|
||||
|
|
|
@ -1,131 +1,3 @@
|
|||
/*.clipboard-frame {
|
||||
padding: 16px;
|
||||
height: 100%;
|
||||
min-width: 500px;
|
||||
position: relative;
|
||||
|
||||
.mat-dialog-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.mat-card-header {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
margin-bottom: 12px;
|
||||
|
||||
.btn-dialog-close {
|
||||
font-size: 20px;
|
||||
display: flex;
|
||||
margin-left: auto;
|
||||
align-self: flex-start;
|
||||
color: #444444;
|
||||
}
|
||||
}
|
||||
.mat-card-content {
|
||||
flex: 0 0 auto;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
height: calc(100% - 100px);
|
||||
border-bottom: 1px solid #dddddd;
|
||||
.setting-tab {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
.title-text {
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.mat-tab-group {
|
||||
flex-direction: row;
|
||||
.mat-tab-header {
|
||||
width: 160px;
|
||||
.mat-tab-labels {
|
||||
flex-direction: column;
|
||||
.mat-tab-label {
|
||||
padding: 0 10px;
|
||||
align-content: flex-start;
|
||||
text-align: left;
|
||||
align-items: self-start;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
}
|
||||
.mat-ink-bar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.button-farm {
|
||||
text-align: right;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
bottom: 10px;
|
||||
.mat-primary {
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::ng-deep .clipboard-tab {
|
||||
.mat-tab-group {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
|
||||
.mat-tab-header {
|
||||
width: 170px;
|
||||
flex-flow: column;
|
||||
border-right: 1px solid #dddddd;
|
||||
.mat-tab-label-container {
|
||||
.mat-tab-list {
|
||||
.mat-tab-labels {
|
||||
border-bottom: 0;
|
||||
//padding-right: 10px;
|
||||
.mat-tab-label {
|
||||
padding: 0 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mat-tab-body-wrapper {
|
||||
.mat-tab-body {
|
||||
.mat-tab-body-conten {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.mat-list-base {
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::ng-deep .setting-category {
|
||||
.mat-list-base {
|
||||
position: relative;
|
||||
.mat-list-item {
|
||||
font-size: 15px;
|
||||
.mat-tab-header {
|
||||
border-right: none;
|
||||
}
|
||||
}
|
||||
.mat-divider {
|
||||
//margin-top: 10px;
|
||||
}
|
||||
.mat-subheader {
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
.clipboard-frame {
|
||||
padding: 16px;
|
||||
height: 100%;
|
||||
|
|
|
@ -156,7 +156,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
:ng-deep .dialog-creat-chat {
|
||||
/*:ng-deep .dialog-creat-chat {
|
||||
& > .mat-tab-body-wrapper {
|
||||
.mat-tab-body {
|
||||
height: 380px;
|
||||
|
@ -170,8 +170,4 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
/*::ng-deep .ps-content {
|
||||
.cdk-virtual-scroll-viewport {
|
||||
height: 100%;
|
||||
}
|
||||
}*/
|
||||
*/
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
<mat-icon>add</mat-icon>
|
||||
<span class="mat-fab__label">{{ 'group.addNew' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<div *ngIf="isShowAddGroupField" class="input-groupname-box">
|
||||
<form name="inputForm" [formGroup]="inputForm" novalidate>
|
||||
<mat-form-field
|
||||
|
@ -33,7 +34,6 @@
|
|||
value=""
|
||||
formControlName="groupName"
|
||||
/>
|
||||
|
||||
<button
|
||||
mat-button
|
||||
matSuffix
|
||||
|
@ -43,10 +43,22 @@
|
|||
>
|
||||
<mat-icon>close</mat-icon>
|
||||
</button>
|
||||
|
||||
<mat-hint align="end"
|
||||
>{{ inputGroupName.value?.length || 0 }}/20</mat-hint
|
||||
>
|
||||
<mat-error
|
||||
*ngIf="inputForm.get('groupName').hasError('groupNameBanned')"
|
||||
>
|
||||
{{
|
||||
'group.errors.bannedWords'
|
||||
| translate: { bannedWords: bannedWords.join(',') }
|
||||
}}
|
||||
</mat-error>
|
||||
<mat-error
|
||||
*ngIf="inputForm.get('groupName').hasError('groupNameSamed')"
|
||||
>
|
||||
{{ 'group.errors.sameNameExist' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
width: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
margin-top: -8px;
|
||||
}
|
||||
.mat-fab__label {
|
||||
color: #212121;
|
||||
|
@ -71,7 +72,3 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
::ng-deep .mat-mini-fab .mat-button-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import {
|
|||
MatSelectionList,
|
||||
MatSelectionListChange
|
||||
} from '@angular/material';
|
||||
import { Observable, combineLatest } from 'rxjs';
|
||||
import { Observable, combineLatest, Subscription } from 'rxjs';
|
||||
import { Store, select } from '@ngrx/store';
|
||||
import { map, take } from 'rxjs/operators';
|
||||
|
||||
|
@ -20,8 +20,14 @@ import {
|
|||
} from '@ucap-webmessenger/ui';
|
||||
import { GroupDetailData, UserInfo } from '@ucap-webmessenger/protocol-sync';
|
||||
import { environment } from '../../../../../environments/environment';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
|
||||
import { TranslateService, TranslateParser } from '@ngx-translate/core';
|
||||
import {
|
||||
FormGroup,
|
||||
FormBuilder,
|
||||
Validators,
|
||||
ValidatorFn,
|
||||
AbstractControl
|
||||
} from '@angular/forms';
|
||||
import { StringUtil } from '@ucap-webmessenger/core';
|
||||
|
||||
export interface SelectGroupDialogData {
|
||||
|
@ -43,6 +49,10 @@ export class SelectGroupDialogComponent implements OnInit {
|
|||
groupName: string;
|
||||
inputForm: FormGroup;
|
||||
|
||||
bannedWords: string[] = [];
|
||||
groupListSubscription: Subscription;
|
||||
groupList: GroupDetailData[];
|
||||
|
||||
constructor(
|
||||
public dialogRef: MatDialogRef<
|
||||
SelectGroupDialogData,
|
||||
|
@ -52,8 +62,34 @@ export class SelectGroupDialogComponent implements OnInit {
|
|||
private store: Store<any>,
|
||||
private dialogService: DialogService,
|
||||
private translateService: TranslateService,
|
||||
private translateParser: TranslateParser,
|
||||
private formBuilder: FormBuilder
|
||||
) {}
|
||||
) {
|
||||
const banKeys: string[] = [
|
||||
'group.nameFavorite',
|
||||
'group.nameMyDept',
|
||||
'group.nameDefault'
|
||||
];
|
||||
|
||||
const langs = ['ko', 'en'];
|
||||
|
||||
langs.forEach(lang => {
|
||||
this.translateService
|
||||
.getTranslation(lang)
|
||||
.pipe(take(1))
|
||||
.subscribe(
|
||||
translation => {
|
||||
banKeys.forEach(banKey => {
|
||||
this.bannedWords.push(
|
||||
this.translateParser.getValue(translation, banKey)
|
||||
);
|
||||
});
|
||||
},
|
||||
error => {},
|
||||
() => {}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@ViewChild('groups', { static: true }) groups: MatSelectionList;
|
||||
groupBuddyList$: Observable<
|
||||
|
@ -64,7 +100,15 @@ export class SelectGroupDialogComponent implements OnInit {
|
|||
|
||||
ngOnInit(): void {
|
||||
this.inputForm = this.formBuilder.group({
|
||||
groupName: ['', [Validators.required, StringUtil.checkSpecialCharacter()]]
|
||||
groupName: [
|
||||
'',
|
||||
[
|
||||
Validators.required,
|
||||
StringUtil.checkSpecialCharacter(),
|
||||
this.checkBanWords(),
|
||||
this.checkSameName()
|
||||
]
|
||||
]
|
||||
});
|
||||
|
||||
this.groups.selectionChange.subscribe((s: MatSelectionListChange) => {
|
||||
|
@ -82,6 +126,8 @@ export class SelectGroupDialogComponent implements OnInit {
|
|||
)
|
||||
]).pipe(
|
||||
map(([buddyList, groupList]) => {
|
||||
this.groupList = groupList;
|
||||
|
||||
// sort..
|
||||
if (!!groupList && groupList.length > 0) {
|
||||
const tempOrderArr: GroupDetailData[] = [];
|
||||
|
@ -214,4 +260,31 @@ export class SelectGroupDialogComponent implements OnInit {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
checkBanWords(): ValidatorFn {
|
||||
return (control: AbstractControl): { [key: string]: any } | null => {
|
||||
if (!control || !control.value) {
|
||||
return null;
|
||||
}
|
||||
const ban =
|
||||
-1 < this.bannedWords.indexOf((control.value as string).trim());
|
||||
return ban ? { groupNameBanned: { value: control.value } } : null;
|
||||
};
|
||||
}
|
||||
|
||||
checkSameName(): ValidatorFn {
|
||||
return (control: AbstractControl): { [key: string]: any } | null => {
|
||||
if (
|
||||
!control ||
|
||||
!control.value ||
|
||||
!this.groupList ||
|
||||
0 === this.groupList.length
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
const v = (control.value as string).trim();
|
||||
const ban = -1 < this.groupList.findIndex(g => g.name === v);
|
||||
return ban ? { groupNameSamed: { value: control.value } } : null;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,10 +23,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
::ng-deep .mat-mini-fab .mat-button-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.contents {
|
||||
height: 380px;
|
||||
.message-contents {
|
||||
|
@ -46,7 +42,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
::ng-deep .message-container {
|
||||
.message-container {
|
||||
background-color: #ffffff !important;
|
||||
.message-info {
|
||||
/*.profile {
|
||||
|
|
|
@ -151,7 +151,9 @@ export class IntegratedSearchDialogComponent implements OnInit, OnDestroy {
|
|||
const response = res as DeptUserResponse;
|
||||
|
||||
// 검색 결과 처리.
|
||||
this.searchUserInfos = searchUserInfos;
|
||||
this.searchUserInfos = searchUserInfos.sort((a, b) =>
|
||||
a.name < b.name ? -1 : a.name > b.name ? 1 : 0
|
||||
);
|
||||
|
||||
this.totalCount = response.pageTotalCount;
|
||||
this.pageCurrent = response.pageCurrent;
|
||||
|
|
|
@ -68,6 +68,9 @@
|
|||
text-align: left;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
&.mat-tab-label-active {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
.mat-ink-bar {
|
||||
|
@ -80,57 +83,3 @@
|
|||
border-left: 1px solid #dddddd;
|
||||
}
|
||||
}
|
||||
|
||||
/*::ng-deep .setting-tab {
|
||||
.mat-tab-group {
|
||||
.mat-tab-header {
|
||||
width: 160px;
|
||||
flex-flow: column;
|
||||
flex: 0 0 auto;
|
||||
border-right: 1px solid #dddddd;
|
||||
.mat-tab-label-container {
|
||||
.mat-tab-list {
|
||||
.mat-tab-labels {
|
||||
border-bottom: 0;
|
||||
//padding-right: 10px;
|
||||
.mat-tab-label {
|
||||
padding: 0 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mat-tab-body-wrapper {
|
||||
.mat-tab-body {
|
||||
.mat-tab-body-conten {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.mat-list-base {
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::ng-deep .setting-category {
|
||||
.mat-list-base {
|
||||
position: relative;
|
||||
.mat-list-item {
|
||||
font-size: 15px;
|
||||
.mat-tab-header {
|
||||
border-right: none;
|
||||
}
|
||||
}
|
||||
.mat-divider {
|
||||
//margin-top: 10px;
|
||||
}
|
||||
.mat-subheader {
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<div class="btn-area">
|
||||
<ucap-integrated-search-form
|
||||
*ngIf="!!loginRes"
|
||||
[searchWord]="integratedSearchWord"
|
||||
(search)="onIntegratedSearch($event)"
|
||||
class="input-lineless integrated-search"
|
||||
>
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
height: 100%;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.app-layout-native-title-bar-link {
|
||||
|
@ -54,7 +55,7 @@
|
|||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
align-items: center;
|
||||
height:100%;
|
||||
height: 100%;
|
||||
.button {
|
||||
-webkit-app-region: no-drag;
|
||||
outline: 0;
|
||||
|
|
|
@ -125,6 +125,8 @@ export class TopBarComponent implements OnInit, OnDestroy {
|
|||
@ViewChild('profileMenu', { static: true })
|
||||
profileMenu: MatMenu;
|
||||
|
||||
integratedSearchWord = '';
|
||||
|
||||
constructor(
|
||||
private store: Store<any>,
|
||||
@Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService,
|
||||
|
@ -570,19 +572,24 @@ export class TopBarComponent implements OnInit, OnDestroy {
|
|||
);
|
||||
}
|
||||
|
||||
onIntegratedSearch(keyword: string) {
|
||||
async onIntegratedSearch(keyword: string) {
|
||||
if (!keyword || keyword.trim().length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.dialogService.open<
|
||||
this.integratedSearchWord = keyword;
|
||||
|
||||
const result = await this.dialogService.open<
|
||||
IntegratedSearchDialogComponent,
|
||||
IntegratedSearchDialogData,
|
||||
IntegratedSearchDialogResult
|
||||
>(IntegratedSearchDialogComponent, {
|
||||
data: {
|
||||
keyword
|
||||
}
|
||||
},
|
||||
restoreFocus: false
|
||||
});
|
||||
|
||||
this.integratedSearchWord = '';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ export const reducer = createReducer(
|
|||
// tslint:disable-next-line: forin
|
||||
for (const key in state.room.entities) {
|
||||
const value = state.room.entities[key];
|
||||
unReadCount += value.noReadCnt;
|
||||
unReadCount += isNaN(value.noReadCnt) ? 0 : value.noReadCnt;
|
||||
}
|
||||
action.roomList.map(item => (unReadCount += item.noReadCnt));
|
||||
|
||||
|
@ -304,7 +304,7 @@ export const reducer = createReducer(
|
|||
for (const key in state.room.entities) {
|
||||
if (key !== action.roomSeq) {
|
||||
const value = state.room.entities[key];
|
||||
unReadCount += value.noReadCnt;
|
||||
unReadCount += isNaN(value.noReadCnt) ? 0 : value.noReadCnt;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -89,7 +89,7 @@ export const decodeInfoData: ProtocolDecoder<InfoData> = (
|
|||
finalEventMessage: info[4],
|
||||
finalEventDate: info[5],
|
||||
joinUserCount: Number(info[6]),
|
||||
noReadCnt: Number(info[7]),
|
||||
noReadCnt: isNaN(info[7]) ? 0 : Number(info[7]),
|
||||
receiveAlarm: info[8] !== 'N' ? true : false,
|
||||
isJoinRoom: info[9] === 'Y' ? true : false,
|
||||
expiredFileStdSeq: Number(info[10]),
|
||||
|
|
|
@ -83,7 +83,7 @@ export const decodeRoomData: ProtocolDecoder<RoomData> = (
|
|||
finalEventMessage: info[4],
|
||||
finalEventDate: info[5],
|
||||
joinUserCount: Number(info[6]),
|
||||
noReadCnt: Number(info[7]),
|
||||
noReadCnt: isNaN(info[7]) ? 0 : Number(info[7]),
|
||||
receiveAlarm: info[8] !== 'N' ? true : false,
|
||||
isJoinRoom: info[9] === 'Y' ? true : false,
|
||||
expiredFileStdSeq: Number(info[10]),
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
(click)="onClickStickerSelector()"
|
||||
matTooltip="{{ 'chat.btnSticker' | translate }}"
|
||||
>
|
||||
<!--<mat-icon>sentiment_satisfied_alt</mat-icon>-->
|
||||
<i class="mid mdi-emoticon-happy-outline"></i>
|
||||
</button>
|
||||
|
||||
|
@ -37,16 +36,6 @@
|
|||
(click)="onClickTranslation()"
|
||||
matTooltip="{{ 'chat.btnTranslate' | translate }}"
|
||||
>
|
||||
<!--<mat-icon>g_translate</mat-icon>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
d="M7.41 9l2.24 2.24-.83 2L6 10.4l-3.3 3.3-1.4-1.42L4.58 9l-.88-.88c-.53-.53-1-1.3-1.3-2.12h2.2c.15.28.33.53.51.7l.89.9.88-.88C7.48 6.1 8 4.84 8 4H0V2h5V0h2v2h5v2h-2c0 1.37-.74 3.15-1.7 4.12L7.4 9zm3.84 8L10 20H8l5-12h2l5 12h-2l-1.25-3h-5.5zm.83-2h3.84L14 10.4 12.08 15z"
|
||||
/>
|
||||
</svg>-->
|
||||
<svg
|
||||
id="레이어_1"
|
||||
data-name="레이어 1"
|
||||
|
@ -112,24 +101,12 @@
|
|||
</mat-form-field>
|
||||
|
||||
<button
|
||||
class="send-message-button bg-accent-darkest"
|
||||
class="send-message-button icon-button bg-accent-darkest"
|
||||
mat-icon-button
|
||||
type="submit"
|
||||
aria-label="Send message"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="20"
|
||||
height="20"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M12 19V6M5 12l7-7 7 7" />
|
||||
</svg>
|
||||
<i class="mid mid-30 mdi-arrow-up"></i>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
@ -57,23 +57,19 @@ textarea[name='message'] {
|
|||
padding-top: 0;
|
||||
}
|
||||
|
||||
::ng-deep .send-message-button {
|
||||
.send-message-button {
|
||||
margin-left: 20px;
|
||||
line-height: unset;
|
||||
@media screen and (max-width: #{$tablet-l-width}), (max-height: 800px) {
|
||||
margin-left: 6px;
|
||||
}
|
||||
.mat-button-wrapper {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
justify-items: center;
|
||||
}
|
||||
i {
|
||||
display: inline-block;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
line-height: 40px;
|
||||
font-size: 20px;
|
||||
font-size: 24px;
|
||||
color: #ffffff;
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
|
|
|
@ -178,6 +178,13 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
|||
this.loginRes = loginRes;
|
||||
});
|
||||
this.roomInfoSubscription = this.roomInfo$.subscribe(roomInfo => {
|
||||
if (
|
||||
!this.roomInfo ||
|
||||
(!!this.roomInfo && this.roomInfo.roomSeq !== roomInfo.roomSeq)
|
||||
) {
|
||||
this.baseEventSeq = 0;
|
||||
}
|
||||
|
||||
this.roomInfo = roomInfo;
|
||||
this.showMore = false;
|
||||
|
||||
|
@ -196,7 +203,6 @@ export class MessagesComponent implements OnInit, OnDestroy {
|
|||
!this.roomInfo ||
|
||||
(!!this.roomInfo && this.roomInfo.roomSeq !== roomInfo.roomSeq)
|
||||
) {
|
||||
this.baseEventSeq = 0;
|
||||
this.initEventMore();
|
||||
}
|
||||
});
|
||||
|
|
|
@ -49,14 +49,24 @@
|
|||
</span>
|
||||
</dt>
|
||||
<dd>
|
||||
<mat-icon
|
||||
<span
|
||||
*ngIf="!!message.resType && message.resType === ContentType.Image"
|
||||
class="icon-img"
|
||||
><i class="mid mid-18 mdi-image-outline"></i
|
||||
></span>
|
||||
<span
|
||||
*ngIf="!!message.resType && message.resType === ContentType.AttachFile"
|
||||
class="icon-img"
|
||||
><i class="mid mid-18 mdi-floppy"></i
|
||||
></span>
|
||||
<!--<mat-icon
|
||||
*ngIf="!!message.resType && message.resType === ContentType.Image"
|
||||
>image</mat-icon
|
||||
>
|
||||
<mat-icon
|
||||
*ngIf="!!message.resType && message.resType === ContentType.AttachFile"
|
||||
>attach_file</mat-icon
|
||||
>
|
||||
>-->
|
||||
<span class="final-message">{{ message.title }}</span>
|
||||
</dd>
|
||||
</dl>
|
||||
|
|
|
@ -26,8 +26,8 @@
|
|||
width: 100%;
|
||||
position: relative;
|
||||
justify-items: center;
|
||||
.mat-icon{
|
||||
font-size:18px;
|
||||
.icon-img {
|
||||
margin-right: 6px;
|
||||
}
|
||||
.final-message {
|
||||
white-space: nowrap;
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
::ng-deep .ucap-message-write {
|
||||
.ucap-message-write {
|
||||
padding: 0;
|
||||
.add-row {
|
||||
display: flex;
|
||||
|
@ -100,19 +100,18 @@
|
|||
margin-bottom: 10px;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
.mat-mini-fab {
|
||||
.mat-button-wrapper {
|
||||
padding: 0;
|
||||
.mat-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
.mat-fab__label {
|
||||
color: #212121;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.mat-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
margin-top: -8px;
|
||||
}
|
||||
.mat-fab__label {
|
||||
color: #212121;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.receiver-sum {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
|
|
@ -1,47 +1,3 @@
|
|||
/*::ng-deep .mat-list-base {
|
||||
.theme-select.mat-list-item {
|
||||
position: relative;
|
||||
height: 160px;
|
||||
.mat-list-item-content {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::ng-deep .theme-list {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
width: 100%;
|
||||
margin: 10px;
|
||||
height: auto !important;
|
||||
.mat-tab-header {
|
||||
position: relative;
|
||||
width: 100% !important;
|
||||
.mat-tab-labels {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
flex-flow: row !important;
|
||||
.mat-tab-label {
|
||||
width: 140px;
|
||||
height: 120px;
|
||||
.mat-tab-label-content {
|
||||
position: relative;
|
||||
flex-flow: column;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
.mat-ink-bar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.mat-tab-body-wrapper {
|
||||
border-left: none;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
.mat-list-item {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
@ -77,6 +33,9 @@
|
|||
.mat-tab-label {
|
||||
width: 140px;
|
||||
height: 120px;
|
||||
&.mat-tab-label-active {
|
||||
opacity: 1;
|
||||
}
|
||||
.mat-tab-label-content {
|
||||
position: relative;
|
||||
flex-flow: column;
|
||||
|
|
|
@ -54,6 +54,12 @@ mat-icon {
|
|||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
&-30 {
|
||||
font-size: 30px;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
}
|
||||
}
|
||||
&:before {
|
||||
display: inline-block;
|
||||
|
@ -69,3 +75,6 @@ mat-icon {
|
|||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
.circle-button {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
|
|
@ -3,11 +3,19 @@
|
|||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
width: 250px;
|
||||
max-width: 250px;
|
||||
width: 240px;
|
||||
max-width: 240px;
|
||||
color: #ffffff;
|
||||
font-size: 0.9em;
|
||||
font-size: 0.88rem;
|
||||
color: #2d3a4a;
|
||||
background-color: #ffffff;
|
||||
padding: 4px 10px;
|
||||
border-radius: 3px;
|
||||
.icon-img {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
.mat-form-field {
|
||||
font-size: 0.88rem;
|
||||
color: #333333;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ $tablet-s-width: 768px;
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sticker-item-box {
|
||||
flex-wrap: wrap;
|
||||
padding: 10px 20px 0;
|
||||
|
|
Loading…
Reference in New Issue
Block a user