0530 sync

This commit is contained in:
Park Byung Eun 2020-05-31 18:35:45 +09:00
parent 5733157489
commit cbe1ddbd29
22 changed files with 321 additions and 303 deletions

18
package-lock.json generated
View File

@ -3508,8 +3508,8 @@
"dev": true "dev": true
}, },
"@ucap/ng-store-chat": { "@ucap/ng-store-chat": {
"version": "file:pack/ucap-ng-store-chat-0.0.16.tgz", "version": "file:pack/ucap-ng-store-chat-0.0.19.tgz",
"integrity": "sha512-Rwupo2Gqa+4+0ANBZLtup+mdlTU42Tj5gkGnJJ86Vylo4xQcdR+PUdedWZ/lG7DyzrfBc8ON80aUPRikpWUCow==", "integrity": "sha512-J6jhvJW7GfFOIrPfXnDZ2sqUF10C7cJm8d/9O7ThxJ8muvKhQ/ZN86yJLLtA8Y+sIIupnUikH2MGNW7mgZjHPg==",
"dev": true "dev": true
}, },
"@ucap/ng-store-group": { "@ucap/ng-store-group": {
@ -3523,8 +3523,8 @@
"dev": true "dev": true
}, },
"@ucap/ng-ui": { "@ucap/ng-ui": {
"version": "file:pack/ucap-ng-ui-0.0.19.tgz", "version": "file:pack/ucap-ng-ui-0.0.24.tgz",
"integrity": "sha512-UuZSzWM4tBR+e5Z/1PFdNenHS00Pn4K7dTafIicG29YjHE5sTXXRqjDCVrKNxJQoMSEPWjUj7qnTgYwP2U83Vg==", "integrity": "sha512-7G+Ee2EPYwDv64yMmy+Ga5Wcj7HK8YC0WLqvRWrLv3XZQtLfZ/oP/lWyjPvCNme0hNQo6EH1MpPn6u+uhoST6w==",
"dev": true "dev": true
}, },
"@ucap/ng-ui-authentication": { "@ucap/ng-ui-authentication": {
@ -3533,8 +3533,8 @@
"dev": true "dev": true
}, },
"@ucap/ng-ui-chat": { "@ucap/ng-ui-chat": {
"version": "file:pack/ucap-ng-ui-chat-0.0.12.tgz", "version": "file:pack/ucap-ng-ui-chat-0.0.13.tgz",
"integrity": "sha512-uXtqUm3O0l/7jIh9KAXrxFxma/EAtnwpr1c30gOSxDcsMgp/Tuuqb/7YjI2AOIYHaq9iWX0yNNab1ijH5Pcj+g==", "integrity": "sha512-ytFXvVxwkaNXH6RY4jdXpwqwfq6+HPiYN+Jqv1o5oddhlpBd7OSzhudUew318GJgclxoXbStcSc0/UODDdTptw==",
"dev": true "dev": true
}, },
"@ucap/ng-ui-group": { "@ucap/ng-ui-group": {
@ -3548,13 +3548,13 @@
"dev": true "dev": true
}, },
"@ucap/ng-ui-organization": { "@ucap/ng-ui-organization": {
"version": "file:pack/ucap-ng-ui-organization-0.0.83.tgz", "version": "file:pack/ucap-ng-ui-organization-0.0.84.tgz",
"integrity": "sha512-ls2xfMNbceUecR0Vrhm/qzbKDJmBENtA4Y0ODVKVgjui8IQnS/EXGXSeNS+rFrnASTlI2XHWiaVHFqdZi/4ipQ==", "integrity": "sha512-T2q3KPCjY1ZZ1bY4UtSvY1XWpb0T8AZ9GbuOFlAJK3rs+grZC+iAmC8NO8iWhUgELdUStN1Mh8ja77RSo9Nqlg==",
"dev": true "dev": true
}, },
"@ucap/ng-ui-skin-default": { "@ucap/ng-ui-skin-default": {
"version": "file:pack/ucap-ng-ui-skin-default-0.0.1.tgz", "version": "file:pack/ucap-ng-ui-skin-default-0.0.1.tgz",
"integrity": "sha512-+lHYAzbnyyWh6hf+Ui7vP/ibyGJXuDUO++82jOiOsnPMCl17hkCCag8vQcB/aVgl0iHmebiPshnsL3CptJfeAg==" "integrity": "sha512-xYq5hlNUjo39R1TLBaUR59GjgGyCzTdj5CWZyUIBbFicBirsSERoUX5704HlTa0L8YSjW7exOL8VWSgEsMng6g=="
}, },
"@ucap/ng-web-socket": { "@ucap/ng-web-socket": {
"version": "file:pack/ucap-ng-web-socket-0.0.2.tgz", "version": "file:pack/ucap-ng-web-socket-0.0.2.tgz",

View File

@ -185,15 +185,15 @@
"@ucap/ng-protocol-sync": "file:pack/ucap-ng-protocol-sync-0.0.3.tgz", "@ucap/ng-protocol-sync": "file:pack/ucap-ng-protocol-sync-0.0.3.tgz",
"@ucap/ng-protocol-umg": "file:pack/ucap-ng-protocol-umg-0.0.3.tgz", "@ucap/ng-protocol-umg": "file:pack/ucap-ng-protocol-umg-0.0.3.tgz",
"@ucap/ng-store-authentication": "file:pack/ucap-ng-store-authentication-0.0.11.tgz", "@ucap/ng-store-authentication": "file:pack/ucap-ng-store-authentication-0.0.11.tgz",
"@ucap/ng-store-chat": "file:pack/ucap-ng-store-chat-0.0.16.tgz", "@ucap/ng-store-chat": "file:pack/ucap-ng-store-chat-0.0.19.tgz",
"@ucap/ng-store-group": "file:pack/ucap-ng-store-group-0.0.14.tgz", "@ucap/ng-store-group": "file:pack/ucap-ng-store-group-0.0.14.tgz",
"@ucap/ng-store-organization": "file:pack/ucap-ng-store-organization-0.0.8.tgz", "@ucap/ng-store-organization": "file:pack/ucap-ng-store-organization-0.0.8.tgz",
"@ucap/ng-ui": "file:pack/ucap-ng-ui-0.0.19.tgz", "@ucap/ng-ui": "file:pack/ucap-ng-ui-0.0.24.tgz",
"@ucap/ng-ui-authentication": "file:pack/ucap-ng-ui-authentication-0.0.25.tgz", "@ucap/ng-ui-authentication": "file:pack/ucap-ng-ui-authentication-0.0.25.tgz",
"@ucap/ng-ui-chat": "file:pack/ucap-ng-ui-chat-0.0.12.tgz", "@ucap/ng-ui-chat": "file:pack/ucap-ng-ui-chat-0.0.13.tgz",
"@ucap/ng-ui-group": "file:pack/ucap-ng-ui-group-0.0.33.tgz", "@ucap/ng-ui-group": "file:pack/ucap-ng-ui-group-0.0.33.tgz",
"@ucap/ng-ui-material": "file:pack/ucap-ng-ui-material-0.0.4.tgz", "@ucap/ng-ui-material": "file:pack/ucap-ng-ui-material-0.0.4.tgz",
"@ucap/ng-ui-organization": "file:pack/ucap-ng-ui-organization-0.0.83.tgz", "@ucap/ng-ui-organization": "file:pack/ucap-ng-ui-organization-0.0.84.tgz",
"@ucap/ng-ui-skin-default": "file:pack/ucap-ng-ui-skin-default-0.0.1.tgz", "@ucap/ng-ui-skin-default": "file:pack/ucap-ng-ui-skin-default-0.0.1.tgz",
"@ucap/ng-web-socket": "file:pack/ucap-ng-web-socket-0.0.2.tgz", "@ucap/ng-web-socket": "file:pack/ucap-ng-web-socket-0.0.2.tgz",
"@ucap/ng-web-storage": "file:pack/ucap-ng-web-storage-0.0.3.tgz", "@ucap/ng-web-storage": "file:pack/ucap-ng-web-storage-0.0.3.tgz",

View File

@ -1,6 +1,6 @@
{ {
"name": "@ucap/ng-store-chat", "name": "@ucap/ng-store-chat",
"version": "0.0.16", "version": "0.0.19",
"publishConfig": { "publishConfig": {
"registry": "https://nexus.loafle.net/repository/npm-ucap/" "registry": "https://nexus.loafle.net/repository/npm-ucap/"
}, },

View File

@ -20,7 +20,7 @@ import { EventProtocolService } from '@ucap/ng-protocol-event';
import { RoomProtocolService } from '@ucap/ng-protocol-room'; import { RoomProtocolService } from '@ucap/ng-protocol-room';
import { FileProtocolService } from '@ucap/ng-protocol-file'; import { FileProtocolService } from '@ucap/ng-protocol-file';
import * as roomActions from '../room/actions'; import * as RoomActions from '../room/actions';
import { import {
events, events,
eventsFailure, eventsFailure,
@ -51,26 +51,6 @@ import { Chatting } from './state';
@Injectable() @Injectable()
export class Effects { export class Effects {
selectedRoom$ = createEffect(
() => {
return this.actions$.pipe(
ofType(roomActions.selectedRoom),
debounceTime(300),
tap((action) => {
const requestCount = this.moduleConfig?.eventRequestInitCount || 50;
const req: InfoRequest = {
roomId: action.roomId,
baseSeq: 0,
requestCount
};
this.store.dispatch(events({ req }));
})
);
},
{ dispatch: false }
);
events$ = createEffect( events$ = createEffect(
() => { () => {
return this.actions$.pipe( return this.actions$.pipe(
@ -239,7 +219,6 @@ export class Effects {
ofType(sendSuccess), ofType(sendSuccess),
tap((action) => { tap((action) => {
const res = action.res; const res = action.res;
console.log('sendSuccess', action);
this.store.dispatch( this.store.dispatch(
addEvent({ addEvent({
@ -255,6 +234,29 @@ export class Effects {
{ dispatch: false } { dispatch: false }
); );
/*******************************************************************
* [Room Action watching.]
*******************************************************************/
selectedRoomSuccess$ = createEffect(
() => {
return this.actions$.pipe(
ofType(RoomActions.selectedRoomSuccess),
debounceTime(300),
tap((action) => {
const requestCount = this.moduleConfig?.eventRequestInitCount || 50;
const req: InfoRequest = {
roomId: action.roomId,
baseSeq: 0,
requestCount
};
this.store.dispatch(events({ req }));
})
);
},
{ dispatch: false }
);
constructor( constructor(
private actions$: Actions, private actions$: Actions,
private store: Store<any>, private store: Store<any>,

View File

@ -9,11 +9,10 @@ import {
adapterFileInfoCheckList adapterFileInfoCheckList
} from './state'; } from './state';
import * as roomActions from '../room/actions'; import * as RoomActions from '../room/actions';
import { import {
eventsSuccess, eventsSuccess,
eventsFailure, eventsFailure,
readSuccess,
fileInfosSuccess, fileInfosSuccess,
fileInfosFailure, fileInfosFailure,
addEvent addEvent
@ -22,24 +21,6 @@ import {
export const reducer = createReducer( export const reducer = createReducer(
initialState, initialState,
on(roomActions.selectedRoom, (state, action) => {
return {
...state,
activeRoomId: action.roomId
};
}),
on(roomActions.clearSelectedRoom, (state, action) => {
if (action.roomId === state.activeRoomId) {
return {
...state,
activeRoomId: null
};
} else {
return state;
}
}),
on(eventsSuccess, (state, action) => { on(eventsSuccess, (state, action) => {
const roomId = action.res.roomId; const roomId = action.res.roomId;
@ -188,5 +169,35 @@ export const reducer = createReducer(
} else { } else {
return state; return state;
} }
}),
/*******************************************************************
* [Room Action watching.]
*******************************************************************/
on(RoomActions.selectedRoomSuccess, (state, action) => {
return {
...state,
activeRoomId: action.roomId
};
}),
on(RoomActions.clearSelectedRoom, (state, action) => {
if (action.roomId === state.activeRoomId) {
return {
...state,
activeRoomId: null
};
} else {
return state;
}
}),
on(RoomActions.close, (state, action) => {
const roomIds = action.roomIds;
return {
...state,
chattings: adapterChatting.removeMany(roomIds, { ...state.chattings })
};
}) })
); );

View File

@ -23,7 +23,9 @@ import {
ExitForcingResponse, ExitForcingResponse,
UpdateTimerSetRequest, UpdateTimerSetRequest,
UpdateTimerSetResponse, UpdateTimerSetResponse,
UserInfoShort UserInfo,
UserInfoShort,
InfoResponse
} from '@ucap/protocol-room'; } from '@ucap/protocol-room';
/** /**
@ -33,6 +35,23 @@ export const selectedRoom = createAction(
'[ucap::chat::selectedRoom] selected room', '[ucap::chat::selectedRoom] selected room',
props<{ roomId: string; localeCode: LocaleCode }>() props<{ roomId: string; localeCode: LocaleCode }>()
); );
/**
* retrieve selected Room Success.
*/
export const selectedRoomSuccess = createAction(
'[ucap::chat::selectedRoom] selected room validation Success',
props<{
roomId: string;
roomInfo2Res: {
roomInfo: RoomInfo;
roomUserInfo: {
userInfoList: UserInfo[];
userInfoShortList: UserInfoShort[];
};
res: InfoResponse;
};
}>()
);
/** /**
* clear selected Room. * clear selected Room.
*/ */
@ -391,7 +410,7 @@ export const updateTimeRoomIntervalFailure = createAction(
); );
/** /**
* norification for invited users * notification for invited users
*/ */
export const inviteNotification = createAction( export const inviteNotification = createAction(
'[ucap::chat::room] invite Notification', '[ucap::chat::room] invite Notification',
@ -399,9 +418,14 @@ export const inviteNotification = createAction(
); );
/** /**
* norification for exited user * notification for exited user
*/ */
export const exitNotification = createAction( export const exitNotification = createAction(
'[ucap::chat::room] Exit Notification', '[ucap::chat::room] Exit Notification',
props<{ roomId: string; userSeq: string; senderSeq: string }>() props<{ roomId: string; userSeq: string; senderSeq: string }>()
); );
export const updateUnreadCount = createAction(
'[ucap::chat::room] Update unread count',
props<{ roomId: string; noReadCnt?: number }>()
);

View File

@ -31,8 +31,7 @@ import { RoomProtocolService } from '@ucap/ng-protocol-room';
import { SyncProtocolService } from '@ucap/ng-protocol-sync'; import { SyncProtocolService } from '@ucap/ng-protocol-sync';
import { LoginActions } from '@ucap/ng-store-authentication'; import { LoginActions } from '@ucap/ng-store-authentication';
import { addEventSuccess } from '../Chatting/actions'; import * as ChattingAction from '../Chatting/actions';
import { RoomSelector } from '../state'; import { RoomSelector } from '../state';
import { import {
@ -78,7 +77,9 @@ import {
delMultiSuccess, delMultiSuccess,
delMultiFailure, delMultiFailure,
selectedRoom, selectedRoom,
room2Success room2Success,
selectedRoomSuccess,
clearSelectedRoom
} from './actions'; } from './actions';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { LocaleCode } from '@ucap/core'; import { LocaleCode } from '@ucap/core';
@ -104,7 +105,38 @@ export class Effects {
}; };
// retrieve room info // retrieve room info
this.store.dispatch(room({ req })); this.roomProtocolService
.info2(req)
.pipe(
map((res) => {
let isJoinRoom = true;
if (!res.roomInfo || !res.roomInfo.isJoinRoom) {
isJoinRoom = false;
}
if (!!isJoinRoom) {
this.store.dispatch(
selectedRoomSuccess({
roomId: req.roomId,
roomInfo2Res: res
})
);
} else {
// is not join room. so, redirect chat main.
this.router.navigate([
'chat',
{
outlets: { content: 'index' }
}
]);
this.store.dispatch(
clearSelectedRoom({ roomId: req.roomId })
);
}
}),
catchError((error) => of(roomFailure({ error })))
)
.subscribe();
// retrieve event info >> chatting.effect.selectedRoom$ // retrieve event info >> chatting.effect.selectedRoom$
}) })
@ -113,6 +145,24 @@ export class Effects {
{ dispatch: false } { dispatch: false }
); );
selectedRoomSuccess$ = createEffect(
() => {
return this.actions$.pipe(
ofType(selectedRoomSuccess),
tap((action) => {
// room info success reduce.
this.store.dispatch(
room2Success({
roomInfo: action.roomInfo2Res.roomInfo,
roomUserInfo: action.roomInfo2Res.roomUserInfo
})
);
})
);
},
{ dispatch: false }
);
rooms$ = createEffect(() => { rooms$ = createEffect(() => {
return this.actions$.pipe( return this.actions$.pipe(
ofType(rooms), ofType(rooms),
@ -237,7 +287,9 @@ export class Effects {
exhaustMap((req) => { exhaustMap((req) => {
return this.roomProtocolService.exit(req).pipe( return this.roomProtocolService.exit(req).pipe(
switchMap((res: DeleteResponse) => [ switchMap((res: DeleteResponse) => [
// close room, clear chatting
close({ roomIds: [res.roomId] }), close({ roomIds: [res.roomId] }),
// clear room in rooms.
delSuccess({ res }) delSuccess({ res })
]), ]),
catchError((error) => of(delFailure({ error }))) catchError((error) => of(delFailure({ error })))
@ -253,7 +305,9 @@ export class Effects {
exhaustMap((req) => { exhaustMap((req) => {
return this.roomProtocolService.exitAll(req).pipe( return this.roomProtocolService.exitAll(req).pipe(
switchMap((res: DeleteMultiResponse) => [ switchMap((res: DeleteMultiResponse) => [
// close room, clear chatting
close({ roomIds: res.roomIds }), close({ roomIds: res.roomIds }),
// clear room in rooms.
delMultiSuccess({ res }) delMultiSuccess({ res })
]), ]),
catchError((error) => of(delMultiFailure({ error }))) catchError((error) => of(delMultiFailure({ error })))
@ -430,7 +484,7 @@ export class Effects {
addEventSuccess$ = createEffect( addEventSuccess$ = createEffect(
() => { () => {
return this.actions$.pipe( return this.actions$.pipe(
ofType(addEventSuccess), ofType(ChattingAction.addEventSuccess),
withLatestFrom(this.store.pipe(select(RoomSelector.rooms))), withLatestFrom(this.store.pipe(select(RoomSelector.rooms))),
map(([action, roomList]) => { map(([action, roomList]) => {
const roomId = action.roomId; const roomId = action.roomId;

View File

@ -26,7 +26,8 @@ import {
delMultiSuccess, delMultiSuccess,
updateSuccess, updateSuccess,
room2Success, room2Success,
createSuccess createSuccess,
updateUnreadCount
} from './actions'; } from './actions';
import { Info, EventJson } from '@ucap/protocol-event'; import { Info, EventJson } from '@ucap/protocol-event';
import { ChatUtil } from '../../utils/chat.util'; import { ChatUtil } from '../../utils/chat.util';
@ -53,7 +54,6 @@ export const reducer = createReducer(
const value = state.rooms.entities[key]; const value = state.rooms.entities[key];
unreadTotal += isNaN(value.noReadCnt) ? 0 : value.noReadCnt; unreadTotal += isNaN(value.noReadCnt) ? 0 : value.noReadCnt;
} }
action.roomList.map((item) => (unreadTotal += item.noReadCnt));
return { return {
...state, ...state,
@ -324,6 +324,32 @@ export const reducer = createReducer(
}; };
}), }),
on(updateUnreadCount, (state, action) => {
const roomId = action.roomId;
const noReadCnt = action.noReadCnt || 0;
const roomInfo = state.rooms.entities[roomId];
let unreadTotal = 0;
// tslint:disable-next-line: forin
for (const key in state.rooms.entities) {
const value = state.rooms.entities[key];
unreadTotal += isNaN(value.noReadCnt) ? 0 : value.noReadCnt;
}
if (!!roomInfo) {
return {
...state,
rooms: adapterRoom.updateOne(
{ id: roomId, changes: { ...roomInfo, noReadCnt } },
{ ...state.rooms }
),
unreadTotal
};
} else {
return state;
}
}),
/******************************************************************* /*******************************************************************
* [Chatting Action watching.] * [Chatting Action watching.]
*******************************************************************/ *******************************************************************/

View File

@ -1,6 +1,6 @@
{ {
"name": "@ucap/ng-ui-chat", "name": "@ucap/ng-ui-chat",
"version": "0.0.12", "version": "0.0.13",
"publishConfig": { "publishConfig": {
"registry": "https://nexus.loafle.net/repository/npm-ucap/" "registry": "https://nexus.loafle.net/repository/npm-ucap/"
}, },

View File

@ -90,6 +90,20 @@ export class RoomExpansionComponent implements OnInit, OnDestroy {
this.nodeMap.set(item.division, [node]); this.nodeMap.set(item.division, [node]);
} }
} }
// deleted filtering.
this.nodeMap = new Map(
[...this.nodeMap.entries()].filter(
(map) => list.findIndex((item) => item.division === map[0]) > -1
)
);
// sorting.
this.nodeMap = new Map(
[...this.nodeMap.entries()].sort((a, b) =>
b[0] > a[0] ? 1 : b[0] < a[0] ? -1 : 0
)
);
} }
this.refreshNodes(); this.refreshNodes();
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@ucap/ng-ui-organization", "name": "@ucap/ng-ui-organization",
"version": "0.0.83", "version": "0.0.84",
"publishConfig": { "publishConfig": {
"registry": "https://nexus.loafle.net/repository/npm-ucap/" "registry": "https://nexus.loafle.net/repository/npm-ucap/"
}, },

View File

@ -1,7 +1,48 @@
<div class="ucap-organization-profile-01-container"> <div class="ucap-organization-profile-01-container">
<!--Profile --> <!--Profile -->
<div class="profile-card-box"> <div class="profile-card-content">
<div class="user-profile-info"> <div *ngIf="!isMe" class="btn-profile-option-area">
<div class="btn-profile-favorites">
<button
mat-icon-button
class="btn-star-add"
aria-label="Example icon-button with a heart icon"
*ngIf="isBuddy"
(click)="onToggleFavorit()"
>
<mat-icon>star_border</mat-icon>
</button>
<button
mat-icon-button
class="btn-star-add"
aria-label="Example icon-button with a heart icon"
(click)="onClickAddBuddy()"
>
<mat-icon>star</mat-icon>
</button>
</div>
<div class="btn-group-add">
<button
mat-icon-button
class="btn-group-add"
aria-label="Example icon-button with a heart icon"
*ngIf="getShowBuddyToggleBtn('DEL')"
(click)="onClickDelBuddy()"
>
<img src="../../../assets/images/ico/btn_group_add.svg" />
</button>
<button
mat-icon-button
class="btn-star-delete"
aria-label="Example icon-button with a heart icon"
*ngIf="getShowBuddyToggleBtn('DEL')"
(click)="onClickDelBuddy()"
>
<img src="../../../assets/images/ico/btn_group_delete.svg" />
</button>
</div>
</div>
<div class="user-profile-info-area">
<!--[[ 대화상대 프로필--> <!--[[ 대화상대 프로필-->
<!-- 모바일이 온라인일 경우 + mobile-ing --> <!-- 모바일이 온라인일 경우 + mobile-ing -->
<div class="user-profile-thumb"> <div class="user-profile-thumb">
@ -11,13 +52,10 @@
[matTooltip]="presenceMsg" [matTooltip]="presenceMsg"
matTooltipPosition="after" matTooltipPosition="after"
></span> ></span>
<div class="profileImage" (click)="onProfileImageView()"> <div class="profile-image" (click)="onProfileImageView()">
<img <img src="../../../assets/images/ico/img_nophoto.svg" />
src="../../../assets/images/ico/img_nophoto.svg"
style="width: 122px; height: 122px;"
/>
</div> </div>
<!--[[ 내프로필--> <!--[[ 내프로필]-->
<div *ngIf="isMe" class="btn-profile-ctrl"> <div *ngIf="isMe" class="btn-profile-ctrl">
<button <button
mat-mini-fab mat-mini-fab
@ -37,7 +75,7 @@
<!--]]--> <!--]]-->
</div> </div>
<!--]]--> <!--]]-->
<div class="userInfo"> <div class="user-info">
<div class="user-n-g"> <div class="user-n-g">
<div class="name">{{ userInfo?.name }}</div> <div class="name">{{ userInfo?.name }}</div>
<div class="grade">{{ userInfo?.grade }}</div> <div class="grade">{{ userInfo?.grade }}</div>
@ -46,8 +84,8 @@
<ng-container *ngIf="!isMe"> <ng-container *ngIf="!isMe">
<!-- + 대화상대 프로필 추가 --> <!-- + 대화상대 프로필 추가 -->
<div class="nickName"> <div class="nickname-area">
<div class="nickName-info"> <div class="nickname-info">
<mat-form-field <mat-form-field
class="example-full-width my-in-input" class="example-full-width my-in-input"
appearance="none" appearance="none"
@ -70,7 +108,6 @@
<mat-icon>create</mat-icon> <mat-icon>create</mat-icon>
</button> </button>
</div> </div>
<!--]]-->
</ng-container> </ng-container>
<ng-container <ng-container
*ngIf="isMe; then mineProfileIntro; else otherProfileIntro" *ngIf="isMe; then mineProfileIntro; else otherProfileIntro"
@ -106,36 +143,9 @@
</div> </div>
</ng-template> </ng-template>
</div> </div>
</div>
<div *ngIf="!isMe" class="btn-profile-add"> <div class="btn-link-area">
<button
mat-icon-button
class="btn-star-add"
aria-label="Example icon-button with a heart icon"
*ngIf="isBuddy"
(click)="onToggleFavorit()"
>
<img src="../../../assets/images/ico/btn_favorite_w24_s.svg" alt="" />
</button>
<button
mat-icon-button
class="btn-star-add"
aria-label="Example icon-button with a heart icon"
*ngIf="getShowBuddyToggleBtn('ADD')"
(click)="onClickAddBuddy()"
>
<img src="../../../assets/images/ico/btn_group_add_w24.svg" alt="" />
</button>
<button
mat-icon-button
class="btn-star-add"
aria-label="Example icon-button with a heart icon"
*ngIf="getShowBuddyToggleBtn('DEL')"
(click)="onClickDelBuddy()"
>
<img src="../../../assets/images/ico/btn_group_add_w24.svg" alt="" />
</button>
</div>
<div *ngIf="!isMe" class="btn-partner-set"> <div *ngIf="!isMe" class="btn-partner-set">
<button mat-icon-button aria-label="chat" (click)="onOpenChat()"> <button mat-icon-button aria-label="chat" (click)="onOpenChat()">
<img src="../../../assets/images/ico/btn_lise_chat_a24.svg" alt="" /> <img src="../../../assets/images/ico/btn_lise_chat_a24.svg" alt="" />
@ -169,7 +179,25 @@
<img src="../../../assets/images/ico/btn_list_vc-a24.svg" alt="" /> <img src="../../../assets/images/ico/btn_list_vc-a24.svg" alt="" />
</button> </button>
</div> </div>
<div *ngIf="isMe" class="btn-my-set">
<button mat-icon-button aria-label="mytalk">
<img src="../../../assets/images/ico/btn_lise_chat_a24.svg" alt="" />
</button>
<button mat-icon-button aria-label="profile_set">
<img
src="../../../assets/images/ico/btn_list_profile_set_a24.svg"
alt=""
/>
</button>
<button mat-icon-button aria-label="setting">
<img
src="../../../assets/images/ico/btn_list_setting_a24.svg"
alt=""
/>
</button>
</div>
</div> </div>
<div class="user-profile-info-list"> <div class="user-profile-info-list">
<ul> <ul>
<li> <li>

View File

@ -3,119 +3,66 @@
.ucap-organization-profile-01-container { .ucap-organization-profile-01-container {
width: 100%; width: 100%;
height: 100%; height: 100%;
min-width: 450px; min-width: 450px;
@include screen(mid) { @include screen(mid) {
height: auto; height: auto;
} }
.profile-card-box { .profile-card-content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 60px 8.7%;
width: 100%; width: 100%;
position: relative; position: relative;
.user-profile-info { .btn-profile-option-area {
position: absolute;
right: 0;
display: flex;
justify-content: flex-end;
}
.user-profile-info-area {
display: inline-flex; display: inline-flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
// Profile thumb////////////////// // Profile thumb//////////////////
.user-profile-thumb { .user-profile-thumb {
display: flex;
align-self: flex-start;
.profile-image {
display: flex;
align-items: flex-start;
}
} }
//////////////////Profile thumb // //////////////////Profile thumb //
.userInfo { .user-info {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
justify-content: center; justify-content: center;
padding-left: 38px;
.user-n-g { .user-n-g {
display: flex; display: flex;
flex-direction: row;
flex-flow: row-reverse nowrap; flex-flow: row-reverse nowrap;
align-items: flex-end; align-items: flex-end;
height: 44px;
.name { .name {
font: {
size: 26px;
weight: 600;
}
order: 1; order: 1;
-ms-flex-order: 1; -ms-flex-order: 1;
} }
.grade {
font: {
size: 18px;
}
color: #f1f1f1;
margin-left: 6px;
order: 0;
-ms-flex-order: 0;
}
& + .deptName {
margin-top: 9px;
}
} }
.deptName { .nickname-area {
font: {
size: 22px;
}
line-height: 25px;
font-weight: 600;
}
.nickName {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
margin-top: 18px;
align-items: center;
.nickName-info {
padding: 0 16px;
height: 30px;
line-height: 30px;
border-radius: 15px;
border: solid 1px #fc5182;
background-color: rgba(255, 255, 255, 0.95);
font: {
size: 14px;
}
}
button {
}
}
.address-txt {
font: {
size: 16px;
}
line-height: 21px;
margin-top: 20px;
}
}
.btn-profile-add {
position: absolute;
z-index: 5;
top: 40px;
right: 40px;
button {
margin: 0 2px;
&.btn-star-add {
line-height: 24px !important;
}
} }
} }
} }
.btn-partner-set { }
.btn-links-area {
.btn-partner-set,
.btn-my-set {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 0 25px;
border-top: 1px solid rgba(255, 255, 255, 0.8);
border-bottom: 1px solid rgba(255, 255, 255, 0.8);
height: 70px;
margin-top: 30px;
img {
vertical-align: top;
}
} }
.my-input { .my-input {
display: flex; display: flex;
@ -123,65 +70,28 @@
justify-content: space-between; justify-content: space-between;
margin: 0; margin: 0;
width: 100%; width: 100%;
margin-top: 78px;
.my-in-input {
font: {
size: 16px;
}
.my-in-input {
flex-grow: 1; flex-grow: 1;
height: 24px;
line-height: 24px;
margin-top: 8px;
} }
button { button {
margin-bottom: 5px;
} }
} }
.user-profile-info-list { .user-profile-info-list {
margin-top: 60px;
ul { ul {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
height: 250px;
li {
font: {
size: 16px;
}
font-weight: 600;
span {
width: 100px;
height: 34px;
border-radius: 18px;
border: solid 1px #f8f9fd;
background-color: #aaa0a5;
font: {
size: 14px;
weight: 600;
}
font-weight: 600;
display: inline-flex;
align-items: center;
justify-content: center;
margin-right: 40px;
}
}
} }
} }
} }
///////////////////////////////////////////////////////////////////////////////// 제거 ///////////////////////////////////////////////////////////////////////////////// 제거
.profile-card { .profile-card {
//mat-card
width: 100%; width: 100%;
background-color: transparent; background-color: transparent;
box-shadow: none; box-shadow: none;
.profileImage { .profileImage {
width: 126px;
height: 126px;
border-radius: 50%;
box-sizing: border-box; box-sizing: border-box;
overflow: hidden; overflow: hidden;
display: flex; display: flex;

View File

@ -1,5 +1,5 @@
<div class="ucap-organization-profile-list-item-01-container"> <div class="ucap-organization-profile-list-item-01-container">
<div class="user-profile-info"> <div class="user-profile-info-content">
<div class="profile-image"> <div class="profile-image">
<ng-content <ng-content
select="[ucapOrganizationProfileListItem01='profileImage']" select="[ucapOrganizationProfileListItem01='profileImage']"
@ -23,7 +23,7 @@
<div class="companyName">{{ userInfo.companyName }}</div> <div class="companyName">{{ userInfo.companyName }}</div>
<div class="email">{{ userInfo.email }}</div> <div class="email">{{ userInfo.email }}</div>
</div> </div>
<div class="contact"> <div class="contact-info">
<div class="mobileNumber" (click)="onSendCall($event, CallType.Mobile)"> <div class="mobileNumber" (click)="onSendCall($event, CallType.Mobile)">
{{ userInfo.hpNumber | ucapPhoneNumber }} {{ userInfo.hpNumber | ucapPhoneNumber }}
</div> </div>
@ -31,7 +31,7 @@
{{ userInfo.lineNumber | ucapPhoneNumber }} {{ userInfo.lineNumber | ucapPhoneNumber }}
</div> </div>
</div> </div>
<div *ngIf="checkable"> <div *ngIf="checkable" class="checkbox-area">
<mat-checkbox <mat-checkbox
#checkbox #checkbox
[checked]="checked" [checked]="checked"

View File

@ -6,25 +6,19 @@
.ucap-organization-profile-list-item-01-container { .ucap-organization-profile-list-item-01-container {
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-left: var(--ucap-organization-profile-list-item-01-padding);
padding-right: var(--ucap-organization-profile-list-item-01-padding);
display: flex; display: flex;
flex-flow: row nowrap; flex-flow: row nowrap;
justify-content: space-between; justify-content: space-between;
padding: 0; padding: 0;
height: 70px;
align-items: center; align-items: center;
&.line-top {
border-top: 1px solid #cccccc;
}
&.line-bottom {
border-bottom: 1px solid #cccccc;
}
.user-profile-info { .user-profile-info-content {
display: inline-flex; display: inline-flex;
flex-direction: row; flex-direction: row;
flex-grow: 1.07; flex-grow: 1.6;
padding-left: 17px;
.profile-image { .profile-image {
width: var(--ucap-organization-profile-list-item-01-size); width: var(--ucap-organization-profile-list-item-01-size);
@ -36,22 +30,13 @@
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
justify-content: flex-start; justify-content: flex-start;
padding-left: 16px;
.user-n-g { .user-n-g {
display: flex; display: flex;
flex-flow: row-reverse nowrap; flex-flow: row-reverse nowrap;
align-items: flex-end; align-items: flex-end;
height: 22px;
.user-name { .user-name {
// @include ellipsis-column(1); // @include ellipsis-column(1);
height: 22px;
font: {
size: 14px;
weight: 600;
}
color: #212121;
order: 1; order: 1;
-ms-flex-order: 1; -ms-flex-order: 1;
} }
@ -59,11 +44,6 @@
.user-grade { .user-grade {
// @include ellipsis(1); // @include ellipsis(1);
align-self: stretch; align-self: stretch;
font: {
size: 13px;
}
color: #707070;
margin-left: 4px;
order: 0; order: 0;
-ms-flex-order: 0; -ms-flex-order: 0;
} }
@ -71,42 +51,19 @@
.dept-name { .dept-name {
// @include ellipsis(1); // @include ellipsis(1);
font: {
size: 12px;
}
color: #666666;
line-height: 16px;
} }
} }
} }
.company-info { .company-info {
flex-grow: 1.4; flex-grow: 1.4;
padding-left: 16px;
position: relative; position: relative;
font: {
size: 14px;
}
color: #333333;
&:before {
content: '';
width: 1px;
height: 36px;
position: absolute;
left: 0;
top: calc(50% - 18px);
border-left: 1px solid #cccccc;
}
} }
.contact { .contact-info {
flex-grow: 1; flex-grow: 1;
font: {
size: 14px;
}
color: #333333;
} }
.chk-box { .checkbox-area {
flex: 0 0 56px; flex: 0 0 20px;
display: flex; display: flex;
justify-content: center; justify-content: center;
} }

View File

@ -44,7 +44,6 @@ export class ProfileSelection01ActionsDirective {}
export class ProfileSelection01Component implements OnInit, OnDestroy { export class ProfileSelection01Component implements OnInit, OnDestroy {
@Input() @Input()
set userInfoList(value: UserInfo[]) { set userInfoList(value: UserInfo[]) {
console.log('userInfoList', value);
this._userInfoList = value; this._userInfoList = value;
} }
// tslint:disable-next-line: variable-name // tslint:disable-next-line: variable-name

View File

@ -46,7 +46,7 @@
<div class="btn-search-container"> <div class="btn-search-container">
<button <button
mat-flat-button mat-flat-button
color="primary" color="accent"
class="btn-search" class="btn-search"
(click)="onClickSearch($event)" (click)="onClickSearch($event)"
> >

View File

@ -24,9 +24,9 @@
.company-container { .company-container {
box-sizing: border-box; box-sizing: border-box;
flex: 1 1 20%; flex: 1 1 24%;
max-width: 20%; max-width: 24%;
min-width: 20%; min-width: 24%;
@media only screen and (min-width: 1025px) { @media only screen and (min-width: 1025px) {
flex: 1 1 260px; flex: 1 1 260px;
@ -42,10 +42,9 @@
.form-field-select-company { .form-field-select-company {
width: 100%; width: 100%;
@include ucapMatSelect( height: 100%;
var(--ucap-organization-search-for-tenant-height, 38px), display: flex;
0 12px align-items: center;
);
} }
} }
@ -54,18 +53,7 @@
box-sizing: border-box; box-sizing: border-box;
.form-field-input-searchword { .form-field-input-searchword {
@include ucapMatFormField( width: 100%;
0px solid #cccccc,
0,
100%,
auto,
auto,
100%,
100%
);
.btn-close {
margin-top: 2px;
}
} }
} }

View File

@ -1,16 +1,16 @@
@import '~@ucap/ng-ui-material/material'; @import '~@ucap/ng-ui-material/material';
.ucap-organization-tree-container { .ucap-organization-tree-container {
padding-left: 17px; padding-left: 16px;
height: 100%; height: 100%;
.mat-tree { .mat-tree {
background-color: transparent; background-color: transparent;
padding-right: 17px; padding-right: 16px;
&:before { &:before {
content: ''; content: '';
width: 21px; width: 20px;
height: 100%; height: 100%;
border-left: 1px solid #ccc; border-left: 1px solid #ccc;
border-right: 1px solid #ccc; border-right: 1px solid #ccc;
@ -22,7 +22,7 @@
&:after { &:after {
content: ''; content: '';
width: 21px; width: 20px;
height: 100%; height: 100%;
border-left: 1px solid #ccc; border-left: 1px solid #ccc;
border-right: 1px solid #ccc; border-right: 1px solid #ccc;

View File

@ -1,4 +1,4 @@
$search-font-size: 14px; /*$search-font-size: 14px;
@mixin list-search { @mixin list-search {
display: flex; display: flex;
@ -150,3 +150,4 @@ $search-font-size: 14px;
} }
} }
} }
*/

View File

@ -1,6 +1,6 @@
{ {
"name": "@ucap/ng-ui", "name": "@ucap/ng-ui",
"version": "0.0.19", "version": "0.0.24",
"publishConfig": { "publishConfig": {
"registry": "https://nexus.loafle.net/repository/npm-ucap/" "registry": "https://nexus.loafle.net/repository/npm-ucap/"
}, },

View File

@ -1,6 +1,8 @@
import { NgModule, ModuleWithProviders } from '@angular/core'; import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { FlexLayoutModule } from '@angular/flex-layout';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatButtonToggleModule } from '@angular/material/button-toggle';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
@ -104,6 +106,8 @@ export class UiRootModule {}
imports: [ imports: [
CommonModule, CommonModule,
FlexLayoutModule,
MatButtonModule, MatButtonModule,
MatButtonToggleModule, MatButtonToggleModule,
MatCardModule, MatCardModule,