본문으로 건너뛰기

JunkBox apps/raid-ui 가이드

1. 애플리케이션 역할

  • apps/raid-ui는 레이드 운영 화면용 React + Vite 프런트엔드 앱임.
  • 공대원 목록, 공대원 관리, 공대 구인 알림 화면을 제공함.
  • 공대원 목록과 관리는 PC/FHD 우선 단일 작업형 화면이며, 공대 구인 알림은 모바일 우선 단일 열 화면임.
  • 스타일은 shared-ui 공통 자산만 사용함.

2. 런타임 구성

  • 번들러는 Vite 6 계열을 사용함.
  • React + TypeScript strict 기준으로 구현함.
  • 개발 서버 기본 포트는 15009임.
  • 빌드 산출물은 apps/raid-ui/dist에 생성됨.
  • 운영에서는 raid-api가 이 산출물을 /raid-ui 경로로 직접 서빙함.

3. 엔트리와 화면 분기

  • 메인 엔트리는 src/entries/raid.tsx임.
  • 루트 마운트 지점은 raid-ui-root임.
  • 메인 화면 컴포넌트는 src/pages/RaidPage.tsx임.
  • 서버가 주입한 page_props.view 값을 기준으로 members, manage, recruitment 화면을 분기함.
  • 초기 props에는 현재 사용자, 레이드/난이도/직업/서버/역할/근원/공대원 구분 코드 목록이 포함됨.
  • 공대 구인 알림은 BrowserRouter/raid/recruitment SPA 경로로 진입함. 서버 렌더링 진입 경로와 Vite 개발 서버의 /raid-ui/raid/recruitment 경로는 모두 이 화면으로 연결됨.
  • SPA 내부 이동은 junkbox:spa-navigate, SpaRouteTransition, useSpaRouteSettling 공통 계약을 사용함.

4. 화면 구조

4.1 공대원 목록 화면

  • 상단 제어 영역은 레이드, 난이도, 구분, 조회 상태, 작업 그룹을 한 행에 배치함.
  • 구분추적, 공대원 멀티 체크를 하나의 선택 영역으로 제공함. 는 체크 항목으로 노출하지 않으며 서버가 항상 포함함. 초기값은 추적공대원을 모두 선택한 상태임.
  • 조회 상태 그룹에는 총 n건과 선택 레이드·난이도의 최근 업데이트 시각을 배치함.
  • 액션 버튼은 wow-check, 조회, 점수 갱신, 저장을 사용함.
  • 그리드는 풀 로딩형 Tabulator를 사용함.
  • 구분 컬럼은 캐릭터명 바로 앞에 배치하며, 공통코드 정렬 순서인 , 추적, 공대원 순으로 행을 표시함.
  • 최근 업데이트는 목록 전체 갱신 상태이므로 행별 컬럼으로 표시하지 않고 상단 조회 상태에만 표시함.
  • 캐릭터명 셀은 새 탭으로 Warcraft Logs 캐릭터 페이지를 여는 링크임. URL은 https://ko.warcraftlogs.com/character/kr/{server_slug}/{character_name}?difficulty={difficulty_code}&zone={raid_code}이며, server_slug는 서버 공통코드 SERVER.attribute02 값임.
  • 역할, 근/원, 참여 여부, 정렬 순서를 인라인 편집함.
  • 보스 점수 컬럼은 선택된 레이드와 난이도 기준으로 동적으로 구성됨.
  • 점수 셀은 기본적으로 숫자만 색상으로 표시하며, 미확정 점수만 셀 전체 강조색으로 표현함.
  • 개별 행 점수 갱신 UI는 제공하지 않음.
  • 행 재정렬은 드래그앤드롭으로 수행하고 저장 시 정렬 순서를 서버에 반영함.

4.2 공대원 관리 화면

  • 상단 필터 영역에서 레이드를 선택함.
  • 작업 패널 헤더에는 총 n건, 우측 액션 버튼 영역을 배치함.
  • 액션 버튼은 조회, 추가, 삭제, 저장을 사용함.
  • 그리드는 풀 로딩형 Tabulator를 사용함.
  • 저장형 마스터 화면이므로 신규 행 추가, 인라인 편집, 일괄 저장을 한 화면에서 처리함.
  • 첫 컬럼은 선택 체크박스 컬럼이며, 일괄 삭제는 선택 행 기준으로 수행함.
  • 서버, 직업, 역할, 근/원 같은 코드성 컬럼은 list editor를 사용함.
  • 구분 컬럼은 캐릭터명 바로 앞에 배치하고 RAID_MEMBER_CATEGORY 코드 목록을 list editor로 편집함.
  • 신규 행은 구분=공대원과 나머지 빈값 + 필수 검증 기준으로 시작함.
  • 저장 전 신규 행 삭제는 프런트 메모리에서만 제거함.

