0710 sync

This commit is contained in:
Park Byung Eun 2020-07-10 17:54:22 +09:00
parent 3271e678e2
commit 490553c411
14 changed files with 1242 additions and 31 deletions

View File

@ -1,8 +1,8 @@
47 53
처리완료 24 처리완료 29
UI 3 UI 5
진행중 16 진행중 11
논의 필요 6 논의 필요 7
35번 35번
사용자 새 그룹에 대화 상대 이동시 이동되지 않고 복사됨 -> 논의 필요 사용자 새 그룹에 대화 상대 이동시 이동되지 않고 복사됨 -> 논의 필요
@ -18,30 +18,73 @@
-> 그룹/조직도 검색어 지울 시 목록 화면으로 진입 불가능 (백스페이스로 지우기) - 이동수단 필요 -> 그룹/조직도 검색어 지울 시 목록 화면으로 진입 불가능 (백스페이스로 지우기) - 이동수단 필요
오늘 오늘
131번, 134번 개선사항
-> 그룹 오픈 유지 및 정렬 유지
이슈
165번
체크/체크해제 동작 느림
167번
새로고침 시 프레즌스 기능 사라짐
작업 목록 작업 목록
39번 이슈
화면 이동될 때 이전 화면 이미지 보임 131번, 134번 개선사항 1번 중복
6번 -> 그룹 오픈 유지 및 정렬 유지
검색기록, 자동완성 기능 문의건 39번
136번 화면 이동될 때 이전 화면 이미지 보임
-> 조직도 프레즌스 오류 6번
119번 검색기록, 자동완성 기능 문의건
멤버 추가화면에서 특수문자 입력 후 완료 선택시 버튼 오류 및 팝업 미발생 103번
137번 검색목록 200개까지만 노출됨
-> 조직도에서 그룹 추가 시 특수문자 입력가능함 136번
138번 -> 조직도 프레즌스 오류
조직도 회사 변경 후 검색어 지울 시 회사 유지되지 않음 119번
148번 멤버 추가화면에서 특수문자 입력 후 완료 선택시 버튼 오류 및 팝업 미발생
프로필 사진 영역 선택 시 프로필 화면 진입되지 않음 137번
164번 -> 조직도에서 그룹 추가 시 특수문자 입력가능함
그룹 목록에서 체크 시 조직도 목록에서 체크되지 않음 166번
165번 사용자 검색 목록 색상 오류 (UI)
체크/체크해제 동작 느림 174번
166번 간헐적으로 빈 말풍선 노출됨
사용자 검색 목록 색상 오류 (UI)
167번 개선사항
새로고침 시 프레즌스 기능 사라짐 3번 프레즌스 아이콘을 현재보다 크게 변경(UI)
174번 4번 그룹이름바꾸기 팝업창(UI)
간헐적으로 빈 말풍선 노출됨 11번 조직 인원 리스트에서 조직 인원 위에 마우스 오버시 연계 기능 아이콘 보이도록 변경
12번 조직 인원 선택한 창에서 선택 취소를 할 수 있는 X버튼 추가
완료
개선사항
2번 그룹 멤버관리 메뉴 화면 및 기능을 새로운 기획에 맞추어서 변경
수정사항ppt 5,6
5번 그룹이름바꾸기 엔터키 누르면 적용되도록 변경
13번 대화방에서 상대방 프로필 사진 클릭 시 상대방 프로필이 팝업되도록 변경
14번 조직도에서 상대방 프로필 사진 클릭 시 상대방 프로필이 팝업되도록 변경
이슈
148번
프로필 사진 영역 선택 시 프로필 화면 진입되지 않음
164번
그룹 목록에서 체크 시 조직도 목록에서 체크되지 않음
138번
조직도 회사 변경 후 검색어 지울 시 회사 유지되지 않음
세션저장
[{인덱스, 그룹 seq, opened}, {}]
그룹 초기화
인덱스 데이터 있는 경우
조회후 expansion component 호출
없는 경우
인덱스 데이터 생성 후 세션에 저장
그룹 추가
인덱스 정보 갱신
그룹 삭제
인덱스 정보 갱신
그룹 수정
인덱스 정보 갱신
expand component
expand(expandInfo[])
refreshNode()
인덱스 정보가 있는 경우
expand()
없는 경우
header click emit

View File

