This commit is contained in:
leejinho 2020-02-07 16:15:57 +09:00
commit d820d426ce
20 changed files with 213 additions and 144 deletions

View File

@ -5,6 +5,8 @@ import { app, BrowserWindow, screen, ipcMain, IpcMainEvent } from 'electron';
import windowStateKeeper from 'electron-window-state'; import windowStateKeeper from 'electron-window-state';
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import log from 'electron-log';
import { registerWindowStateChangedEvents } from '../lib/window-state'; import { registerWindowStateChangedEvents } from '../lib/window-state';
import { import {
ElectronAppChannel, ElectronAppChannel,
@ -164,10 +166,30 @@ export class AppWindow {
} }
); );
this.window.webContents.on(ElectronWebContentsChannel.DidFailLoad, () => { this.window.webContents.on(
this.window.webContents.openDevTools(); ElectronWebContentsChannel.DidFailLoad,
this.window.show(); (
}); event: Event,
errorCode: number,
errorDescription: string,
validatedURL: string,
isMainFrame: boolean
) => {
if ('ERR_FILE_NOT_FOUND' === errorDescription) {
this.load();
return;
}
log.error(
ElectronWebContentsChannel.DidFailLoad,
event,
errorCode,
errorDescription,
validatedURL,
isMainFrame
);
this.window.webContents.openDevTools();
}
);
registerWindowStateChangedEvents(this.window); registerWindowStateChangedEvents(this.window);

View File

