This commit is contained in:
병준 박 2019-11-21 18:23:11 +09:00
commit 44def4db5f
17 changed files with 218 additions and 139 deletions

View File

@ -33,6 +33,7 @@
width: 70px; width: 70px;
flex-direction: row; flex-direction: row;
} }
::ng-deep .organization-side { ::ng-deep .organization-side {
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
@ -44,6 +45,7 @@
flex-flow: column; flex-flow: column;
height: 280px; height: 280px;
padding-top: 10px; padding-top: 10px;
border-bottom: none;
.mat-tab-label { .mat-tab-label {
width: 100%; width: 100%;
height: 80px; height: 80px;
@ -92,11 +94,15 @@
.mat-tab-label-content { .mat-tab-label-content {
.icon-item { .icon-item {
transform: scale(1); transform: scale(1);
/*svg {
stroke: #ef4c73;
fill: #ef4c73;
}*/
} }
} }
} }
} }
::ng-deep .ps {
.ps-content {
position: relative;
width: 100%;
height: 100%;
}
}

View File

@ -14,6 +14,7 @@
} }
.list-search { .list-search {
position: relative;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
height: 60px; height: 60px;

View File

@ -16,13 +16,6 @@
} }
} }
} }
::ng-deep .ps {
.ps-content {
position: relative;
width: 100%;
height: 100%;
}
}
.search-result { .search-result {
height: calc(100% - 130px); height: calc(100% - 130px);
@ -52,7 +45,7 @@
} }
} }
.list-item-frame{ .list-item-frame {
width:100%; width: 100%;
height:100%; height: 100%;
} }

View File

@ -886,13 +886,17 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit {
}); });
if (!!result && !!result.choice && result.choice) { if (!!result && !!result.choice && result.choice) {
const userSeqs: number[] = []; const userSeqs: number[] = this.userInfoList.map(
userInfo => userInfo.seq
);
if ( if (
!!result.selectedUserList && !!result.selectedUserList &&
result.selectedUserList.length > 0 result.selectedUserList.length > 0
) { ) {
result.selectedUserList.map(user => { result.selectedUserList.forEach(user => {
userSeqs.push(user.seq); if (userSeqs.indexOf(user.seq) < 0) {
userSeqs.push(user.seq);
}
}); });
} }

View File

@ -9,4 +9,11 @@
span{ span{
margin-left:auto; margin-left:auto;
} }
}
::ng-deep .mat-tab-labels {
display: flex;
width: 100%;
border-bottom: 2px solid #dddddd;
flex: 1 1 auto;
justify-content: space-around;
} }

View File

@ -1,4 +1,4 @@
<div fxLayout="column" class="album-box"> <div fxLayout="column" class="rightDrawer-albumbox">
<div> <div>
<mat-tab-group (selectedIndexChange)="onSelectedIndexChange($event)"> <mat-tab-group (selectedIndexChange)="onSelectedIndexChange($event)">
<mat-tab label="Image"></mat-tab> <mat-tab label="Image"></mat-tab>
@ -81,7 +81,7 @@
</ng-container> </ng-container>
</div> </div>
<div class="search-list"> <div class="search-list">
<perfect-scrollbar> <perfect-scrollbar class="album-scrollbar">
<div <div
*ngFor="let fileInfo of filteredList" *ngFor="let fileInfo of filteredList"
class="img-item" class="img-item"

View File