@ -0,0 +1,86 @@
총 52개
처리완료 30개
UI 5개
진행중 11
논의 필요 7
35번
사용자 새 그룹에 대화 상대 이동시 이동되지 않고 복사됨 -> 논의 필요
19번
그룹 선택화면에 검색칸 노출됨
80번
북마크 날짜 미표기 (날짜로 표기 되거나 날짜도 같이 표기되게 수정)(UI)
86번
멤버 추가 팝업크기 다른 팝업에 비해 큼 (UI)
120번
그룹명 입력하지 않고 사용자 체크 후 완료 시 팝업 미발생
135번
-> 그룹/조직도 검색어 지울 시 목록 화면으로 진입 불가능 (백스페이스로 지우기) - 이동수단 필요
오늘
개선사항
이슈
167번
새로고침 시 프레즌스 기능 사라짐
작업 목록
이슈
131번, 134번 개선사항 1번 중복
-> 그룹 오픈 유지 및 정렬 유지
39번
화면 이동될 때 이전 화면 이미지 보임
6번
검색기록, 자동완성 기능 문의건
103번
검색목록 200개까지만 노출됨
136번
-> 조직도 프레즌스 오류
119번
멤버 추가화면에서 특수문자 입력 후 완료 선택시 버튼 오류 및 팝업 미발생
137번
-> 조직도에서 그룹 추가 시 특수문자 입력가능함
166번
사용자 검색 목록 색상 오류 (UI)
174번
간헐적으로 빈 말풍선 노출됨
개선사항
3번 프레즌스 아이콘을 현재보다 크게 변경(UI)
4번 그룹이름바꾸기 팝업창(UI)
11번 조직 인원 리스트에서 조직 인원 위에 마우스 오버시 연계 기능 아이콘 보이도록 변경
완료
개선사항
그룹복사, 그룹이동 그룹 메뉴 수정 및 소스 적용
그룹 멤버 관리 팝업 출력 시 선택한 그룹 헤더
이슈
165번
체크/체크해제 동작 느림
선행작업
다이얼로그 expansion
checkbox
디폴트 expansion
세션저장
[{인덱스, 그룹 seq, opened}, {}]
헤더 클릭
인덱스 정보 갱신
초기화
인덱스 데이터 있는 경우
expansion expand() 호출
없는 경우
인덱스 데이터 생성 후 세션에 저장
그룹 추가
그룹 삭제
그룹 수정
동료 추가
동료 삭제
즐겨찾기 추가
즐겨찾기 삭제
인덱스 정보 갱신
expansion expand() 호출

View File

@ -0,0 +1,135 @@
총 77개
처리완료 37개
UI 7개
진행중 30
논의 필요 6
35번
사용자 새 그룹에 대화 상대 이동시 이동되지 않고 복사됨 -> 논의 필요
19번
그룹 선택화면에 검색칸 노출됨
80번
북마크 날짜 미표기 (날짜로 표기 되거나 날짜도 같이 표기되게 수정)(UI)
86번
멤버 추가 팝업크기 다른 팝업에 비해 큼 (UI)
120번
그룹명 입력하지 않고 사용자 체크 후 완료 시 팝업 미발생
135번
-> 그룹/조직도 검색어 지울 시 목록 화면으로 진입 불가능 (백스페이스로 지우기) - 이동수단 필요
오늘
개선사항
이슈
182번
그룹 정렬 시 즐겨찾기 그룹없음
183번
사용자 삭제 시 화면 유지 되지 않음
187번
조직도에서 즐겨찾기 추가/해제 시 동작되지 않음
188번
조직도 그룹 추가 시 체크 초기화되지 않음
190번
대화 상대 복사/이동 시 금지단어 그룹 추가 가능함
214번
프로필 화면에서 회사 정보 미노출
작업 목록
이슈
39번
화면 이동될 때 이전 화면 이미지 보임
6번
검색기록, 자동완성 기능 문의건
103번
검색목록 200개까지만 노출됨
136번
-> 조직도 프레즌스 오류
119번
멤버 추가화면에서 특수문자 입력 후 완료 선택시 버튼 오류 및 팝업 미발생
137번
-> 조직도에서 그룹 추가 시 특수문자 입력가능함
166번
사용자 검색 목록 색상 오류 (UI)
167번
새로고침 시 프레즌스 기능 사라짐
174번
간헐적으로 빈 말풍선 노출됨
176번
조직도 화면 크기 줄일 시 목록 미노출
178번
내 프레즌스 오프라인으로 보여짐
179번
간헐적으로 프로필 버튼 선택 시 선택되지 않음
180번
조직도 첫 진입시 프레즌스 표시 미노출
181번
프로필 사진 변경 시 목록 사진은 변경되지 않음 (테스트 케이스 문의)
186번
조직도에서 대화 선택 시 프로필 팝업 닫혀지지 않음
189번
그룹명 금지단어 안내 문구 표기 오류 및 소속부서 생성 불가능
191번
화면크기 중간 사이즈 일 경우 조직도 체크박스 잘림 (UI)
194번
상태메시지/회의중 내용 변경 시 변경되지 않음
195번
상태메시지/회의중 내용 취소시 변경 전 내용으로 입력되어 있음 (취소 버튼 클릭 시 어떤 액션을 취해야 하는지 정해야함)
196번
상태 메시지/회의중 입력 제한 수 오류
197번
프로필 메뉴 동작안함
202번
모바일에서 그룹추가/삭제/변경 시 PC실시간 방영되지 않음
203번
조직도 추가화면에서 불필요한 스크롤 노출됨 (UI)
206번
자동 로그인 동작되지 않음
209번
아이디 저장 해제 되지 않음
개선사항
3번 프레즌스 아이콘을 현재보다 크게 변경(UI)
4번 그룹이름바꾸기 팝업창(UI)
11번 조직 인원 리스트에서 조직 인원 위에 마우스 오버시 연계 기능 아이콘 보이도록 변경
완료
개선사항
131번, 134번 개선사항 1번 중복
-> 그룹 오픈 유지 및 정렬 유지
이슈
conferenceStatus: "X"
imessengerStatus: "X"
mobileConferenceStatus: "X"
mobileStatus: "X"
pcStatus: "X"
phoneStatus: "X"
statusMessage: "."
terminalStatus: "TERMINAL_STATE_UNKNOWN"
terminalStatusNumber: 0
userSeq: "338127"
workstatus: undefined
this.onlineBuddies.push({
group,
buddyList: buddies.filter((buddy) => {
if (-1 < group.userSeqs.indexOf(String(buddy.seq))) {
const tempBulkinfos = bulkInfos.filter(
(bulk) => bulk.userSeq === buddy.seq + ''
);
if (!!tempBulkinfos && tempBulkinfos.length > 0) {
const pcStatus = tempBulkinfos[0].pcStatus;
const mStatus = tempBulkinfos[0].mobileStatus;
if (pcStatus === StatusCode.OnLine) {
return tempBuddyList.push(buddy);
}
}
}
})
});