@ -1,6 +1,6 @@
{ {
"name": "ucap-webmessenger", "name": "ucap-webmessenger",
"version": "0.0.16", "version": "0.0.17",
"author": { "author": {
"name": "LG CNS", "name": "LG CNS",
"email": "lgucap@lgcns.com" "email": "lgucap@lgcns.com"

View File

@ -10,26 +10,26 @@ const routes: Routes = [
import('./pages/messenger/messenger.page.module').then( import('./pages/messenger/messenger.page.module').then(
m => m.AppMessengerPageModule m => m.AppMessengerPageModule
), ),
canActivate: [AppAuthGuard], canActivate: [AppAuthGuard]
}, },
{ {
path: 'account', path: 'account',
loadChildren: () => loadChildren: () =>
import('./pages/account/account.page.module').then( import('./pages/account/account.page.module').then(
m => m.AppAccountPageModule m => m.AppAccountPageModule
), )
}, },
{ {
path: 'template', path: 'template',
loadChildren: () => loadChildren: () =>
import('./pages/template/template.page.module').then( import('./pages/template/template.page.module').then(
m => m.AppTemplatePageModule m => m.AppTemplatePageModule
), )
}, }
]; ];
@NgModule({ @NgModule({
imports: [RouterModule.forRoot(routes, { enableTracing: false })], imports: [RouterModule.forRoot(routes, { enableTracing: false })],
exports: [RouterModule], exports: [RouterModule]
}) })
export class AppRoutingModule {} export class AppRoutingModule {}

View File

@ -50,46 +50,37 @@
</div> </div>
</div> </div>
<div *ngIf="!isSearch" class="app-layout-chat-left-sidenav-chat-list"> <div *ngIf="!isSearch" class="app-layout-chat-left-sidenav-chat-list">
<perfect-scrollbar fxFlex="1 1 auto"> <virtual-scroller
<ucap-room-list-item #chatRoomList
*ngFor="let room of roomList" [items]="roomList"
[loginRes]="loginRes"
[isSelected]="(selectedRoomInfo$ | async)?.roomSeq === room.roomSeq"
[roomInfo]="room"
[roomUserInfo]="getRoomUserList(room)"
[sessionVerinfo]="sessionVerinfo"
(click)="onClickContextMenu('SELECT_ROOM', room)"
(contextmenu)="onContextMenuChat($event, room)"
class="ucap-clickable"
>
</ucap-room-list-item>
</perfect-scrollbar>
<!-- <cdk-virtual-scroll-viewport
#cvsvChatList
itemSize="60"
perfectScrollbar perfectScrollbar
fxFlexFill fxFlexFill
> >
<ucap-room-list-item <ucap-room-list-item
*cdkVirtualFor="let room of roomList" *ngFor="let room of chatRoomList.viewPortItems"
[loginRes]="loginRes" [loginRes]="loginRes"
[isSelected]="(selectedRoomInfo$ | async)?.roomSeq === room.roomSeq"
[roomInfo]="room" [roomInfo]="room"
[roomUserInfo]="getRoomUserList(room)" [roomUserInfo]="getRoomUserList(room)"
[sessionVerinfo]="sessionVerinfo" [sessionVerinfo]="sessionVerinfo"
(click)="onClickContextMenu('SELECT_ROOM', room)" (click)="onClickContextMenu('SELECT_ROOM', room)"
(contextmenu)="onContextMenuChat($event, room)" (contextmenu)="onContextMenuChat($event, room)"
class="ucap-clickable" class="ucap-clickable"
style="height: 60px;"
> >
</ucap-room-list-item> </ucap-room-list-item>
</cdk-virtual-scroll-viewport> --> </virtual-scroller>
</div> </div>
<div *ngIf="!!isSearch" class="app-layout-chat-left-sidenav-chat-list search"> <div *ngIf="!!isSearch" class="app-layout-chat-left-sidenav-chat-list search">
<perfect-scrollbar <virtual-scroller
fxFlex="1 1 auto"
*ngIf="!!searchRoomList && 0 < searchRoomList.length" *ngIf="!!searchRoomList && 0 < searchRoomList.length"
#chatRoomSearchList
[items]="searchRoomList"
perfectScrollbar
fxFlexFill
> >
<ucap-room-list-item <ucap-room-list-item
*ngFor="let room of searchRoomList" *ngFor="let room of chatRoomSearchList.viewPortItems"
[loginRes]="loginRes" [loginRes]="loginRes"
[isSelected]="(selectedRoomInfo$ | async)?.roomSeq === room.roomSeq" [isSelected]="(selectedRoomInfo$ | async)?.roomSeq === room.roomSeq"
[roomInfo]="room" [roomInfo]="room"
@ -99,22 +90,8 @@
(contextmenu)="onContextMenuChat($event, room)" (contextmenu)="onContextMenuChat($event, room)"
> >
</ucap-room-list-item> </ucap-room-list-item>
</perfect-scrollbar> </virtual-scroller>
<!-- <cdk-virtual-scroll-viewport
itemSize="60"
class="app-layout-chat-left-sidenav-chat-list-viewport"
>
<ucap-room-list-item
*cdkVirtualFor="let room of getRoomList()"
[loginRes]="loginRes"
[roomInfo]="room"
[roomUserInfo]="getRoomUserList(room)"
[sessionVerinfo]="sessionVerinfo"
(click)="onSelectedRoom(room)"
(contextmenu)="onContextMenuChat($event, room)"
>
</ucap-room-list-item>
</cdk-virtual-scroll-viewport> -->
<div <div
class="no-search-result" class="no-search-result"
fxFlexFill fxFlexFill

View File

@ -15,6 +15,7 @@
<ucap-organization-tree <ucap-organization-tree
[oraganizationList]="departmentInfoList$ | async" [oraganizationList]="departmentInfoList$ | async"
[loginRes]="loginRes" [loginRes]="loginRes"
[activate$]="organizationTreeActivatedSubject.asObservable()"
(selected)="onSelectedOrganization($event)" (selected)="onSelectedOrganization($event)"
class="tab-tree-frame" class="tab-tree-frame"
></ucap-organization-tree> ></ucap-organization-tree>

View File

@ -10,7 +10,13 @@ import {
ChangeDetectorRef ChangeDetectorRef
} from '@angular/core'; } from '@angular/core';
import { ucapAnimations, DialogService } from '@ucap-webmessenger/ui'; import { ucapAnimations, DialogService } from '@ucap-webmessenger/ui';
import { Observable, Subscription, of } from 'rxjs'; import {
Observable,
Subscription,
of,
BehaviorSubject,
combineLatest
} from 'rxjs';
import { import {
DeptInfo, DeptInfo,
QueryProtocolService, QueryProtocolService,
@ -40,7 +46,8 @@ import {
KEY_VER_INFO, KEY_VER_INFO,
EnvironmentsInfo, EnvironmentsInfo,
KEY_ENVIRONMENTS_INFO, KEY_ENVIRONMENTS_INFO,
KEY_AUTH_INFO KEY_AUTH_INFO,
MainMenu
} from '@app/types'; } from '@app/types';
import { take, map, tap, delay, catchError } from 'rxjs/operators'; import { take, map, tap, delay, catchError } from 'rxjs/operators';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
@ -154,6 +161,11 @@ export class OrganizationComponent
isShowSearch = false; isShowSearch = false;
searchUserInfos: UserInfoSS[] = []; searchUserInfos: UserInfoSS[] = [];
organizationTreeActivatedSubject: BehaviorSubject<
boolean
> = new BehaviorSubject<boolean>(false);
organizationTreeActivatedSubscription: Subscription;
/** 부서원 리스트에 virture scroll의 size 가 체킹되지 않아 강제 수행. 1번만. */ /** 부서원 리스트에 virture scroll의 size 가 체킹되지 않아 강제 수행. 1번만. */
isInitList = false; isInitList = false;
@ -256,6 +268,21 @@ export class OrganizationComponent
this.psDirectiveRef.update(); this.psDirectiveRef.update();
} }
}); });
this.organizationTreeActivatedSubscription = combineLatest([
this.store.pipe(
select(AppStore.MessengerSelector.SettingsSelector.gnbMenuIndex)
),
this.store.pipe(
select(
AppStore.MessengerSelector.SettingsSelector.organizationTreeActivated
)
)
]).subscribe(([menu, activate]) => {
this.organizationTreeActivatedSubject.next(
menu === MainMenu.Organization || activate
);
});
} }
ngAfterViewChecked(): void { ngAfterViewChecked(): void {
@ -277,6 +304,9 @@ export class OrganizationComponent
if (!!this.myDepartmentUserInfoListSubscription) { if (!!this.myDepartmentUserInfoListSubscription) {
this.myDepartmentUserInfoListSubscription.unsubscribe(); this.myDepartmentUserInfoListSubscription.unsubscribe();
} }
if (!!this.organizationTreeActivatedSubscription) {
this.organizationTreeActivatedSubscription.unsubscribe();
}
} }
/** 유저검색 */ /** 유저검색 */

