This commit is contained in:
병준 박 2019-11-18 09:41:53 +09:00
commit 7eda167067
19 changed files with 267 additions and 75 deletions

View File

@ -3,7 +3,7 @@ import {
HttpClient, HttpClient,
HttpEventType, HttpEventType,
HttpResponse, HttpResponse,
HttpRequest, HttpRequest
} from '@angular/common/http'; } from '@angular/common/http';
import { Observable, Subject } from 'rxjs'; import { Observable, Subject } from 'rxjs';
@ -13,60 +13,60 @@ import {
FileProfileSaveRequest, FileProfileSaveRequest,
FileProfileSaveResponse, FileProfileSaveResponse,
encodeFileProfileSave, encodeFileProfileSave,
decodeFileProfileSave, decodeFileProfileSave
} from '../apis/file-profile-save'; } from '../apis/file-profile-save';
import { import {
FileTalkDownloadRequest, FileTalkDownloadRequest,
encodeFileTalkDownload, encodeFileTalkDownload,
encodeFormDataFileTalkDownload, encodeFormDataFileTalkDownload
} from '../apis/file-talk-download'; } from '../apis/file-talk-download';
import { import {
FileTalkSaveRequest, FileTalkSaveRequest,
FileTalkSaveResponse, FileTalkSaveResponse,
encodeFileTalkSave, encodeFileTalkSave,
decodeFileTalkSave, decodeFileTalkSave
} from '../apis/file-talk-save'; } from '../apis/file-talk-save';
import { import {
FileTalkShareRequest, FileTalkShareRequest,
FileTalkShareResponse, FileTalkShareResponse,
encodeFileTalkShare, encodeFileTalkShare,
decodeFileTalkShare, decodeFileTalkShare
} from '../apis/file-talk-share'; } from '../apis/file-talk-share';
import { import {
MassTalkDownloadRequest, MassTalkDownloadRequest,
MassTalkDownloadResponse, MassTalkDownloadResponse,
encodeMassTalkDownload, encodeMassTalkDownload,
decodeMassTalkDownload, decodeMassTalkDownload
} from '../apis/mass-talk-download'; } from '../apis/mass-talk-download';
import { import {
MassTalkSaveRequest, MassTalkSaveRequest,
MassTalkSaveResponse, MassTalkSaveResponse,
encodeMassTalkSave, encodeMassTalkSave,
decodeMassTalkSave, decodeMassTalkSave
} from '../apis/mass-talk-save'; } from '../apis/mass-talk-save';
import { import {
TransMassTalkDownloadRequest, TransMassTalkDownloadRequest,
TransMassTalkDownloadResponse, TransMassTalkDownloadResponse,
encodeTransMassTalkDownload, encodeTransMassTalkDownload,
decodeTransMassTalkDownload, decodeTransMassTalkDownload
} from '../apis/trans-mass-talk-download'; } from '../apis/trans-mass-talk-download';
import { import {
TransMassTalkSaveRequest, TransMassTalkSaveRequest,
TransMassTalkSaveResponse, TransMassTalkSaveResponse,
encodeTransMassTalkSave, encodeTransMassTalkSave,
decodeTransMassTalkSave, decodeTransMassTalkSave
} from '../apis/trans-mass-talk-save'; } from '../apis/trans-mass-talk-save';
import { import {
TranslationReqRequest, TranslationReqRequest,
TranslationReqResponse, TranslationReqResponse,
encodeTranslationReq, encodeTranslationReq,
decodeTranslationReq, decodeTranslationReq
} from '../apis/translation-req'; } from '../apis/translation-req';
import { import {
TranslationSaveRequest, TranslationSaveRequest,
TranslationSaveResponse, TranslationSaveResponse,
encodeTranslationSave, encodeTranslationSave,
decodeTranslationSave, decodeTranslationSave
} from '../apis/translation-save'; } from '../apis/translation-save';
import { _MODULE_CONFIG } from '../config/token'; import { _MODULE_CONFIG } from '../config/token';
@ -75,7 +75,7 @@ import { Urls } from '../config/urls';
import { UrlConfig } from '@ucap-webmessenger/core'; import { UrlConfig } from '@ucap-webmessenger/core';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root'
}) })
export class CommonApiService { export class CommonApiService {
readonly urls: Urls; readonly urls: Urls;
@ -99,7 +99,7 @@ export class CommonApiService {
!!fileProfileSaveUrl ? fileProfileSaveUrl : this.urls.fileProfileSave, !!fileProfileSaveUrl ? fileProfileSaveUrl : this.urls.fileProfileSave,
{}, {},
{ {
params: encodeFileProfileSave(req), params: encodeFileProfileSave(req)
} }
) )
.pipe(map(res => decodeFileProfileSave(res))); .pipe(map(res => decodeFileProfileSave(res)));
@ -114,7 +114,7 @@ export class CommonApiService {
!!fileTalkDownloadUrl ? fileTalkDownloadUrl : this.urls.fileTalkDownload, !!fileTalkDownloadUrl ? fileTalkDownloadUrl : this.urls.fileTalkDownload,
{}, {},
{ {
params: encodeFileTalkDownload(req), params: encodeFileTalkDownload(req)
} }
); );
@ -186,7 +186,11 @@ export class CommonApiService {
); );
} }
public acceptableExtensionForFileTalk(extensions: string[]): boolean { public acceptableExtensionForFileTalk(
extensions: string[]
): { accept: boolean; reject: string[] } {
let accept = true;
const reject: string[] = [];
for (const extension of extensions) { for (const extension of extensions) {
if ( if (
-1 === -1 ===
@ -194,10 +198,14 @@ export class CommonApiService {
extension.toLowerCase() extension.toLowerCase()
) )
) { ) {
return false; reject.push(extension);
accept = false;
} }
} }
return true; return {
accept,
reject
};
} }
public fileTalkShare( public fileTalkShare(
@ -208,7 +216,7 @@ export class CommonApiService {
this.urls.fileTalkShare, this.urls.fileTalkShare,
{}, {},
{ {
params: encodeFileTalkShare(req), params: encodeFileTalkShare(req)
} }
) )
.pipe(map(res => decodeFileTalkShare(res))); .pipe(map(res => decodeFileTalkShare(res)));
@ -223,7 +231,7 @@ export class CommonApiService {
{}, {},
{ {
params: encodeMassTalkDownload(req), params: encodeMassTalkDownload(req),
responseType: 'text' as 'json', responseType: 'text' as 'json'
} }
) )
.pipe(map(res => decodeMassTalkDownload(res))); .pipe(map(res => decodeMassTalkDownload(res)));
@ -238,7 +246,7 @@ export class CommonApiService {
{}, {},
{ {
params: encodeMassTalkSave(req), params: encodeMassTalkSave(req),
responseType: 'text' as 'json', responseType: 'text' as 'json'
} }
) )
.pipe(map(res => decodeMassTalkSave(res))); .pipe(map(res => decodeMassTalkSave(res)));
@ -252,7 +260,7 @@ export class CommonApiService {
this.urls.transMassTalkDownload, this.urls.transMassTalkDownload,
{}, {},
{ {
params: encodeTransMassTalkDownload(req), params: encodeTransMassTalkDownload(req)
} }
) )
.pipe(map(res => decodeTransMassTalkDownload(res))); .pipe(map(res => decodeTransMassTalkDownload(res)));
@ -266,7 +274,7 @@ export class CommonApiService {
this.urls.transMassTalkSave, this.urls.transMassTalkSave,
{}, {},
{ {
params: encodeTransMassTalkSave(req), params: encodeTransMassTalkSave(req)
} }
) )
.pipe(map(res => decodeTransMassTalkSave(res))); .pipe(map(res => decodeTransMassTalkSave(res)));
@ -280,7 +288,7 @@ export class CommonApiService {
this.urls.translationReq, this.urls.translationReq,
{}, {},
{ {
params: encodeTranslationReq(req), params: encodeTranslationReq(req)
} }
) )
.pipe(map(res => decodeTranslationReq(res))); .pipe(map(res => decodeTranslationReq(res)));
@ -294,7 +302,7 @@ export class CommonApiService {
this.urls.translationSave, this.urls.translationSave,
{}, {},
{ {
params: encodeTranslationSave(req), params: encodeTranslationSave(req)
} }
) )
.pipe(map(res => decodeTranslationSave(res))); .pipe(map(res => decodeTranslationSave(res)));