View File

@ -0,0 +1,130 @@
총 77개
처리완료 39개
UI 7개
진행중 28
논의 필요 6
35번
사용자 새 그룹에 대화 상대 이동시 이동되지 않고 복사됨 -> 논의 필요
19번
그룹 선택화면에 검색칸 노출됨
80번
북마크 날짜 미표기 (날짜로 표기 되거나 날짜도 같이 표기되게 수정)(UI)
86번
멤버 추가 팝업크기 다른 팝업에 비해 큼 (UI)
120번
그룹명 입력하지 않고 사용자 체크 후 완료 시 팝업 미발생
135번
-> 그룹/조직도 검색어 지울 시 목록 화면으로 진입 불가능 (백스페이스로 지우기) - 이동수단 필요
오늘
개선사항
이슈
183번
사용자 삭제 시 화면 유지 되지 않음
187번
조직도에서 즐겨찾기 추가/해제 시 동작되지 않음
188번
조직도 그룹 추가 시 체크 초기화되지 않음
작업 목록
이슈
6번
검색기록, 자동완성 기능 문의건
103번
검색목록 200개까지만 노출됨
136번
-> 조직도 프레즌스 오류
150번
-> 스크롤 오류
119번
멤버 추가화면에서 특수문자 입력 후 완료 선택시 버튼 오류 및 팝업 미발생
137번
-> 조직도에서 그룹 추가 시 특수문자 입력가능함
174번
간헐적으로 빈 말풍선 노출됨
176번
조직도 화면 크기 줄일 시 목록 미노출
178번
내 프레즌스 오프라인으로 보여짐
179번
간헐적으로 프로필 버튼 선택 시 선택되지 않음
180번
조직도 첫 진입시 프레즌스 표시 미노출
181번
프로필 사진 변경 시 목록 사진은 변경되지 않음 (테스트 케이스 문의)
186번
조직도에서 대화 선택 시 프로필 팝업 닫혀지지 않음
189번
그룹명 금지단어 안내 문구 표기 오류 및 소속부서 생성 불가능
191번
화면크기 중간 사이즈 일 경우 조직도 체크박스 잘림 (UI)
194번
상태메시지/회의중 내용 변경 시 변경되지 않음
195번
상태메시지/회의중 내용 취소시 변경 전 내용으로 입력되어 있음 (취소 버튼 클릭 시 어떤 액션을 취해야 하는지 정해야함)
196번
상태 메시지/회의중 입력 제한 수 오류
197번
프로필 메뉴 동작안함
202번
모바일에서 그룹추가/삭제/변경 시 PC실시간 방영되지 않음
203번
조직도 추가화면에서 불필요한 스크롤 노출됨 (UI)
206번
자동 로그인 동작되지 않음
209번
아이디 저장 해제 되지 않음
개선사항
3번 프레즌스 아이콘을 현재보다 크게 변경(UI)
4번 그룹이름바꾸기 팝업창(UI)
11번 조직 인원 리스트에서 조직 인원 위에 마우스 오버시 연계 기능 아이콘 보이도록 변경
완료
개선사항
이슈
39번
화면 이동될 때 이전 화면 이미지 보임 (오차장님)
182번
그룹 정렬 시 즐겨찾기 그룹없음
190번
대화 상대 복사/이동 시 금지단어 그룹 추가 가능함
166번
사용자 검색 목록 색상 오류 (UI)(오차장님)
214번
프로필 화면에서 회사 정보 미노출
if (forbidden) {
errMsg = this.i18nService.t('group:error.useOnlyForSpecialCharacter', {
specialCharacter: '-,'
});
} else if (inputValue.trim().localeCompare('') === 0) {
errMsg = this.i18nService.t('group:error.requireInput');
} else if (!!ban && ban !== '') {
errMsg = this.i18nService.t('group:error.bannedWords', {
bannedWords: this.appService.bannedGroupNames.join(',')
});
} else if (
-1 <
this.groupList.findIndex((g) => g.name.trim() === inputValue.trim())
) {
errMsg = this.i18nService.t('group:error.sameNameExist');
}
if (!!errMsg) {
return this._alertErr(errMsg);
}
height: 100%; min-height: 100%; min-width: 100%; width: 100%;