@ -13,25 +13,23 @@
} }
} }
.album-box { ::ng-deep .rightDrawer-albumbox {
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
.mat-tab-labels {
.search-list { .mat-tab-label {
overflow: auto; width: 50%;
}
} }
} }
::ng-deep .mat-tab-label{
width:50%;
}
.select-filebox{ .select-filebox{
display:flex; display:flex;
flex-flow: column; flex-flow: column;
margin:10px; margin:10px;
padding:10px; padding:10px;
border:1px solid #cccccc; border:1px solid #cccccc;
border-radius: 4px;
.select-file{ .select-file{
color: #212121; color: #212121;
border-bottom: 1px dotted #dddddd; border-bottom: 1px dotted #dddddd;
@ -66,6 +64,7 @@
height: calc(100% - 450px); height: calc(100% - 450px);
overflow-y: auto; overflow-y: auto;
flex-wrap: wrap; flex-wrap: wrap;
.img-item { .img-item {
cursor: pointer; cursor: pointer;
margin-bottom:10px; margin-bottom:10px;
@ -99,6 +98,14 @@
} }
} }
::ng-deep .album-scrollbar{
.ps{
.ps-content{
display:flex;
flex-flow: wrap;
}
}
}
.preview-image, .preview-image,
.preview-video{ .preview-video{
max-height: 140px; max-height: 140px;

View File

@ -123,56 +123,58 @@
</ng-container> </ng-container>
</div> </div>
<div fxFlex="0 0 auto" class="table-box"> <div fxFlex="0 0 auto" class="table-box">
<table mat-table [dataSource]="dataSource" matSort> <perfect-scrollbar class="album-scrollbar">
<ng-container matColumnDef="check"> <table mat-table [dataSource]="dataSource" matSort>
<th mat-header-cell *matHeaderCellDef> <ng-container matColumnDef="check">
<mat-checkbox <th mat-header-cell *matHeaderCellDef>
#checkboxAll <mat-checkbox
[checked]="getCheckAllUser()" #checkboxAll
(change)="onCheckAllkUser(checkboxAll.checked)" [checked]="getCheckAllUser()"
(click)="$event.stopPropagation()" (change)="onCheckAllkUser(checkboxAll.checked)"
> (click)="$event.stopPropagation()"
</mat-checkbox> >
</th> </mat-checkbox>
<td mat-cell *matCellDef="let element"> </th>
<mat-checkbox <td mat-cell *matCellDef="let element">
#checkbox <mat-checkbox
[checked]="getCheckUser(element)" #checkbox
(change)="onCheckUser(checkbox.checked, element)" [checked]="getCheckUser(element)"
(click)="$event.stopPropagation()" (change)="onCheckUser(checkbox.checked, element)"
> (click)="$event.stopPropagation()"
</mat-checkbox> >
</td> </mat-checkbox>
</ng-container> </td>
<ng-container matColumnDef="name"> </ng-container>
<th mat-header-cell *matHeaderCellDef mat-sort-header class="infos"> <ng-container matColumnDef="name">
Name <th mat-header-cell *matHeaderCellDef mat-sort-header class="infos">
</th> Name
<td mat-cell *matCellDef="let element" class="file-info"> </th>
<div class="file-name"> <td mat-cell *matCellDef="let element" class="file-info">
{{ element.info.name }} <div class="file-name">
</div> {{ element.info.name }}
<div class="download-period text-accent-color"> </div>
<!--{{ element.info.size | ucapBytes }}--> <div class="download-period text-accent-color">
{{ element.info.sendDate | dateToStringFormat: 'YYYY.MM.DD' }} ~ <!--{{ element.info.size | ucapBytes }}-->
2020.01.23 {{ element.info.sendDate | dateToStringFormat: 'YYYY.MM.DD' }} ~
</div> 2020.01.23
</td> </div>
</ng-container> </td>
<ng-container matColumnDef="sendDate" class="date"> </ng-container>
<th mat-header-cell *matHeaderCellDef mat-sort-header>sendDate</th> <ng-container matColumnDef="sendDate" class="date">
<td mat-cell *matCellDef="let element"> <th mat-header-cell *matHeaderCellDef mat-sort-header>sendDate</th>
<!--{{ element.info.sendDate | dateToStringFormat: 'YYYY.MM.DD' }}--> <td mat-cell *matCellDef="let element">
{{ element.info.size | ucapBytes }} <!--{{ element.info.sendDate | dateToStringFormat: 'YYYY.MM.DD' }}-->
</td> {{ element.info.size | ucapBytes }}
</ng-container> </td>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> </ng-container>
<tr <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
mat-row <tr
*matRowDef="let row; columns: displayedColumns" mat-row
(click)="onClickRow(row)" *matRowDef="let row; columns: displayedColumns"
></tr> (click)="onClickRow(row)"
</table> ></tr>
</table>
</perfect-scrollbar>
</div> </div>
<div class="footer-fix"> <div class="footer-fix">
<mat-paginator <mat-paginator

View File

@ -13,7 +13,7 @@
} }
} }
.rightDrawer-filebox { ::ng-deep .rightDrawer-filebox {
width: 100%; width: 100%;
height: calc(100% - 60px); height: calc(100% - 60px);
.rightDrawer-tab { .rightDrawer-tab {
@ -23,16 +23,13 @@
} }
} }
::ng-deep .mat-tab-label {
width: 50%;
}
.select-filebox { .select-filebox {
position: relative; position: relative;
display: flex; display: flex;
flex-flow: column; flex-flow: column;
margin: 10px; margin: 10px;
border: 1px solid #cccccc; border: 1px solid #cccccc;
border-radius: 4px;
.select-flie { .select-flie {
display: flex; display: flex;
flex-flow: row; flex-flow: row;
@ -114,7 +111,7 @@
} }
} }
.table-box { .table-box {
height: calc(100% - 450px); height: calc(100% - 440px);
overflow-y: auto; overflow-y: auto;
} }
.mat-paginator-container { .mat-paginator-container {

View File

@ -1,3 +1,48 @@
div.message-box { .list-search {
width: 600px; display: flex;
flex-direction: row;
height: 60px;
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;
}
}
} }