View File

@ -5,21 +5,21 @@
::ng-deep .mat-tab-body-wrapper, ::ng-deep .mat-tab-body-wrapper,
::ng-deep .mat-tab-body { ::ng-deep .mat-tab-body {
height: 0%; height: 100%;
width: 0%; width: 100%;
} }
::ng-deep .mat-tab-header { ::ng-deep .mat-tab-header {
border-bottom: none !important; border-bottom: none !important;
} }
.left-side-tabs-body { .left-side-tabs-body {
position: relative;
height: 100%; height: 100%;
width: 100%; width: calc(100% - 70px);
overflow: hidden; div[id^='tabs'] {
.left-side-tabs-contents {
height: 100%; height: 100%;
width: 100%; width: 100%;
position: relative;
} }
} }
@ -47,6 +47,7 @@
height: 280px; height: 280px;
padding-top: 10px; padding-top: 10px;
.mat-tab-label { .mat-tab-label {
width: 100%;
height: 80px; height: 80px;
padding: 0 16px; padding: 0 16px;
} }

View File

@ -57,7 +57,7 @@
[roomInfo]="room" [roomInfo]="room"
[roomUserInfo]="getRoomUserList(room)" [roomUserInfo]="getRoomUserList(room)"
[sessionVerinfo]="sessionVerinfo" [sessionVerinfo]="sessionVerinfo"
(click)="onSelectedRoom(room)" (click)="onClickContextMenu('SELECT_ROOM', room)"
(contextmenu)="onContextMenuChat($event, room)" (contextmenu)="onContextMenuChat($event, room)"
> >
</ucap-room-list-item> </ucap-room-list-item>
@ -86,7 +86,7 @@
[roomInfo]="room" [roomInfo]="room"
[roomUserInfo]="getRoomUserList(room)" [roomUserInfo]="getRoomUserList(room)"
[sessionVerinfo]="sessionVerinfo" [sessionVerinfo]="sessionVerinfo"
(click)="onSelectedRoom(room)" (click)="onClickContextMenu('SELECT_ROOM', room)"
(contextmenu)="onContextMenuChat($event, room)" (contextmenu)="onContextMenuChat($event, room)"
> >
</ucap-room-list-item> </ucap-room-list-item>
@ -121,13 +121,16 @@
(ucapClickOutside)="chatContextMenuTrigger.closeMenu()" (ucapClickOutside)="chatContextMenuTrigger.closeMenu()"
> >
<ng-template matMenuContent let-roomInfo="roomInfo"> <ng-template matMenuContent let-roomInfo="roomInfo">
<button mat-menu-item (click)="onSelectedRoom(roomInfo)"> <button mat-menu-item (click)="onClickContextMenu('SELECT_ROOM', roomInfo)">
대화방 열기 대화방 열기
</button> </button>
<button mat-menu-item (click)="onClickToggleAlarm(roomInfo)"> <button
mat-menu-item
(click)="onClickContextMenu('TOGGLE_ALARM', roomInfo)"
>
대화방 알람 {{ roomInfo.receiveAlarm ? '끄기' : '켜기' }} 대화방 알람 {{ roomInfo.receiveAlarm ? '끄기' : '켜기' }}
</button> </button>
<button mat-menu-item (click)="onClickExit(roomInfo)"> <button mat-menu-item (click)="onClickContextMenu('EXIT_ROOM', roomInfo)">
대화방 나가기 대화방 나가기
</button> </button>
</ng-template> </ng-template>