View File

@ -0,0 +1,181 @@
총 77개
처리완료 49개
UI 5개
진행중 19
논의 필요 6
35번
사용자 새 그룹에 대화 상대 이동시 이동되지 않고 복사됨 -> 논의 필요
19번
그룹 선택화면에 검색칸 노출됨
80번
북마크 날짜 미표기 (날짜로 표기 되거나 날짜도 같이 표기되게 수정)(UI)
86번
멤버 추가 팝업크기 다른 팝업에 비해 큼 (UI)
120번
그룹명 입력하지 않고 사용자 체크 후 완료 시 팝업 미발생
135번
그룹/조직도 검색어 지울 시 목록 화면으로 진입 불가능 (백스페이스로 지우기) - 이동수단 필요
오늘
개선사항
이슈
137번
-> 조직도에서 그룹 추가 시 특수문자 입력가능함
119번
멤버 추가화면에서 특수문자 입력 후 완료 선택시 버튼 오류 및 팝업 미발생
189번
그룹명 금지단어 안내 문구 표기 오류 및 소속부서 생성 불가능
178번
내 프레즌스 오프라인으로 보여짐
180번
조직도 첫 진입시 프레즌스 표시 미노출
작업 목록
이슈
6번
검색기록, 자동완성 기능 문의건
103번
검색목록 200개까지만 노출됨
136번
-> 조직도 프레즌스 오류
176번
조직도 화면 크기 줄일 시 목록 미노출
179번
간헐적으로 프로필 버튼 선택 시 선택되지 않음
194번
상태메시지/회의중 내용 변경 시 변경되지 않음
195번
상태메시지/회의중 내용 취소시 변경 전 내용으로 입력되어 있음 (취소 버튼 클릭 시 어떤 액션을 취해야 하는지 정해야함)
196번
상태 메시지/회의중 입력 제한 수 오류
197번
프로필 메뉴 동작안함
202번
모바일에서 그룹추가/삭제/변경 시 PC실시간 방영되지 않음
206번
자동 로그인 동작되지 않음
209번
아이디 저장 해제 되지 않음
개선사항
3번 프레즌스 아이콘을 현재보다 크게 변경(UI)
4번 그룹이름바꾸기 팝업창(UI)
11번 조직 인원 리스트에서 조직 인원 위에 마우스 오버시 연계 기능 아이콘 보이도록 변경
완료
개선사항
이슈
174번
간헐적으로 빈 말풍선 노출됨
203번
조직도 추가화면에서 불필요한 스크롤 노출됨 (UI)
204번
조직도 추가화면에서 불필요한 스크롤 노출됨 (UI)
211번 (재현불가)
150번 (재현불가)
181번
프로필 사진 변경 시 목록 사진은 변경되지 않음 (테스트 케이스 문의)
183번
사용자 삭제 시 화면 유지 되지 않음
187번
조직도에서 즐겨찾기 추가/해제 시 동작되지 않음
188번
조직도 그룹 추가 시 체크 초기화되지 않음
191번(오차장님)
화면크기 중간 사이즈 일 경우 조직도 체크박스 잘림 (UI)
186번
조직도에서 대화 선택 시 프로필 팝업 닫혀지지 않음
⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽
122 멤버 추가화면에서 사용자 검색 시 상태메시지 오류 P2 OPEN 기능 수정필요 (하) "[검증절차]
1. 그룹 탭
2. 멤버 추가 버튼 선택
3. 그룹명 입력 후 그룹지정후 완료 버튼 선택
4. '이상윤' 검색
5. 재검색
[검증결과]
1. 상태메시지 노출되었다가 재검색 시 노출되지 않음
[정상동작]
1. 노출되는게 정상동작이라면 노출 유지되어야 하고 노출되지 않는게 정상동작이라면 노출되면 안됨
(기존 엠메신저는 노출되지 않음)
[검증환경]
PC_0.0.11
" - PC 이유진 06월 23일 박병은 07월 03일 -> 07/06 확인 시 해당 현상은 수정되었지만 간헐적으로 상태메시지 텍스트가 일반 텍스트처럼 보여지고 있습니다. 재확인 부탁드립니다.
123 그룹 검색화면에서 상태메시지 노출되지 않음 P2 OPEN 기능 수정필요 (중) "[검증절차]
1. 그룹 탭
2. 상태메시지 있는 사용자명 입력 후 검색
3. 검색결과 확인 >> 1번 이슈
4. 상태메시지 없는 사용자명 입력 후 검색
5. 검색결과 확인 >> 2번 이슈
[검증결과]
1. 간헐적으로 상태메시지 노출되지 않음
2. 간헐적으로 말풍선 아이콘 보여짐(마우스 오버 시 아이콘 사라짐)
[정상동작]
1. 상태메시지 노출되어야 함
2. 말풍선 아이콘 노출되면 안됨
[검증환경]
PC_0.0.11
" - PC 이유진 06월 23일 박병은 07월 03일 -> 07/06 확인 시 해당 현상은 수정되었지만 간헐적으로 상태메시지 텍스트가 일반 텍스트처럼 보여지고 있습니다. 재확인 부탁드립니다.
131 그룹 정렬 후 탭 재진입 시 유지되지 않음 P3 OPEN 기능 수정필요 (중) "[검증절차]
1. 그룹 탭
2. 정렬 : 접속한 동료만보기, 온/오프라인 보기 선택
3. 그룹 제외한 다른 탭(대화, 조직도 등) 선택
4. 그룹 탭 > 목록 확인
[검증결과]
1. 정렬 유지되지 않음
[정상동작]
1. 정렬 유지되지 않는게 정상동작인지 문의드립니다.
(기존 엠메신저 유지됨)
[검증환경]
PC_0.0.11
" - PC 이유진 06월 24일 박병은 07월 08일 -> 07/09 확인 시 재현되고 있습니다. 재확인 부탁드립니다.
138 회사변경 후 검색어 지울 시 회사 유지되지 않음 P2 OPEN 기능 검토 필요 "[검증절차]
1. 조직도 탭
2. 검색칸 > 타 회사로 변경
3. 검색어 입력 후 검색
4. 검색칸에서 X버튼 선택
[검증결과]
1. 회사 유지되지 않고 내 회사로 변경됨
[정상동작]
1. 선택한 회사 유지되어야 함
[검증환경]
PC_0.0.11
" - PC 이유진 06월 24일 박병은 07월 06일 -> 07/09 확인 시 재현되고 있습니다. 재확인 부탁드립니다.
140 상태메시지 편집모드 해제 불가능 및 설정 속도 느림 P2 OPEN 기능 수정필요 (상) "[검증절차]
1. 그룹 탭
2. 내 프로필 선택
3. 프로필 화면에서 상태메시지 입력 후 확인 선택
[검증결과]
1. 상태메시지 편집모드 해제되지 않음
2. 상태메시지 변경되는 속도 매우 느림
[정상동작]
1. 편집모드 해제되어야 함
2. 상태메시지 바로 변경되어야 함
[검증환경]
PC_0.0.11
" - PC 이유진 06월 24일 박병은 07월 02일 -> 7/10 화면정의서 26p처럼 연필 아이콘 선택 시 편집모드 진입되고 체크 아이콘 선택 시 편집모드 해제되는 것처럼 수정 부탁드립니다.