View File

@ -154,7 +154,7 @@
> >
<mat-progress-bar mode="indeterminate"></mat-progress-bar> <mat-progress-bar mode="indeterminate"></mat-progress-bar>
</div> </div>
<div *ngIf="isShowSearchArea" class="chat-search bg-accent-color"> <div *ngIf="isShowSearchArea" class="chat-search">
<ucap-chat-search <ucap-chat-search
[totalCount]="searchTotalCount" [totalCount]="searchTotalCount"
[curIndex]="searchCurrentIndex" [curIndex]="searchCurrentIndex"

View File

@ -77,7 +77,12 @@
fxFlexFill fxFlexFill
class="guide-msg" class="guide-msg"
> >
{{ 'common.file.errors.cantPlay' | translate }} <div>
<span class="icon-img">
<i class="mid mdi-information-outline"></i>
</span>
{{ 'common.file.errors.cantPlay' | translate }}
</div>
</div> </div>
</div> </div>
<ul> <ul>

View File

@ -37,10 +37,23 @@ $tablet-s-width: 768px;
display: none; display: none;
} }
.select-file { .select-file {
height: 150px;
color: #212121; color: #212121;
border-bottom: 1px dotted #dddddd; border-bottom: 1px dotted #dddddd;
text-align: center; text-align: center;
padding-bottom: 10px; .guide-msg {
div {
display: flex;
flex-flow: column;
height: 140px;
justify-content: center;
justify-items: center;
color: #999999;
.icon-img {
margin-bottom: 6px;
}
}
}
} }
ul { ul {
padding-top: 10px; padding-top: 10px;

View File

@ -25,6 +25,7 @@ import { map, tap, catchError, take } from 'rxjs/operators';
import { Store, select } from '@ngrx/store'; import { Store, select } from '@ngrx/store';
import * as AppStore from '@app/store'; import * as AppStore from '@app/store';
import * as StatusStore from '@app/store/messenger/status'; import * as StatusStore from '@app/store/messenger/status';
import * as SettingsStore from '@app/store/messenger/settings';
import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { SessionStorageService } from '@ucap-webmessenger/web-storage';
import { Company } from '@ucap-webmessenger/api-external'; import { Company } from '@ucap-webmessenger/api-external';
@ -64,7 +65,6 @@ import {
} from '@ucap-webmessenger/ui'; } from '@ucap-webmessenger/ui';
import { TranslateService, TranslateParser } from '@ngx-translate/core'; import { TranslateService, TranslateParser } from '@ngx-translate/core';
import { environment } from '../../../../../environments/environment'; import { environment } from '../../../../../environments/environment';
import { StringUtil } from '@ucap-webmessenger/core';
export interface CreateChatDialogData { export interface CreateChatDialogData {
type?: string; type?: string;
@ -397,11 +397,17 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy {
onSelectedTabChange(tabChangeEvent: MatTabChangeEvent): void { onSelectedTabChange(tabChangeEvent: MatTabChangeEvent): void {
this.currentTabIndex = tabChangeEvent.index; this.currentTabIndex = tabChangeEvent.index;
if (tabChangeEvent.index === 2) { if (2 === tabChangeEvent.index) {
this.selectedUserList = []; this.selectedUserList = [];
} else { } else {
this.selectedRoom = null; this.selectedRoom = null;
} }
this.store.dispatch(
SettingsStore.organizationTreeActivated({
activate: 1 === tabChangeEvent.index
})
);
} }
/** 유저검색 */ /** 유저검색 */

View File

@ -7,3 +7,8 @@ export const selectedGnbMenuIndex = createAction(
'[Messenger::Settings] select Gnb MenuIndex', '[Messenger::Settings] select Gnb MenuIndex',
props<{ menuIndex: MainMenu }>() props<{ menuIndex: MainMenu }>()
); );
export const organizationTreeActivated = createAction(
'[Messenger::Settings] Organization Tree Activated',
props<{ activate: boolean }>()
);

View File

@ -1,6 +1,6 @@
import { createReducer, on } from '@ngrx/store'; import { createReducer, on } from '@ngrx/store';
import { initialState } from './state'; import { initialState } from './state';
import { selectedGnbMenuIndex } from './actions'; import { selectedGnbMenuIndex, organizationTreeActivated } from './actions';
import * as AuthenticationStore from '@app/store/account/authentication'; import * as AuthenticationStore from '@app/store/account/authentication';
@ -12,6 +12,12 @@ export const reducer = createReducer(
gnbMenuIndex: action.menuIndex gnbMenuIndex: action.menuIndex
}; };
}), }),
on(organizationTreeActivated, (state, action) => {
return {
...state,
organizationTreeActivated: action.activate
};
}),
on(AuthenticationStore.logoutInitialize, (state, action) => { on(AuthenticationStore.logoutInitialize, (state, action) => {
return { return {

View File

@ -5,14 +5,23 @@ import { MainMenu } from '@app/types';
export interface State { export interface State {
gnbMenuIndex: MainMenu; gnbMenuIndex: MainMenu;
organizationTreeActivated: boolean;
} }
export const initialState: State = { export const initialState: State = {
gnbMenuIndex: MainMenu.Group gnbMenuIndex: MainMenu.Group,
organizationTreeActivated: false
}; };
export function selectors<S>(selector: Selector<any, State>) { export function selectors<S>(selector: Selector<any, State>) {
return { return {
gnbMenuIndex: createSelector(selector, (state: State) => state.gnbMenuIndex) gnbMenuIndex: createSelector(
selector,
(state: State) => state.gnbMenuIndex
),
organizationTreeActivated: createSelector(
selector,
(state: State) => state.organizationTreeActivated
)
}; };
} }

View File

@ -420,12 +420,13 @@ $daesang-grey: (
} }
} }
} }
.chat-search-frame { /*.대화방 검색창 bg
chat-search-frame {
.chat-search { .chat-search {
//background-color: mat-color($accent, 600, 0.7); //background-color: mat-color($accent, 600, 0.7);
background-color: mat-color($accent, 800, 0.8); background-color: mat-color($accent, 800, 0.8);
} }
} }*/
.translationForm { .translationForm {
background-color: mat-color($accent, 200, 0.4); background-color: mat-color($accent, 200, 0.4);
} }
@ -454,4 +455,12 @@ $daesang-grey: (
background-color: mat-color($accent, 500); background-color: mat-color($accent, 500);
} }
} }
.chatroom-search{
.search-form{
border: 2px solid mat-color($accent, B100);
}
.btns{
background-color: mat-color($accent, B100);
}
}
} }