View File

@ -1,6 +1,12 @@
import { exit } from './../../../../store/messenger/room/actions'; import { exit } from './../../../../store/messenger/room/actions';
import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'; import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';
import { ucapAnimations } from '@ucap-webmessenger/ui'; import {
ucapAnimations,
DialogService,
ConfirmDialogComponent,
ConfirmDialogResult,
ConfirmDialogData
} from '@ucap-webmessenger/ui';
import { NGXLogger } from 'ngx-logger'; import { NGXLogger } from 'ngx-logger';
import { Store, select } from '@ngrx/store'; import { Store, select } from '@ngrx/store';
import { Subscription, combineLatest, Observable } from 'rxjs'; import { Subscription, combineLatest, Observable } from 'rxjs';
@ -54,6 +60,7 @@ export class ChatComponent implements OnInit, OnDestroy {
private store: Store<any>, private store: Store<any>,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private logger: NGXLogger, private logger: NGXLogger,
private dialogService: DialogService,
private sessionStorageService: SessionStorageService private sessionStorageService: SessionStorageService
) { ) {
this.sessionVerinfo = this.sessionStorageService.get<VersionInfo2Response>( this.sessionVerinfo = this.sessionStorageService.get<VersionInfo2Response>(
@ -194,18 +201,35 @@ export class ChatComponent implements OnInit, OnDestroy {
this.chatContextMenuTrigger.openMenu(); this.chatContextMenuTrigger.openMenu();
} }
onSelectedRoom(roomInfo: RoomInfo) { async onClickContextMenu(type: string, roomInfo: RoomInfo) {
this.store.dispatch(ChatStore.selectedRoom({ roomSeq: roomInfo.roomSeq })); switch (type) {
} case 'SELECT_ROOM':
onClickToggleAlarm(roomInfo: RoomInfo) { this.store.dispatch(
this.store.dispatch(RoomStore.updateOnlyAlarm({ roomInfo })); ChatStore.selectedRoom({ roomSeq: roomInfo.roomSeq })
} );
onClickExit(roomInfo: RoomInfo) { break;
this.store.dispatch( case 'TOGGLE_ALARM':
RoomStore.exit({ this.store.dispatch(RoomStore.updateOnlyAlarm({ roomInfo }));
roomSeq: roomInfo.roomSeq break;
}) case 'EXIT_ROOM':
); {
const result = await this.dialogService.open<
ConfirmDialogComponent,
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
data: {
title: 'Exit Room',
html: `대화방을 나가시겠습니까?<br/>나가기를 하면 대화내용 및 대화방 정보가 삭제됩니다.`
}
});
if (!!result && !!result.choice && result.choice) {
this.store.dispatch(RoomStore.exit({ roomSeq: roomInfo.roomSeq }));
}
}
break;
}
} }
getRoomUserList(roomInfo: RoomInfo): (RoomUserInfo | UserInfoShort)[] { getRoomUserList(roomInfo: RoomInfo): (RoomUserInfo | UserInfoShort)[] {

View File

@ -17,6 +17,7 @@
[oraganizationList]="departmentInfoList$ | async" [oraganizationList]="departmentInfoList$ | async"
[loginRes]="loginRes" [loginRes]="loginRes"
(selected)="onSelectedOrganization($event)" (selected)="onSelectedOrganization($event)"
class="tab-tree-frame"
></ucap-organization-tree> ></ucap-organization-tree>
</perfect-scrollbar> </perfect-scrollbar>
</div> </div>

View File

@ -154,3 +154,13 @@
} }
} }
} }
::ng-deep .oraganization-tab{
.oraganization-tab-tree,
.select-list{
.ps{
.ps-content{
height:100%;
}
}
}
}