View File

@ -0,0 +1,133 @@
<div class="dialog-container">
<app-layouts-default-dialog
[disableClose]="false"
(closed)="onClosed($event)"
>
<div appLayoutsDefaultDialog="header">{{ title }}</div>
<div class="dialog-body" appLayoutsDefaultDialog="body">
<mat-horizontal-stepper
fxFlexFill
[linear]="true"
#stepper
[selectedIndex]="currentStep"
(animationDone)="doneAnimation()"
>
<mat-step label="Step 1">
<div class="ucap-dialog-group-manage-container">
<div class="group-name">
<span class="sub-title">{{
data.groupBuddyList.group.name
}}</span>
<button
mat-button
(click)="onAdd(stepper)"
aria-label="대화상대 추가"
>
<mat-icon class="material-icons-outlined">person_add</mat-icon>
</button>
</div>
<div class="ucap-dialog-app-group-profile-list">
<app-group-profile-list-01
[userInfos]="data.groupBuddyList.buddyList"
[selectedUser]="selectedUserList"
[checkable]="true"
[isDialog]="true"
(toggleCheck)="onChangeSelectedUserList($event)"
>
</app-group-profile-list-01>
</div>
</div>
</mat-step>
<mat-step label="Step 2">
<div class="ucap-dialog-app-group-select-user">
<app-group-select-user
*ngIf="
currentStep > 0 && currentManageType === GroupManageType.Add
"
[isDialog]="true"
[checkable]="true"
[selectedUserList]="selectedUserList"
(toggleCheckUser)="onChangeSelectedUserList($event)"
(toggleCheckGroup)="onSelectBySectionUserGroup($event)"
></app-group-select-user>
<app-sections-select-group
*ngIf="
currentStep > 0 &&
(currentManageType === GroupManageType.Copy ||
GroupManageType.Move)
"
[isDialog]="true"
[checkable]="true"
[curGroup]="data.groupBuddyList.group"
[selectedGroupList]="selectedGroupList"
[selectedUserList]="selectedUserList"
(changeUserList)="onChangeSelectedUserList($event)"
(changeGroupList)="onSelectBySectionGroup($event)"
(changeGroupName)="onChangeGroupName($event)"
></app-sections-select-group>
<!-- </ng-container> -->
</div>
<div class="ucap-dialog-organization-profile-selection">
<ucap-organization-profile-selection-01
[userInfoList]="selectedUserList"
[removableFor]="removableForSelection"
[colorFor]="colorForSelection"
(removed)="onRemovedProfileSelection($event)"
class="ucap-organization-selected-list"
>
<ng-template ucapOrganizationProfileSelection01Header>
{{ 'group:dialog.selectedMember' | ucapI18n }} (<span
class="number"
>{{ selectedUserList.length }}</span
>)
</ng-template>
</ucap-organization-profile-selection-01>
</div>
</mat-step>
</mat-horizontal-stepper>
</div>
<div appLayoutsDefaultDialog="action" class="btn-box">
<div *ngIf="currentStep === 0">
<button
mat-stroked-button
(click)="onDelete(stepper)"
[disabled]="checkDisableBtn()"
>
{{ 'group:dialog.btn.remove' | ucapI18n }}
</button>
<button
mat-button
class="bg-primary-darkest"
[disabled]="checkDisableBtn()"
(click)="onUpdateMember(stepper, GroupManageType.Copy)"
>
{{ 'group:dialog.title.copyGroup' | ucapI18n }}
</button>
<button
mat-button
class="bg-primary-darkest"
[disabled]="checkDisableBtn()"
(click)="onUpdateMember(stepper, GroupManageType.Move)"
>
{{ 'group:dialog.title.moveGroup' | ucapI18n }}
</button>
</div>
<div *ngIf="currentStep > 0">
<button mat-button mat-stroked-button (click)="onCancel(stepper)">
{{ 'group:dialog.btn.cancel' | ucapI18n }}
</button>
<button
mat-button
class="bg-primary-darkest"
(click)="onConfirm(stepper)"
[disabled]="checkDisableBtnConfirm()"
>
{{ 'group:dialog.btn.compleate' | ucapI18n }}
</button>
</div>
</div>
</app-layouts-default-dialog>
</div>