View File

@ -1,61 +1,3 @@
<!--<div fxFlex fxLayout="row" class="chatroom-search">
<div
fxLayout="row"
fxLayoutAlign="start center"
class="input input-lineless search-form"
>
<form [formGroup]="fgSearch">
<span class="icon-img">
<i class="mid mdi-magnify"></i>
</span>
<mat-form-field floatLabel="never">
<input
matInput
#inputSearch
type="text"
placeholder="{{ 'chat.searchEventByText' | translate }}"
value=""
formControlName="searchInput"
(keydown.enter)="onKeyDownEnter($event, inputSearch.value)"
/>
<button
mat-button
matSuffix
mat-icon-button
aria-label="Clear"
*ngIf="inputSearch.value"
(click)="inputSearch.value = ''"
>
<mat-icon>close</mat-icon>
</button>
</mat-form-field>
<span class="text-amount">{{ curIndex }} / {{ totalCount }}</span>
</form>
</div>
<span class="stroke-bar"></span>
<div class="btns">
<button
*ngIf="false"
mat-stroked-button
(click)="onClickSearchAndPrev()"
class="btn-toggle"
>
<i class="mid mdi-arrow-up"></i>
</button>
<button class="icon-button btn-search" (click)="onClickPrevSearch()">
<i class="mid mdi-arrow-up mdi-chevron-up"></i>
</button>
<button class="icon-button btn-search" (click)="onClickNextSearch()">
<i class="mid mdi-arrow-down mdi-chevron-down"></i>
</button>
<button
class="icon-button btn-close-searchbox bg-accent-dark"
(click)="inputSearch.value = ''; onClickSearchCancel()"
>
<i class="mid mdi-window-close"></i>
</button>
</div>
</div>-->
<div fxFlex fxLayout="row" class="chatroom-search"> <div fxFlex fxLayout="row" class="chatroom-search">
<div <div
fxLayout="row" fxLayout="row"
@ -66,7 +8,7 @@
<span class="icon-img"> <span class="icon-img">
<i class="mid mdi-magnify"></i> <i class="mid mdi-magnify"></i>
</span> </span>
<mat-form-field floatLabel="never"> <mat-form-field floatLabel="never" class="white">
<input <input
matInput matInput
#inputSearch #inputSearch
@ -90,7 +32,7 @@
<span class="text-amount">{{ curIndex }} / {{ totalCount }}</span> <span class="text-amount">{{ curIndex }} / {{ totalCount }}</span>
</form> </form>
</div> </div>
<span class="stroke-bar"></span>
<div class="btns"> <div class="btns">
<button <button
*ngIf="false" *ngIf="false"
@ -101,16 +43,18 @@
<i class="mid mdi-arrow-up"></i> <i class="mid mdi-arrow-up"></i>
</button> </button>
<button class="icon-button btn-search" (click)="onClickPrevSearch()"> <button class="icon-button btn-search" (click)="onClickPrevSearch()">
<i class="mid mdi-chevron-up"></i> <i class="mid mid-24 mdi-chevron-up"></i>
</button> </button>
<span class="stroke-bar"></span>
<button class="icon-button btn-search" (click)="onClickNextSearch()"> <button class="icon-button btn-search" (click)="onClickNextSearch()">
<i class="mid mdi-chevron-down"></i> <i class="mid mid-24 mdi-chevron-down"></i>
</button> </button>
<span class="stroke-bar"></span>
<button <button
class="icon-button btn-close-searchbox bg-accent-dark" class="icon-button btn-close-searchbox"
(click)="inputSearch.value = ''; onClickSearchCancel()" (click)="inputSearch.value = ''; onClickSearchCancel()"
> >
<i class="mid mdi-window-close"></i> <i class="mid mdi-window-close"></i>
</button> </button>
</div> </div>
</div> </div>

