diff --git a/documents/업무/6월/2째주/0608.txt b/documents/업무/6월/2째주/0608.txt index a7bec9d..8117eea 100644 --- a/documents/업무/6월/2째주/0608.txt +++ b/documents/업무/6월/2째주/0608.txt @@ -117,4 +117,17 @@ forwarForFileEvent$ = createEffect( ); }, { dispatch: false } - ); \ No newline at end of file + ); + + + + 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; + } + }); diff --git a/documents/업무/6월/2째주/0611.txt b/documents/업무/6월/2째주/0611.txt new file mode 100644 index 0000000..8b532e2 --- /dev/null +++ b/documents/업무/6월/2째주/0611.txt @@ -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 = new Subject(); + + constructor( + private store: Store, + 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 = 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 = 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) + ); + } + } + + + + \ No newline at end of file diff --git a/documents/업무/6월/2째주/0612.txt b/documents/업무/6월/2째주/0612.txt new file mode 100644 index 0000000..79db695 --- /dev/null +++ b/documents/업무/6월/2째주/0612.txt @@ -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 버튼 이벤트 + + +그룹멤버관리 기능 수정 일정 + 월요일 까지 수정본 + 화면 재구성 -> 컴포ㅓ넌트 재작업-> 기능 -> 테스트 과정을 다시 거쳐야함 + 복잡한 화면 + 월요일 이후 작업 + 이번주 회의에서 정한대로 진행 + + diff --git a/documents/업무/6월/2째주/backup/ucap-0612.zip b/documents/업무/6월/2째주/backup/ucap-0612.zip new file mode 100644 index 0000000..3f93c82 Binary files /dev/null and b/documents/업무/6월/2째주/backup/ucap-0612.zip differ diff --git a/documents/업무/6월/2째주/backup/ucap-angular-0612.zip b/documents/업무/6월/2째주/backup/ucap-angular-0612.zip new file mode 100644 index 0000000..9ae56df Binary files /dev/null and b/documents/업무/6월/2째주/backup/ucap-angular-0612.zip differ diff --git a/documents/업무/6월/2째주/backup/ucap-lg-web-0612.zip b/documents/업무/6월/2째주/backup/ucap-lg-web-0612.zip new file mode 100644 index 0000000..0921386 Binary files /dev/null and b/documents/업무/6월/2째주/backup/ucap-lg-web-0612.zip differ diff --git a/weekly-report/6월/주간보고_박병은_2020.0612.pptx b/weekly-report/6월/주간보고_박병은_2020.0612.pptx new file mode 100644 index 0000000..b18ca2f Binary files /dev/null and b/weekly-report/6월/주간보고_박병은_2020.0612.pptx differ