View File

@ -0,0 +1,81 @@
@import '~@ucap/lg-scss/mixins';
.dialog-container {
width: 100%;
height: 100%;
.dialog-body {
width: 100%;
height: 100%;
.ucap-dialog-group-manage-container {
display: flex;
flex-flow: column;
width: 100%;
height: 100%;
.group-name {
display: flex;
flex-flow: row;
height: 40px;
border-bottom: 1px solid #999999;
.sub-title {
display: inline-flex;
height: 100%;
align-items: center;
}
button {
display: flex;
margin-left: auto;
padding: 0 10px;
}
}
.ucap-dialog-app-group-profile-list {
height: calc(100% - 40px);
// overflow-y: hidden;
overflow: hidden;
.profile-list-01-item-container {
.ucap-virtual-scroll-viewport {
.ps__rail-x {
display: none;
}
}
}
}
}
.ucap-dialog-app-group-select-user {
width: 60%;
border-bottom: 1px solid #cccccc;
@include screen(xs) {
width: 100%;
height: 78%;
margin-bottom: 2%;
}
}
.ucap-dialog-organization-profile-selection {
position: relative;
width: 40%;
padding-left: $default-space;
border-bottom: 1px solid #cccccc;
@include screen(xs) {
width: 100%;
height: 20%;
padding: 0;
}
.ucap-organization-selected-list {
width: 100%;
height: 100%;
display: flex;
border: 1px solid #cccccc;
border-bottom: none;
overflow: auto;
}
}
}
.btn-box {
display: flex;
flex-direction: row;
button {
margin-left: 4px;
border-radius: 3px;
}
}
}

View File