View File

@ -607,6 +607,18 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
}, },
error => { error => {
this.logger.debug('onFileSelected error', error); this.logger.debug('onFileSelected error', error);
this.fileUploadQueue.onUploadComplete();
this.dialogService.open<
AlertDialogComponent,
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
data: {
title: 'Alert',
html: `파일전송에 실패하였습니다.<br/>계속 문제 발생 시 관리자에게 문의하세요.`
}
});
}, },
() => { () => {
this.fileUploadQueue.onUploadComplete(); this.fileUploadQueue.onUploadComplete();

View File

@ -168,7 +168,12 @@
> >
No No
</button> </button>
<button mat-flat-button (click)="onClickChoice(true)" class="mat-primary"> <button
mat-flat-button
[disabled]="getBtnValid()"
(click)="onClickChoice(true)"
class="mat-primary"
>
Yes Yes
</button> </button>
</mat-card-actions> </mat-card-actions>

View File

@ -15,6 +15,10 @@
height:100% !important; height:100% !important;
border-right: 1px solid #dddddd; border-right: 1px solid #dddddd;
overflow: auto; overflow: auto;
.tab-tree-frame{
width:100%;
height:100%;
}
} }
.select-list { .select-list {
display: inline-flex; display: inline-flex;
@ -66,6 +70,7 @@
} }
::ng-deep .mat-dialog-container .mat-tab-body-wrapper { ::ng-deep .mat-dialog-container .mat-tab-body-wrapper {
height: 380px; height: 380px;
width:100%;
} }
.list-panel{ .list-panel{
overflow: auto; overflow: auto;

View File

@ -62,7 +62,8 @@ export interface CreateChatDialogData {
| UserInfoSS | UserInfoSS
| UserInfoF | UserInfoF
| UserInfoDN | UserInfoDN
| RoomUserInfo)[]; | RoomUserInfo
)[];
} }
export interface CreateChatDialogResult { export interface CreateChatDialogResult {
@ -72,7 +73,8 @@ export interface CreateChatDialogResult {
| UserInfoSS | UserInfoSS
| UserInfoF | UserInfoF
| UserInfoDN | UserInfoDN
| RoomUserInfo)[]; | RoomUserInfo
)[];
selectedRoom?: RoomInfo; selectedRoom?: RoomInfo;
groupName?: string; groupName?: string;
oldGroup?: GroupDetailData; oldGroup?: GroupDetailData;
@ -132,7 +134,8 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy {
| UserInfoSS | UserInfoSS
| UserInfoF | UserInfoF
| UserInfoDN | UserInfoDN
| RoomUserInfo)[] = []; | RoomUserInfo
)[] = [];
isShowSelectedUserList = true; isShowSelectedUserList = true;
selectedRoom: RoomInfo; selectedRoom: RoomInfo;
@ -449,6 +452,14 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy {
); );
} }
getBtnValid() {
if (this.data.type === UserSelectDialogType.NewGroup) {
return this.inputForm.invalid;
} else {
return false;
}
}
/** 팝업의 선택 이벤트 전달. */ /** 팝업의 선택 이벤트 전달. */
onClickChoice(choice: boolean): void { onClickChoice(choice: boolean): void {
this.dialogRef.close({ this.dialogRef.close({

View File

@ -5,7 +5,7 @@
<mat-card-content> <mat-card-content>
<form name="inputForm" [formGroup]="inputForm" novalidate> <form name="inputForm" [formGroup]="inputForm" novalidate>
<div> <div>
<mat-form-field hintLabel="특수문자는 '-,_'만 사용할 수 있습니다."> <mat-form-field hintLabel="">
<input <input
matInput matInput
#input #input

View File

@ -12,6 +12,7 @@
[size]="leftSideComponentWidth" [size]="leftSideComponentWidth"
minSize="300" minSize="300"
maxSize="500" maxSize="500"
class="split-area"
> >
<div class="left-side"> <div class="left-side">
<app-layout-messenger-left-side <app-layout-messenger-left-side
@ -41,6 +42,7 @@
mode="side" mode="side"
position="end" position="end"
(openedChange)="onOpenedChange($event)" (openedChange)="onOpenedChange($event)"
class="rightDrawer"
> >
<app-layout-messenger-right-drawer <app-layout-messenger-right-drawer
[selectedRightDrawer]="selectedRightDrawer$ | async" [selectedRightDrawer]="selectedRightDrawer$ | async"

View File

@ -1,29 +1,42 @@
.container { .container {
height: 100%; height:100%;
display: flex; display: flex;
flex-flow: row; flex-flow: row;
padding-top: 30px; padding-top: 30px;
border: 3px solid #4f4f4f; border: 3px solid #4f4f4f;
border-top: none; border-top: none;
.left-side { .split-area{
overflow: hidden;
.left-side {
width: 100%; width: 100%;
height: 100%; height: 100%;
flex: 0 0 auto; flex: 0 0 auto;
position: relative; position: relative;
}
} }
.contents { .contents {
flex: 1 1 auto; flex: 1 1 auto;
min-width: 400px; min-width: 400px;
height: 100%; height: 100%;
.messages { .messages {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.rightDrawer{
width:420px;
height: 100%;
flex: 0 0 auto;
overflow: hidden;
}
} }
.right-side { .right-side {
height: 100%; height: 100%;
flex: 0 0 auto; flex: 0 0 auto;
} }
} }
::ng-deep .mat-drawer-inner-container{
overflow: unset !important;
}

View File

@ -46,7 +46,7 @@ ol {
list-style: none; list-style: none;
} }
$lg-red: ( $lg-red: (
50: #ffffff, 50: #faf3f6,
100: #f8bbd0, 100: #f8bbd0,
200: #f48fb1, 200: #f48fb1,
300: #f06292, 300: #f06292,
@ -78,6 +78,39 @@ $lg-red: (
) )
); );
$daesang: (
50: #e0f7fa,
100: #b2ebf2,
200: #80deea,
300: #4dd0e1,
400: #26c6da,
500: #00bcd4,
/*600: #00acc1,*/ 600: #00b6d5,
700: #0097a7,
800: #00838f,
900: #006064,
A100: #84ffff,
A200: #18ffff,
A400: #00e5ff,
A700: #00b8d4,
contrast: (
50: $dark-primary-text,
100: $dark-primary-text,
200: $dark-primary-text,
300: $dark-primary-text,
400: $dark-primary-text,
500: $light-primary-text,
600: $light-primary-text,
700: $light-primary-text,
800: $light-primary-text,
900: $light-primary-text,
A100: $dark-primary-text,
A200: $dark-primary-text,
A400: $dark-primary-text,
A700: $dark-primary-text,
)
);
@mixin ucap-material-theme($theme) { @mixin ucap-material-theme($theme) {
@include ucap-core-theme($theme); @include ucap-core-theme($theme);
} }
@ -101,10 +134,18 @@ $lg-red: (
background: mat-color($primary); background: mat-color($primary);
color: mat-color($primary, default-contrast); color: mat-color($primary, default-contrast);
} }
.bg-accent-darkest {
background: mat-color($accent, 900);
color: mat-color($primary, default-contrast);
}
.bg-accent-dark { .bg-accent-dark {
background: mat-color($accent, 600); background: mat-color($accent, 600);
color: mat-color($primary, default-contrast); color: mat-color($primary, default-contrast);
} }
.bg-accent-brightest {
background: mat-color($accent, 50);
color: mat-color($primary, $dark-primary-text);
}
.bg-accent-light { .bg-accent-light {
background: mat-color($accent, 300) !important; background: mat-color($accent, 300) !important;
color: mat-color($primary, default-contrast); color: mat-color($primary, default-contrast);

View File

@ -1,3 +1,7 @@
.bubble-main{ .bubble-main{
padding:10px; padding:10px;
img{
height:140px;
width:auto;
}
} }

View File

@ -1,4 +1,4 @@
<cdk-virtual-scroll-viewport #cvsvOrganization itemSize="48" fxFlexFill> <cdk-virtual-scroll-viewport #cvsvOrganization itemSize="40" fxFlexFill>
<ng-container <ng-container
*cdkVirtualFor="let node of dataSource.expandedData$" *cdkVirtualFor="let node of dataSource.expandedData$"
></ng-container> ></ng-container>
@ -9,9 +9,9 @@
class="organization-tree" class="organization-tree"
> >
<!-- This is the tree node template for leaf nodes --> <!-- This is the tree node template for leaf nodes -->
<mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding> <mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding class="mat-tree-last-node">
<li> <li>
<div class="mat-tree-node" (click)="onClickNode(node)"> <div (click)="onClickNode(node)">
{{ node.name }} {{ node.name }}
</div> </div>
</li> </li>
@ -23,7 +23,7 @@
class="tree-node-frame" class="tree-node-frame"
> >
<li> <li>
<div class="mat-tree-node" (click)="onClickNode(node)" class="path"> <div (click)="onClickNode(node)" class="path">
<span class="horizontal-line"></span> <span class="horizontal-line"></span>
<button <button
mat-icon-button mat-icon-button

View File

@ -6,14 +6,13 @@
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
list-style-type: none; list-style-type: none;
margin-left: 10px;
} }
.organization-tree-node-invisible { .organization-tree-node-invisible {
display: none; display: none;
} }
} }
.tree-node-frame { /*.tree-node-frame {
li { li {
.path { .path {
.horizontal-line { .horizontal-line {
@ -33,6 +32,37 @@
box-shadow: 0 1px 4px rgba(32, 33, 36, 0.1); box-shadow: 0 1px 4px rgba(32, 33, 36, 0.1);
} }
} }
}*/
.organization-tree{
.tree-node-frame {
height:40px;
min-height:40px;
li{
display:flex;
align-items: center;
cursor:pointer;
width:100%;
}
}
.mat-tree-last-node{
height:30px;
min-height:30px;
font-size: 13px;
li{
display:flex;
align-items: center;
width:100%;
height:100%;
padding-left:10px;
cursor:pointer;
&:hover {
background-color: #f4f4f4;
border: 1px solid #cccccc;
border-radius: 4px;
box-shadow: 0 1px 4px rgba(32, 33, 36, 0.1);
}
}
}
} }
ul .tree-node-frame li .path > .horizontal-line { ul .tree-node-frame li .path > .horizontal-line {

View File

@ -107,7 +107,7 @@ $thumbnail-msize: 40px;
display: flex; display: flex;
margin: 0; margin: 0;
padding: 0; padding: 0;
width: calc(100% - 60px);
.detail { .detail {
flex-direction: column; flex-direction: column;
width: calc(100% - 80px); width: calc(100% - 80px);

View File

@ -15,6 +15,12 @@ import {
CommonApiService CommonApiService
} from '@ucap-webmessenger/api-common'; } from '@ucap-webmessenger/api-common';
import { FileUtil } from '@ucap-webmessenger/core'; import { FileUtil } from '@ucap-webmessenger/core';
import { DialogService } from '../services/dialog.service';
import {
AlertDialogComponent,
AlertDialogResult,
AlertDialogData
} from '../dialogs/alert.dialog.component';
@Directive({ @Directive({
selector: 'input[ucapFileUploadFor], div[ucapFileUploadFor]' selector: 'input[ucapFileUploadFor], div[ucapFileUploadFor]'
@ -40,7 +46,8 @@ export class FileUploadForDirective implements AfterViewInit {
constructor( constructor(
private commonApiService: CommonApiService, private commonApiService: CommonApiService,
private elementRef: ElementRef, private elementRef: ElementRef,
private logger: NGXLogger private logger: NGXLogger,
private dialogService: DialogService
) {} ) {}
ngAfterViewInit(): void {} ngAfterViewInit(): void {}
@ -66,11 +73,11 @@ export class FileUploadForDirective implements AfterViewInit {
return; return;
} }
if (this.fileUploadQueue.isEventInElement(event)) { // if (this.fileUploadQueue.isEventInElement(event)) {
event.dataTransfer.dropEffect = 'copy'; // event.dataTransfer.dropEffect = 'copy';
} else { // } else {
event.dataTransfer.dropEffect = 'none'; // event.dataTransfer.dropEffect = 'none';
} // }
event.preventDefault(); event.preventDefault();
} }
@ -103,17 +110,32 @@ export class FileUploadForDirective implements AfterViewInit {
} }
const files: FileList = event.dataTransfer.files; const files: FileList = event.dataTransfer.files;
if ( const checkExt = this.commonApiService.acceptableExtensionForFileTalk(
!this.commonApiService.acceptableExtensionForFileTalk( FileUtil.getExtensions(files)
FileUtil.getExtensions(files) );
) if (!checkExt.accept) {
) {
this.logger.debug('window:drop not acceptable'); this.logger.debug('window:drop not acceptable');
if (!!this.fileUploadQueue) { if (!!this.fileUploadQueue) {
this.fileUploadQueue.onDragLeave(); this.fileUploadQueue.onDragLeave();
} }
this.elementRef.nativeElement.value = ''; this.elementRef.nativeElement.value = '';
this.dragOver = false; this.dragOver = false;
this.dialogService.open<
AlertDialogComponent,
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
data: {
title: 'Alert',
html: `지원하지 않는 파일형식입니다.${
checkExt.reject.length > 0
? '<br/>(' + checkExt.reject.join(',') + ')'
: ''
}`
}
});
return; return;
} }