0612 sync

This commit is contained in:
Park Byung Eun 2020-06-12 17:50:41 +09:00
parent 0c696c3a03
commit a426642a96
7 changed files with 605 additions and 1 deletions

View File

@ -118,3 +118,16 @@ forwarForFileEvent$ = createEffect(
},
{ dispatch: false }
);
targetGroup.userSeqs.map((v) => console.log('orgSeq: ', v));
targetUserSeqs.map((v) => console.log('trgtSeq: ', v));
const temparr = [];
let userSeqsForDelete: string[] = targetGroup.userSeqs.filter((v) => {
if (!targetUserSeqs.includes(v)) {
return v;
}
});

View File

@ -0,0 +1,520 @@
번역
컴포넌트
데이터
번역 토글
번역 국가
오리지날 메세지
번역 메세지
대화방 번호
번역 프로그레스
로그인 사용자 seq
디바이스 타입
토큰
절차
form 컴포넌트 번역 버튼 클릭
번역 컴포넌트 활성화
번역 메세지 입력 -> 번역 클릭
전송 처리
성공
미리보기 옵션
일반 번역
대용량 번역
소켓 메세지 전송
실패
번역 실패 메세지
번역 프로그레스 초기화
대화방 id 변경 시 번역 데이터 초기화
// const destLocale = this.destLocale;
// const original = message;
// const roomSeq = this.roomInfoSubject.value.roomSeq;
// if (!!this.isTranslationProcess) {
// return;
// }
// this.isTranslationProcess = true;
// this.commonApiService
// .translationSave({
// userSeq: this.loginResSubject.value.userSeq,
// deviceType: this.environmentsInfo.deviceType,
// token: this.loginResSubject.value.tokenString,
// roomSeq,
// original,
// srcLocale: '',
// destLocale
// } as TranslationSaveRequest)
// .pipe(
// take(1),
// map((res) => {
// if (res.statusCode === StatusCode.Success) {
// let sentMessage = '';
// let eventType = EventType.Translation;
// let previewObject: TranslationEventJson | MassTranslationEventJson;
// if (res.translationSeq > 0) {
// // Mass Text Translation
// previewObject = res;
// sentMessage = res.returnJson;
// eventType = EventType.MassTranslation;
// } else {
// // Normal Text Translation
// previewObject = {
// locale: destLocale,
// original,
// translation: res.translation,
// stickername: '',
// stickerfile: !!this.selectedSticker
// ? this.selectedSticker.index
// : ''
// };
// sentMessage = JSON.stringify(previewObject);
// eventType = EventType.Translation;
// }
// if (!!this.translationPreview) {
// // preview
// this.translationPreviewInfo = {
// previewInfo: res,
// translationType: eventType
// };
// this.changeDetectorRef.detectChanges();
// } else {
// // direct send
// this.store.dispatch(
// EventStore.send({
// senderSeq: this.loginResSubject.value.userSeq,
// req: {
// roomSeq,
// eventType,
// sentMessage
// }
// })
// );
// if (!!this.translationPreviewInfo) {
// this.translationPreviewInfo = null;
// }
// }
// if (!!this.selectedSticker) {
// this.isShowStickerSelector = false;
// this.setStickerHistory(this.selectedSticker);
// this.selectedSticker = null;
// }
// } else {
// this.isTranslationProcess = false;
// this.dialogService.open<
// AlertDialogComponent,
// AlertDialogData,
// AlertDialogResult
// >(AlertDialogComponent, {
// panelClass: 'miniSize-dialog',
// data: {
// title: '',
// message: this.translateService.instant(
// 'chat.error.translateServerError'
// )
// }
// });
// this.logger.error('res', res);
// }
// }),
// catchError((error) => {
// this.isTranslationProcess = false;
// this.dialogService.open<
// AlertDialogComponent,
// AlertDialogData,
// AlertDialogResult
// >(AlertDialogComponent, {
// panelClass: 'miniSize-dialog',
// data: {
// title: '',
// message: this.translateService.instant(
// 'chat.error.translateServerError'
// )
// }
// });
// return of(this.logger.error('error', error));
// })
// )
// .subscribe(() => {
// this.isTranslationProcess = false;
// });
http://13.124.88.127:8011/Common/TranslationSave.aspx
destLocale: "en"
original: "안녕"
registrationDate: ""
returnJson: "
{"StatusCode":"200","ErrorMessage":"","EventTransSeq":"0","RoomID":"5109369","RegDate":"",
"Locale":"en","SrcLocale":"ko","DestLocale":"en","Original":"안녕","Translation":"Hi"}"
roomId: "5109369"
srcLocale: "ko"
statusCode: "200"
translation: "Hi"
translationSeq: 0
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import {
Component,
OnInit,
ChangeDetectorRef,
Input,
OnDestroy,
ChangeDetectionStrategy,
ViewChild
} from '@angular/core';
import { MediaObserver } from '@angular/flex-layout';
import { MatCheckboxChange, MatCheckbox } from '@angular/material/checkbox';
import { select, Store } from '@ngrx/store';
import { SortOrder } from '@ucap/core';
import { Company } from '@ucap/api-external';
import { LoginResponse } from '@ucap/protocol-authentication';
import { DeptInfo, UserInfoSS } from '@ucap/protocol-query';
import { UserInfo } from '@ucap/protocol-sync';
import { LoginSelector } from '@ucap/ng-store-authentication';
import {
DepartmentSelector,
CompanySelector
} from '@ucap/ng-store-organization';
import { SearchData } from '@app/ucap/organization/models/search-data';
import { ProfileListComponent as AppProfileListComponent } from '@app/ucap/organization/components/profile-list.component';
@Component({
selector: 'app-sections-organization-member-list',
templateUrl: './member-list.component.html',
styleUrls: ['./member-list.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class MemberListComponent implements OnInit, OnDestroy {
@Input()
set searchData(searchData: SearchData) {
this._searchData = searchData;
this.selectedDeptInfo = undefined;
this.selectedCompanyInfo = undefined;
if (!!searchData && !searchData.bySearch && !!searchData.deptSeq) {
this.setDeptInfo(searchData.deptSeq);
} else {
this.setCompanyInfo(searchData.companyCode);
}
}
@ViewChild('profileList', { static: false })
profileList: AppProfileListComponent;
@ViewChild('checkboxAll', { static: false })
checkboxAll: MatCheckbox;
// tslint:disable-next-line: variable-name
_searchData: SearchData;
loginRes: LoginResponse;
selectedDeptInfo: DeptInfo;
selectedCompanyInfo: Company;
searchedProfileLength: number;
selectedUserInfos: UserInfoSS[] = [];
isExpanded = false;
sortOrderForProfileList: SortOrder = {
property: 'name',
ascending: undefined
};
layoutMode: 'min' | 'mid' | 'max';
private ngOnDestroySubject: Subject<void> = new Subject();
constructor(
private store: Store<any>,
public mediaObserver: MediaObserver,
private changeDetectorRef: ChangeDetectorRef
) {}
ngOnInit() {
this.store
.pipe(takeUntil(this.ngOnDestroySubject), select(LoginSelector.loginRes))
.subscribe((loginRes) => {
this.loginRes = loginRes;
});
this.mediaObserver
.asObservable()
.pipe(takeUntil(this.ngOnDestroySubject))
.subscribe((changes) => {
if (!changes || 0 === changes.length) {
return;
}
for (const change of changes) {
switch (change.mqAlias) {
case 'lt-sm':
this.layoutMode = 'min';
return;
case 'sm':
case 'md':
this.layoutMode = 'mid';
return;
case 'gt-md':
this.layoutMode = 'max';
return;
default:
break;
}
}
});
}
ngOnDestroy(): void {
if (!!this.ngOnDestroySubject) {
this.ngOnDestroySubject.next();
this.ngOnDestroySubject.complete();
}
}
onChangedSearch(data: { deptSeq: string; searchWord: string }) {
this._searchData = {
bySearch: true,
...data
};
this.setDeptInfo(data.deptSeq);
}
onSearchedProfileList(userInfos: UserInfoSS[]) {
if (!!this.checkboxAll) {
this.checkboxAll.checked = false;
}
this.searchedProfileLength = !!userInfos ? userInfos.length : 0;
}
onChangedCheckProfileList(
datas: { checked: boolean; userInfo: UserInfoSS }[]
) {
if (!datas || 0 === datas.length) {
return;
}
const pushs: UserInfoSS[] = [];
const pops: UserInfoSS[] = [];
datas.forEach((d) => {
const i = this.selectedUserInfos.findIndex(
(u) => u.seq === d.userInfo.seq
);
if (d.checked) {
if (-1 === i) {
pushs.push(d.userInfo);
}
} else {
if (-1 < i) {
pops.push(d.userInfo);
}
}
});
if (0 < pushs.length) {
this.selectedUserInfos = [...this.selectedUserInfos, ...pushs];
}
if (0 < pops.length) {
this.selectedUserInfos = this.selectedUserInfos.filter(
(u) => -1 === pops.findIndex((p) => p.seq === u.seq)
);
}
}
onRemovedProfileSelection(userInfo: UserInfo) {
const i = this.selectedUserInfos.findIndex(
(u) => u.seq === String(userInfo.seq)
);
if (-1 < i) {
this.selectedUserInfos = this.selectedUserInfos.filter(
(u) => u.seq !== String(userInfo.seq)
);
}
}
removableForSelection = (userInfo: UserInfo) => {
return true;
};
colorForSelection = (userInfo: UserInfo) => {
return 'accent';
};
onClickToggleSort() {
this.sortOrderForProfileList = {
...this.sortOrderForProfileList,
ascending:
undefined === this.sortOrderForProfileList.ascending
? true
: true === this.sortOrderForProfileList.ascending
? false
: undefined
};
}
onChangeSelectAll(event: MatCheckboxChange) {
if (event.checked) {
this.profileList.checkAll();
} else {
this.profileList.uncheckAll();
}
}
getContainerLayout(type: 'max' | 'mid'): string {
switch (type) {
case 'max':
return 'row';
case 'mid':
return 'column';
default:
break;
}
}
onAfterExpandForSelection() {
this.isExpanded = true;
}
onAfterCollapseForSelection() {
this.isExpanded = false;
}
private setCompanyInfo(companyCode: string) {
const destroySubject: Subject<void> = new Subject();
this.store
.pipe(takeUntil(destroySubject), select(CompanySelector.companyList))
.subscribe((companyList) => {
if (!companyList) {
return;
}
this.selectedCompanyInfo = companyList.find(
(c) => c.companyCode === companyCode
);
this.changeDetectorRef.markForCheck();
destroySubject.next();
destroySubject.complete();
});
}
private setDeptInfo(seq: string) {
const destroySubject: Subject<void> = new Subject();
this.store
.pipe(
takeUntil(destroySubject),
select(DepartmentSelector.departmentInfoList)
)
.subscribe((departmentInfoList) => {
if (!departmentInfoList) {
return;
}
this.selectedDeptInfo = departmentInfoList.find(
(d) => String(d.seq) === seq
);
this.changeDetectorRef.markForCheck();
destroySubject.next();
destroySubject.complete();
});
}
}
/** 전체 체크여부 */
allCheckUser() {
if (this.allChecked) {
this.userInfos.forEach((userInfo) =>
this.onChangeCheckUser({ checked: true, userInfo })
);
} else {
this.userInfos.forEach((userInfo) =>
this.onChangeCheckUser({ checked: false, userInfo })
);
}
}
checkAll() {
if (!this.userInfos || 0 === this.userInfos.length) {
return;
}
const checked: CheckedInfo[] = [];
this.userInfos.forEach((u) => {
checked.push({
checked: true,
userInfo: u
});
});
this.changedCheck.emit(checked);
}
uncheckAll() {
if (!this.userInfos || 0 === this.userInfos.length) {
return;
}
const unchecked: CheckedInfo[] = [];
this.userInfos.forEach((u) => {
unchecked.push({
checked: false,
userInfo: u
});
});
this.changedCheck.emit(unchecked);
}
onChangedCheckProfileList(
datas: { checked: boolean; userInfo: UserInfoSS }[]
) {
if (!datas || 0 === datas.length) {
return;
}
const pushs: UserInfoSS[] = [];
const pops: UserInfoSS[] = [];
datas.forEach((d) => {
const i = this.selectedUserInfos.findIndex(
(u) => u.seq === d.userInfo.seq
);
if (d.checked) {
if (-1 === i) {
pushs.push(d.userInfo);
}
} else {
if (-1 < i) {
pops.push(d.userInfo);
}
}
});
if (0 < pushs.length) {
this.selectedUserInfos = [...this.selectedUserInfos, ...pushs];
}
if (0 < pops.length) {
this.selectedUserInfos = this.selectedUserInfos.filter(
(u) => -1 === pops.findIndex((p) => p.seq === u.seq)
);
}
}
<ucap-organization-profile-selection-01
[userInfoList]="selectedUserInfos"
[removableFor]="removableForSelection"
[colorFor]="colorForSelection"
(removed)="onRemovedProfileSelection($event)"
>
</ucap-organization-profile-selection-01>

View File

@ -0,0 +1,71 @@
선택 유저 컴포넌트
조직도
기본 조직 선택
부서 올체크
부서원 체크
보류
Todo
그룹 디버그
그룹 기본 화면
검색
사용자 더보기 컨텍스트 클릭 시 오픈 X
온라인/오프라인 보기 시 더보기 메뉴 출력 X
마우스 오버 시 컨텍스트 메뉴 유지
클릭 이벤트에 대한 유지 필요 및 컨텍스트 메뉴 닫힐 때 없어져야 함
그룹명 변경
에러 처리
같은 그룹명, 특수문자, 빈문자열,
편집창 출력 위치가 일정하지 않음
그룹명 변경 후 그룹 오픈 유지되지 않음
현재 열린 그룹에 대한 참조 필요
프로필에서 즐겨찾기 클릭 후 다른 유저 클릭 시 즐겨찾기 아이콘이 리셋되지 않음
프로필 컨텍스트 메뉴에서 즐겨찾기 설정 클릭, 자신의 프로필을 보고 있는 상태에서 즐겨찾기 아이콘이 변경되지 않음
프로필에서 동료삭제 클릭 후 동료추가 아이콘으로 변경 되지 않음
그룹 생성
selectUserList 유저 seq 와 테넌트 검색 유저 seq 데이터형이 일치 하지 않아 체크가 유지 되지 않는 문제
다음 스텝으로 이동 시 기존 화면 잔상
그룹명에 대한 에러 처리
한글명
0명 추가
10명 추가
50명 추가
영문명
0명 추가
10명 추가
50명 추가
숫자명
0명 추가
10명 추가
50명 추가
그룹원복사&이동
그룹 전체 선택
manage.dialog
select-user-section
expanssion-group
그룹원 체크 시 전달하는 파라미터 데이터 일치
select-group-section
그룹 리스트 마우스 오버 시 나오는 컨텍스트 메뉴 개선
seq 데이터 타입 불일치에서 오는 버그 리스트업
그룹 float 버튼 이벤트
그룹멤버관리 기능 수정 일정
월요일 까지 수정본
화면 재구성 -> 컴포ㅓ넌트 재작업-> 기능 -> 테스트 과정을 다시 거쳐야함
복잡한 화면
월요일 이후 작업
이번주 회의에서 정한대로 진행

Binary file not shown.