@ -0,0 +1,26 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { ManageDialogComponent } from './manage.dialog.component';
describe('ucap::ui-organization::ManageDialogComponent', () => {
let component: ManageDialogComponent;
let fixture: ComponentFixture<ManageDialogComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ManageDialogComponent]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ManageDialogComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,396 @@
import { Subject, of } from 'rxjs';
import {
Component,
OnInit,
OnDestroy,
ChangeDetectionStrategy,
ChangeDetectorRef,
Inject,
ViewChild,
ViewContainerRef
} from '@angular/core';
import { Store } from '@ngrx/store';
import {
MatDialogRef,
MAT_DIALOG_DATA,
MatDialog
} from '@angular/material/dialog';
import { UserInfo, GroupDetailData } from '@ucap/protocol-sync';
import { UserInfoSS, UserInfoF, UserInfoDN } from '@ucap/protocol-query';
import { UserInfo as RoomUserInfo } from '@ucap/protocol-room';
import { MatStepper } from '@angular/material/stepper';
import { I18nService } from '@ucap/ng-i18n';
import { GroupActions } from '@ucap/ng-store-group';
import {
AlertDialogComponent,
AlertDialogData,
AlertDialogResult,
ConfirmDialogComponent,
ConfirmDialogResult,
ConfirmDialogData
} from '@ucap/ng-ui';
import { take, map, catchError } from 'rxjs/operators';
import { SelectUserDialogType, GroupManageType } from '@app/types';
import { AppGroupService } from '@app/services/app-group.service';
import { LogService } from '@ucap/ng-logger';
export type UserInfoTypes =
| UserInfo
| UserInfoSS
| UserInfoF
| UserInfoDN
| RoomUserInfo;
export interface ManageDialogData {
title: string;
groupBuddyList?: { group: GroupDetailData; buddyList: UserInfo[] };
}
export interface ManageDialogResult {
type: GroupManageType;
groupName: string;
group?: GroupDetailData;
selelctUserList?: UserInfoTypes[];
selectGroupList?: GroupDetailData[];
}
@Component({
selector: 'app-dialog-group-manage',
templateUrl: './manage.dialog.component.html',
styleUrls: ['./manage.dialog.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ManageDialogComponent implements OnInit, OnDestroy {
constructor(
public dialogRef: MatDialogRef<ManageDialogData, ManageDialogResult>,
@Inject(MAT_DIALOG_DATA) public data: ManageDialogData,
private changeDetectorRef: ChangeDetectorRef,
private store: Store<any>,
private i18nService: I18nService,
public dialog: MatDialog,
private appGroupService: AppGroupService,
private logService: LogService
) {
this.moveTitle = this.i18nService.t('group:dialog.title.moveGroup');
this.copyTitle = this.i18nService.t('group:dialog.title.copyGroup');
this.addTitle = this.i18nService.t('group:dialog.title.addBuddy');
}
@ViewChild('dialogContainer', { static: true, read: ViewContainerRef })
dialogContainer: ViewContainerRef;
private ngOnDestroySubject: Subject<void>;
private moveTitle: string;
private copyTitle: string;
private addTitle: string;
title: string;
GroupManageType = GroupManageType;
currentManageType: GroupManageType;
currentStep = 0;
groupName = '';
selectedUserList: UserInfoTypes[] = [];
selectedGroupList: GroupDetailData[] = [];
ngOnInit(): void {
this.ngOnDestroySubject = new Subject();
this.currentManageType = GroupManageType.None;
this.title = this.data.title;
}
ngOnDestroy(): void {
if (!!this.ngOnDestroySubject) {
this.ngOnDestroySubject.next();
this.ngOnDestroySubject.complete();
}
}
onClosed(event: MouseEvent): void {
this.dialogRef.close();
}
onDelete(stepper: MatStepper) {
if (
!!this.selectedUserList &&
this.selectedUserList.length > 0 &&
this.currentStep === 0
) {
let titleStr = '';
this.selectedUserList.map((user, idx) => {
let userTitle = user.name + ' ' + user.grade;
if (this.selectedUserList.length - 1 > idx) {
userTitle = userTitle + ', ';
titleStr = titleStr.concat('', userTitle);
} else {
titleStr = titleStr.concat('', userTitle);
}
});
this.appGroupService
.removeMemberToGroup(
this.i18nService.t('group:dialog.removeBuddyConfirm', {
targetMember: titleStr
}),
this.selectedUserList,
this.data.groupBuddyList.group
)
.then(() => this.dialogRef.close())
.catch((reson) => this.logService.error(reson));
}
}
onUpdateMember(stepper: MatStepper, type: GroupManageType) {
this.currentManageType = type;
if (type === GroupManageType.Move) {
this.title = this.moveTitle;
} else {
this.title = this.copyTitle;
}
this.currentStep++;
stepper.next();
}
onAdd(stepper: MatStepper) {
this.title = this.addTitle;
this.currentManageType = GroupManageType.Add;
this.selectedUserList = this.data.groupBuddyList.buddyList;
this.currentStep++;
stepper.next();
}
onChangeGroupName(data: { invalid: boolean; groupName: string }) {
this.groupName = data.groupName;
}
onSelectBySectionGroup(data: { checked: boolean; group: GroupDetailData }) {
const i = this.selectedGroupList.findIndex((u) => u.seq === data.group.seq);
if (data.checked) {
if (-1 === i) {
this.selectedGroupList = [...this.selectedGroupList, data.group];
}
} else {
if (-1 < i) {
this.selectedGroupList = this.selectedGroupList.filter(
(u) => u.seq !== data.group.seq
);
}
}
}
onSelectBySectionUserGroup(params: {
isChecked: boolean;
groupBuddyList: { group: GroupDetailData; buddyList: UserInfo[] };
}) {
if (params.isChecked) {
params.groupBuddyList.buddyList.forEach((item) => {
if (
this.selectedUserList.filter((user) => user.seq === item.seq)
.length === 0
) {
this.selectedUserList = [...this.selectedUserList, item];
}
});
} else {
this.selectedUserList = this.selectedUserList.filter(
(item) =>
params.groupBuddyList.buddyList.filter((del) => del.seq === item.seq)
.length === 0
);
}
}
doneAnimation() {
this.changeDetectorRef.markForCheck();
}
onChangeSelectedUserList(
datas: {
checked: boolean;
userInfo: UserInfoSS;
}[]
) {
if (!datas || 0 === datas.length) {
return;
}
const pushs: UserInfoSS[] = [];
const pops: UserInfoSS[] = [];
datas.forEach((d) => {
const i = this.selectedUserList.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.selectedUserList = [...this.selectedUserList, ...pushs];
}
if (0 < pops.length) {
this.selectedUserList = this.selectedUserList.filter(
(u) => -1 === pops.findIndex((p) => p.seq === u.seq)
);
}
}
onCancel(stepper: MatStepper) {
if (
!!this.selectedUserList &&
this.selectedUserList.length > 0 &&
this.currentManageType === GroupManageType.Add
) {
this.selectedUserList = [];
} else {
const tempList = [];
this.selectedUserList.map((user) => {
this.data.groupBuddyList.buddyList.every((buddy) => {
if (user.seq === buddy.seq) {
tempList.push(user);
return false;
}
return true;
});
});
this.selectedUserList = [...tempList];
}
this.selectedGroupList = [];
this.currentStep--;
this.title = this.data.title;
stepper.previous();
}
onConfirm(stepper: MatStepper) {
switch (this.currentManageType) {
case GroupManageType.Add:
{
if (!!this.selectedUserList && this.selectedUserList.length > 0) {
this.doAction();
}
}
break;
case GroupManageType.Copy:
case GroupManageType.Move:
{
if (
!!this.selectedUserList &&
this.selectedUserList.length === 0 &&
this.groupName === ''
) {
this.dialog.open<
AlertDialogComponent,
AlertDialogData,
AlertDialogResult
>(AlertDialogComponent, {
panelClass: 'min-create-dialog',
data: {
title: 'Error',
html: this.i18nService.t('group:error.notSelectedUser')
}
});
return;
}
this.doAction();
}
break;
}
}
doAction() {
if (!!this.groupName && this.groupName.trim().localeCompare('') !== 0) {
this.currentManageType = GroupManageType.Create;
} else {
this.groupName = undefined;
}
this.dialogRef.close({
type: this.currentManageType,
groupName: this.groupName,
group: this.data.groupBuddyList.group,
selelctUserList: this.selectedUserList,
selectGroupList: this.selectedGroupList
});
}
/** 개별 체크여부 */
getCheckedUser(userInfo: UserInfoSS) {
if (!!this.selectedUserList && this.selectedUserList.length > 0) {
return (
this.selectedUserList.filter(
(item) => String(item.seq) === String(userInfo.seq)
).length > 0
);
}
return false;
}
checkDisableBtn(): boolean {
let findUser: UserInfoTypes[];
if (!!this.selectedUserList && this.selectedUserList.length > 0) {
findUser = this.selectedUserList.filter((user) => {
return this.data.groupBuddyList.group.userSeqs.includes(
String(user.seq)
);
});
}
if (!!findUser && findUser.length > 0) {
return false;
} else {
return true;
}
}
checkDisableBtnConfirm() {
if (
(!!this.selectedUserList && this.selectedUserList.length > 0) ||
(!!this.groupName && this.groupName.trim().localeCompare('') !== 0)
) {
return false;
}
return true;
}
onToggleCheck(data: { checked: boolean; userInfo: UserInfoSS }) {
this.onChangeSelectedUserList([data]);
}
onRemovedProfileSelection(userInfo: UserInfo) {
const i = this.selectedUserList.findIndex(
(u) => String(u.seq) === String(userInfo.seq)
);
if (-1 < i) {
this.selectedUserList = this.selectedUserList.filter(
(u) => String(u.seq) !== String(userInfo.seq)
);
}
}
removableForSelection = (userInfo: UserInfo) => {
return true;
};
colorForSelection = (userInfo: UserInfo) => {
return 'accent';
};
}