4.3 공대 구인 알림 화면

  • 고정 폭 모바일 레이아웃에서 공대 구인 프로필과 최근 탐색 결과를 카드 목록으로 표시함.
  • 프로필 추가·수정은 모바일 시트에서 처리하며, 프로필 제목은 사용자 식별용 자유 입력값임. 제목 자동완성이나 기본 제목을 제공하지 않음.
  • 프로필 입력값은 활동 상태, 허용 요일, 주당 횟수, 추가 검색어, 제외 검색어, 알림 허용 시작·종료 시각임.
  • 직업, 역할, 전문화 선택과 프리셋 UI는 제공하지 않음. 추가·제외 검색어를 쉼표로 구분해 입력하며 모든 검색 의도는 이 두 입력값으로 표현함.
  • 원본은 와우 인벤 파티찾기 > 공격대_구인으로 고정 표시하며 사용자가 URL이나 수집 규칙을 바꾸지 않음.
  • 최근 탐색 결과는 판정, 요약, 원문 링크만 표시함. 게시글 본문은 UI에 보관하거나 재표시하지 않음.
  • 새로고침은 결과 재조회만 수행하며, 프로필 추가는 편집 시트를 여는 동작임. 저장과 삭제만 실제 저장소 변경 액션으로 처리함.

5. 공통 UI 규칙 반영 방식

  • 레이드 화면은 hub-ui-base.css + hub-ui-desktop.css + junkbox-tabulator.css 조합을 사용함.
  • 페이지 전체 스크롤보다 내부 그리드 스크롤을 우선함.
  • 그리드는 부모 패널 높이를 채우고, 데이터가 많아도 패널 내부에서만 스크롤됨.
  • 컬럼 폭은 가능하면 가로 스크롤이 생기지 않도록 타이트하게 조정함.
  • 공통 버튼 위계는 docs/junkbox/common/guide-jb-common-ui.md의 저장/조회 기준을 그대로 따름.
  • 상단 필터 셀렉트와 그리드 내부 셀렉트는 모두 공통 다크 테마 규칙을 사용함.
  • 공대 구인 모바일 화면은 전용 CSS를 만들지 않고 shared-ui의 모바일 폭, 패널, 카드, 시트, 하단 고정 액션바 자산을 조합함.
  • 프로필의 활성·비활성 상태는 jb-select 외형과 BottomOptionPicker로 변경함. 네이티브 체크박스를 사용하지 않음.
  • 카드 목록의 활성·비활성 배지는 공통 UI 문서의 모바일 카드 상태 배지 규칙을 사용하며 줄바꿈되지 않아야 함.

6. Tabulator 연동 규칙

  • 편집형 그리드는 Tabulator 기준으로 구현함.
  • list editor 셀에는 공통 클래스 jb-cell-editor-list를 적용하여 편집 가능 셀임을 우측 chevron으로 표시함.
  • list editor 드롭다운은 브라우저 기본 흰색 팝업 대신 공통 다크 스타일을 사용함.
  • 체크박스 선택 컬럼, hover/selected 행 강조, 줄무늬 제거는 공통 Tabulator CSS가 담당함.
  • 헤더 필터는 별도 검색 패널 대신 컬럼별 직접 검색 수단으로 사용함.

7. 데이터 흐름

  • React 화면은 raid-api JSON API만 호출함.
  • 사용자 피드백은 shared-ui 공통 토스트 유틸을 통해 처리함.
  • 사용자 노출 텍스트는 화면 컴포넌트에 한국어 문구로 직접 작성함.
  • 공통코드 라벨과 메타 설정값처럼 데이터 자체가 마스터데이터인 값만 DB 조회 구조를 사용함.
  • 저장 성공/실패, 점수 갱신, 정렬 저장, 삭제 결과는 공통 토스트로 표기함.
  • WCL 점수 갱신은 전체 페이지 단위 액션만 호출함.
  • wow-check 액션은 목록 API가 반환한 wow_check_url을 새 탭으로 열며, 선택 난이도 코드에 맞는 외부 조회 URL을 직접 조합하지 않음.
  • 공대 구인 화면은 프로필 목록·등록·수정과 최근 탐색 결과 API를 호출함.

8. 개발 및 빌드 기준

  • 타입 계약은 앱 내부 src/types/models.ts를 기준으로 관리함.
  • 브라우저 전역 타입과 import.meta.env 타입은 앱 내부 선언 파일에서 관리함.
  • 개발 모드 엔트리 경로는 /raid-ui/src/entries/*.tsx 기준을 사용함.
  • Vite dev client 경로는 /raid-ui/@vite/client임.
  • React refresh runtime 경로는 /raid-ui/@react-refresh임.

9. 관련 문서

  • 프로젝트 전체 구조는 docs/junkbox/common/guide-jb-core.md를 따름.
  • 레이드 백엔드 구조는 docs/junkbox/apps/guide-apps-raid-api.md를 따름.
  • 공통 UI 자산 구조는 docs/junkbox/libs/guide-lib-shared-ui.md를 따름.
  • 공통 UI 규칙은 docs/junkbox/common/guide-jb-common-ui.md를 따름.