View File

@ -1,21 +1,22 @@
$tablet-l-width: 1024px; $tablet-l-width: 1024px;
$tablet-s-width: 768px; $tablet-s-width: 768px;
$search-item-color: #ffffff; $search-item-color: #444444;
.chatroom-search { .chatroom-search {
display: flex; display: flex;
flex: 0 0 auto; flex: 1 1 auto;
justify-items: center; justify-items: center;
width: 100%; width: 100%;
.search-form { .search-form {
flex-flow: row; flex-flow: row;
padding: 0 0 0 20px; padding: 0 0 0 10px;
margin-left: 10px;
width: calc(100% - 126px); width: calc(100% - 126px);
position: relative; position: relative;
@media screen and (max-width: #{$tablet-s-width}), @media screen and (max-width: #{$tablet-s-width}),
(max-height: 600px) { (max-height: 600px) {
padding: 0 0 0 14px; padding: 0 0 0 14px;
flex: 0 0 auto; flex: 1 1 auto;
} }
form { form {
display: inline-flex; display: inline-flex;
@ -34,6 +35,12 @@ $search-item-color: #ffffff;
.mat-hint { .mat-hint {
color: rgba(0, 0, 0, 0.54); color: rgba(0, 0, 0, 0.54);
} }
&.white {
.mat-form-field-label,
.mat-hint {
color: rgba(0, 0, 0, 0.54);
}
}
} }
} }
} }
@ -72,17 +79,17 @@ $search-item-color: #ffffff;
position: relative; position: relative;
.btns { .btns {
display: flex; display: flex;
flex: 0 0 0%; flex: 1 1 auto;
margin-left: auto; margin-left: auto;
margin-top: 0; margin-top: 0;
height: 100%; height: 100%;
button { button {
margin-left: 4px; margin-left: 4px;
&.btn-search.icon-button { &.icon-button {
align-self: center; align-self: center;
width: 30px; width: 30px;
height: 30px; height: 30px;
color: $search-item-color; color: #ffffff;
} }
} }
} }
@ -94,14 +101,15 @@ $search-item-color: #ffffff;
display: flex; display: flex;
justify-content: center; justify-content: center;
justify-items: center; justify-items: center;
margin-right: 4px;
} }
} }
.stroke-bar { .stroke-bar {
width: 2px; width: 1px;
height: 20px; height: 20px;
background-color: rgba(255, 255, 255, 0.3); background-color: rgba(255, 255, 255, 0.3);
display: inline-flex; display: inline-flex;
align-self: center; align-self: center;
margin: 0 6px; margin: 0 4px;
} }