View File

@ -3,7 +3,7 @@ import {
OnInit, OnInit,
OnDestroy, OnDestroy,
Output, Output,
EventEmitter, EventEmitter
} from '@angular/core'; } from '@angular/core';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { Store, select } from '@ngrx/store'; import { Store, select } from '@ngrx/store';
@ -21,13 +21,13 @@ import { DialogService } from '@ucap-webmessenger/ui';
import { import {
SelectGroupDialogComponent, SelectGroupDialogComponent,
SelectGroupDialogResult, SelectGroupDialogResult,
SelectGroupDialogData, SelectGroupDialogData
} from '../../dialogs/group/select-group.dialog.component'; } from '../../dialogs/group/select-group.dialog.component';
import { GroupDetailData } from '@ucap-webmessenger/protocol-sync'; import { GroupDetailData } from '@ucap-webmessenger/protocol-sync';
import { import {
CreateChatDialogComponent, CreateChatDialogComponent,
CreateChatDialogResult, CreateChatDialogResult,
CreateChatDialogData, CreateChatDialogData
} from '../../dialogs/chat/create-chat.dialog.component'; } from '../../dialogs/chat/create-chat.dialog.component';
import { UserSelectDialogType } from '@app/types'; import { UserSelectDialogType } from '@app/types';
import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
@ -36,7 +36,7 @@ import { KEY_LOGIN_RES_INFO } from '@app/types/login-res-info.type';
@Component({ @Component({
selector: 'app-layout-chat-right-drawer-room-user-list', selector: 'app-layout-chat-right-drawer-room-user-list',
templateUrl: './room-user-list.component.html', templateUrl: './room-user-list.component.html',
styleUrls: ['./room-user-list.component.scss'], styleUrls: ['./room-user-list.component.scss']
}) })
export class RoomUserListComponent implements OnInit, OnDestroy { export class RoomUserListComponent implements OnInit, OnDestroy {
@Output() @Output()
@ -105,15 +105,19 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
title: 'Edit Chat Member', title: 'Edit Chat Member',
curRoomUser: this.userInfoList.filter( curRoomUser: this.userInfoList.filter(
user => user.seq !== this.loginRes.userSeq user => user.seq !== this.loginRes.userSeq
), )
}, }
}); });
if (!!result && !!result.choice && result.choice) { if (!!result && !!result.choice && result.choice) {
const userSeqs: number[] = []; const userSeqs: number[] = this.userInfoList.map(
userInfo => userInfo.seq
);
if (!!result.selectedUserList && result.selectedUserList.length > 0) { if (!!result.selectedUserList && result.selectedUserList.length > 0) {
result.selectedUserList.map(user => { result.selectedUserList.forEach(user => {
userSeqs.push(user.seq); if (userSeqs.indexOf(user.seq) < 0) {
userSeqs.push(user.seq);
}
}); });
} }
@ -125,8 +129,8 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
RoomStore.inviteOrOpen({ RoomStore.inviteOrOpen({
req: { req: {
divCd: 'Invite', divCd: 'Invite',
userSeqs, userSeqs
}, }
}) })
); );
} }
@ -141,8 +145,8 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
>(SelectGroupDialogComponent, { >(SelectGroupDialogComponent, {
width: '600px', width: '600px',
data: { data: {
title: 'Group Select', title: 'Group Select'
}, }
}); });
if (!!result && !!result.choice && result.choice) { if (!!result && !!result.choice && result.choice) {
@ -159,7 +163,7 @@ export class RoomUserListComponent implements OnInit, OnDestroy {
this.store.dispatch( this.store.dispatch(
SyncStore.updateGroupMember({ SyncStore.updateGroupMember({
oldGroup, oldGroup,
trgtUserSeq, trgtUserSeq
}) })
); );
} }

View File

@ -70,9 +70,9 @@
<ucap-group-expansion-panel <ucap-group-expansion-panel
#groupExpansionPanel #groupExpansionPanel
[groupBuddyList]="groupBuddyList$ | async" [groupBuddyList]="groupBuddyList$ | async"
[favoritBuddyList]="favoritBuddyList$ | async"
[selectedUserList]="selectedUserList" [selectedUserList]="selectedUserList"
[checkable]="true" [checkable]="true"
(checkGroup)="onCheckGroup($event)"
class="group-expansion" class="group-expansion"
> >
<ucap-profile-user-list-item <ucap-profile-user-list-item
@ -138,20 +138,6 @@
<mat-icon>chat</mat-icon> <mat-icon>chat</mat-icon>
</ng-template> </ng-template>
<div> <div>
<!-- <cdk-virtual-scroll-viewport itemSize="20" style="height: 100%">
<ucap-room-list-item
*cdkVirtualFor="let room of roomList"
[loginRes]="loginRes"
[roomInfo]="room"
[roomUserInfo]="getRoomUserList(room)"
[sessionVerinfo]="sessionVerinfo"
[checkable]="getCheckableRoom(room)"
[isChecked]="getCheckedRoom(room)"
[multiCheckable]="false"
(checkRoom)="onCheckRoom($event)"
>
</ucap-room-list-item>
</cdk-virtual-scroll-viewport> -->
<ucap-room-list-item <ucap-room-list-item
*ngFor="let room of roomList" *ngFor="let room of roomList"
[loginRes]="loginRes" [loginRes]="loginRes"

View File

@ -376,6 +376,7 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy {
} }
} }
/** 조직도 > 부서원 전체 선택 */
onCheckAllUser(params: { onCheckAllUser(params: {
isChecked: boolean; isChecked: boolean;
userInfos: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[]; userInfos: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[];

View File

@ -43,12 +43,14 @@
<ucap-chat-message-box-information <ucap-chat-message-box-information
*ngSwitchCase="EventType.RenameRoom" *ngSwitchCase="EventType.RenameRoom"
[message]="message" [message]="message"
class="information-msg"
> >
</ucap-chat-message-box-information> </ucap-chat-message-box-information>
<ucap-chat-message-box-information <ucap-chat-message-box-information
*ngSwitchCase="EventType.GuideForRoomTimerChanged" *ngSwitchCase="EventType.GuideForRoomTimerChanged"
[message]="message" [message]="message"
[senderName]="getUserName(message.senderSeq)" [senderName]="getUserName(message.senderSeq)"
class="information-msg"
> >
</ucap-chat-message-box-information> </ucap-chat-message-box-information>
</ng-container> </ng-container>

View File

@ -47,27 +47,38 @@
</mat-icon> </mat-icon>
</button> </button>
<ng-container [ngSwitch]="node.nodeType"> <ng-container [ngSwitch]="node.nodeType">
<span *ngSwitchCase="NodeType.Profile">내 프로필</span> <span *ngSwitchCase="NodeType.Profile">
<span *ngSwitchCase="NodeType.Favorit" <span class="title-name ellipsis">내 프로필</span>
>즐겨찾기 </span>
<span class="text-accent-color number" <span *ngSwitchCase="NodeType.Favorit">
>({{ node.countOfChildren }}명)</span <span class="title-name ellipsis">즐겨찾기</span>
<span class="text-accent-color number">
({{ node.countOfChildren }}명)</span
></span ></span
> >
<span *ngSwitchCase="NodeType.Buddy"> <span *ngSwitchCase="NodeType.Buddy">
<span class="title-name ellipsis">{{ <span class="title-name ellipsis">{{
node.groupDetail.name node.groupDetail.name
}}</span> }}</span>
<span class="text-accent-color number" <span class="text-accent-color number">
>({{ node.countOfChildren }}명)</span ({{ node.countOfChildren }}명)</span
> >
</span> </span>
</ng-container> </ng-container>
<mat-checkbox
*ngIf="checkable"
#checkbox
[checked]="getCheckedGroup(node.groupDetail)"
(change)="onChangeCheck(checkbox.checked, node.groupDetail)"
(click)="$event.stopPropagation()"
class="group-check"
>
</mat-checkbox>
<button <button
mat-icon-button mat-icon-button
aria-label="group menu" aria-label="group menu"
*ngIf="node.nodeType !== NodeType.Profile" *ngIf="node.nodeType !== NodeType.Profile && !checkable"
(click)="onClickMore($event, node.groupDetail)" (click)="onClickMore($event, node.groupDetail)"
class="group-menu" class="group-menu"
> >

View File

@ -64,6 +64,11 @@
line-height: 20px; line-height: 20px;
margin-right: 10px; margin-right: 10px;
} }
.group-check {
margin-left: auto;
margin-right: 16px;
}
.group-menu { .group-menu {
margin-left: auto; margin-left: auto;
opacity: 0.6; opacity: 0.6;

View File

@ -108,6 +108,8 @@ export class ExpansionPanelComponent
return; return;
} }
this.groupList = list;
this.buddyNodes = []; this.buddyNodes = [];
for (const item of list) { for (const item of list) {
@ -179,6 +181,8 @@ export class ExpansionPanelComponent
treeFlattener: MatTreeFlattener<GroupNode, FlatNode>; treeFlattener: MatTreeFlattener<GroupNode, FlatNode>;
dataSource: VirtualScrollTreeFlatDataSource<GroupNode, FlatNode>; dataSource: VirtualScrollTreeFlatDataSource<GroupNode, FlatNode>;
groupList: { group: GroupDetailData; buddyList: UserInfo[] }[];
constructor( constructor(
private changeDetectorRef: ChangeDetectorRef, private changeDetectorRef: ChangeDetectorRef,
private logger: NGXLogger private logger: NGXLogger
@ -237,30 +241,34 @@ export class ExpansionPanelComponent
} }
/** 그룹리스트가 checkable 할 경우 checkbox 의 change 이벤트를 상위 컴포넌트로 전달한다. */ /** 그룹리스트가 checkable 할 경우 checkbox 의 change 이벤트를 상위 컴포넌트로 전달한다. */
onChangeCheck( onChangeCheck(value: boolean, group: GroupDetailData, nodeType: NodeType) {
value: boolean, const groupInfos = this.groupList.filter(
groupBuddyList: { group: GroupDetailData; buddyList: UserInfo[] } groupInfo => groupInfo.group.seq === group.seq
) { );
this.checkGroup.emit({
isChecked: value, if (groupInfos.length > 0) {
groupBuddyList this.checkGroup.emit({
}); isChecked: value,
groupBuddyList: groupInfos[0]
});
}
} }
/** 그룹리스트가 checkable 할 경우 checkbox 의 isChecked 를 관장하며, 하위 부서원들의 전체선택여부를 판단한다. */ /** 그룹리스트가 checkable 할 경우 checkbox 의 isChecked 를 관장하며, 하위 부서원들의 전체선택여부를 판단한다. */
getCheckedGroup(groupBuddy: { getCheckedGroup(group: GroupDetailData) {
group: GroupDetailData; if (!group || group === undefined) {
buddyList: UserInfo[];
}) {
if (groupBuddy.buddyList.length === 0) {
return false; return false;
} }
if (group.userSeqs.length === 0) {
return false;
}
if (!!this.selectedUserList && this.selectedUserList.length > 0) { if (!!this.selectedUserList && this.selectedUserList.length > 0) {
let allExist = true; let allExist = true;
groupBuddy.buddyList.some(groupUser => { group.userSeqs.some(seq => {
if ( if (
this.selectedUserList.filter(item => item.seq === groupUser.seq) this.selectedUserList.filter(item => item.seq === seq).length === 0
.length === 0
) { ) {
allExist = false; allExist = false;
return true; return true;