View File

@ -20,7 +20,7 @@ import { VirtualScrollTreeFlatDataSource } from '@ucap-webmessenger/ui';
import { ucapAnimations } from '@ucap-webmessenger/ui'; import { ucapAnimations } from '@ucap-webmessenger/ui';
import { trigger, transition, style, animate } from '@angular/animations'; import { trigger, transition, style, animate } from '@angular/animations';
import { PerfectScrollbarDirective } from 'ngx-perfect-scrollbar'; import { PerfectScrollbarDirective } from 'ngx-perfect-scrollbar';
import { Subscription } from 'rxjs'; import { Subscription, Observable } from 'rxjs';
interface OrganizationNode { interface OrganizationNode {
deptInfo: DeptInfo; deptInfo: DeptInfo;
@ -103,6 +103,9 @@ export class TreeComponent implements OnInit, OnDestroy, AfterViewInit {
this.dataSource.data = rootNodeList; this.dataSource.data = rootNodeList;
} }
@Input()
activate$: Observable<boolean>;
@Output() @Output()
selected = new EventEmitter<DeptInfo>(); selected = new EventEmitter<DeptInfo>();
@ -121,6 +124,8 @@ export class TreeComponent implements OnInit, OnDestroy, AfterViewInit {
treeControlExpansionChangeSubscription: Subscription; treeControlExpansionChangeSubscription: Subscription;
activateSubscription: Subscription;
constructor( constructor(
private changeDetectorRef: ChangeDetectorRef, private changeDetectorRef: ChangeDetectorRef,
private logger: NGXLogger private logger: NGXLogger
@ -154,13 +159,24 @@ export class TreeComponent implements OnInit, OnDestroy, AfterViewInit {
this.psDirectiveRef.update(); this.psDirectiveRef.update();
} }
); );
this.activateSubscription = this.activate$.subscribe(activate => {
if (activate) {
setTimeout(() => {
if (!!this.cvsvOrganization) {
this.cvsvOrganization.checkViewportSize();
}
}, 100);
}
});
} }
ngOnDestroy(): void { ngOnDestroy(): void {
this.logger.debug('-----------------------TreeComponent ngOnDestroy');
if (!!this.treeControlExpansionChangeSubscription) { if (!!this.treeControlExpansionChangeSubscription) {
this.treeControlExpansionChangeSubscription.unsubscribe(); this.treeControlExpansionChangeSubscription.unsubscribe();
} }
if (!!this.activateSubscription) {
this.activateSubscription.unsubscribe();
}
} }
ngAfterViewInit(): void { ngAfterViewInit(): void {

View File

@ -43,7 +43,7 @@ $login-max-height: 800px;
position: relative; position: relative;
justify-content: flex-start; justify-content: flex-start;
flex-flow: column; flex-flow: column;
width: 38%; width: 40%;
height: 100%; height: 100%;
background: #64cddf; background: #64cddf;
color: #ffffff; color: #ffffff;
@ -163,7 +163,7 @@ $login-max-height: 800px;
} }
.mat-card-content { .mat-card-content {
position: relative; position: relative;
width: 62%; width: 60%;
height: 100%; height: 100%;
padding-bottom: 10px; padding-bottom: 10px;
margin-left: 30px; margin-left: 30px;

View File

@ -21,7 +21,7 @@ textarea {
width: 100%; width: 100%;
.mat-form-field-appearance-legacy { .mat-form-field-appearance-legacy {
.mat-form-field-wrapper { .mat-form-field-wrapper {
color: #ffffff; //color: #ffffff;
width: 100%; width: 100%;
.mat-form-field-infix { .mat-form-field-infix {
.mat-input-element { .mat-input-element {
@ -42,7 +42,8 @@ textarea {
} }
} }
.mat-form-field-label { .mat-form-field-label {
color: rgba(255, 255, 255, 0.7) !important; color: currentColor;
opacity: 0.7;
font-size: 1em; font-size: 1em;
} }
.mat-form-field-underline { .mat-form-field-underline {
@ -73,6 +74,7 @@ textarea {
width: 90%; width: 90%;
align-items: center; align-items: center;
display: flex; display: flex;
color: #ffffff;
.mat-form-field-wrapper { .mat-form-field-wrapper {
padding: 0; padding: 0;
display: flex; display: flex;
@ -89,7 +91,8 @@ textarea {
top: 0; top: 0;
.mat-form-field-label { .mat-form-field-label {
top: 0; top: 0;
color: rgba(255, 255, 255, 0.7) !important; color: currentColor;
opacity: 0.7;
font-size: 0.9em; font-size: 0.9em;
} }
} }
@ -99,6 +102,9 @@ textarea {
} }
} }
//텍스트 선명도 //텍스트 선명도
&.white {
color: #333333;
}
} }
} }

View File

@ -1,7 +1,15 @@
import { Directive, OnInit, OnDestroy, Self, Inject } from '@angular/core'; import {
Directive,
OnInit,
OnDestroy,
Self,
Inject,
ChangeDetectorRef
} from '@angular/core';
import { Subject, fromEvent } from 'rxjs'; import { Subject, fromEvent } from 'rxjs';
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
import { debounceTime, takeUntil } from 'rxjs/operators'; import { debounceTime, takeUntil } from 'rxjs/operators';
import { DOCUMENT } from '@angular/common';
@Directive({ @Directive({
// tslint:disable-next-line: directive-selector // tslint:disable-next-line: directive-selector
@ -14,13 +22,17 @@ export class CdkVirtualScrollViewportPatchDirective
constructor( constructor(
@Self() @Self()
@Inject(CdkVirtualScrollViewport) @Inject(CdkVirtualScrollViewport)
private readonly viewportComponent: CdkVirtualScrollViewport private readonly viewportComponent: CdkVirtualScrollViewport,
@Inject(DOCUMENT)
private readonly document: Document
) {} ) {}
ngOnInit() { ngOnInit() {
fromEvent(window, 'resize') fromEvent(this.document.defaultView, 'resize')
.pipe(debounceTime(10), takeUntil(this.destroySubject)) .pipe(debounceTime(10), takeUntil(this.destroySubject))
.subscribe(() => this.viewportComponent.checkViewportSize()); .subscribe(() => {
this.viewportComponent.checkViewportSize();
});
} }
ngOnDestroy() { ngOnDestroy() {