Skip to content

Console 목록 구성·조회·페이지네이션

2026-09-06 KST — 기존 2026-06-22의 수납 3축 전용 가이드를 대체합니다.

정본과 소유권

  • 외형·구성은 설치된 EDS registry의 ETableCard, EListQueryBar, ECriteriaSelect, ETable, ETablePagination을 소비합니다. CSS·토큰은 manifest의 게시된 exact @leysys/eds 버전이 소유합니다.
  • 제품은 조회 초안/적용 상태, 원천 데이터, 선택 ID, 권한, 실제 업무 명령을 소유합니다. registry 내부에 도메인 상태를 넣지 않습니다.
  • ETableCard Body 순서는 Query → ListAction 또는 SelectionAction → TableBlock입니다. TableBlock 안에서 ETable의 스크롤 영역과 Pagination은 외부 간격 없이 인접합니다. CardFooter는 필수 영역이 아니며 페이지네이션을 넣지 않습니다.
  • Header에는 필요한 목록 정체성(제목·설명·카드 유틸리티)만 둡니다. 검색·조건·데이터 액션을 넣지 않습니다.
  • 표가 아닌 Portal 채널 펼침 카드 컬렉션은 원래 표현을 유지합니다. Body에 EListQueryBar를 사용하지만 의미 없는 ETable이나 페이지네이션을 만들지 않습니다.

타이틀 첫 데이터 컬럼

2026-09-14 KST — Design LIST-PRIMARY-TITLE-FIRST-2026-09-14 / PR #631 / merge b14b5b32266f99283cd27e344c965e5b383d3a56을 채택합니다. 제품 배포 상태는 별도 검증 보고서에서 관리합니다.

순서는 선택/펼침 → 타이틀(주 식별자) → 유형·상태·기타 정보 → 행 액션입니다. 첫 데이터 컬럼은 항상 타이틀이며 Criteria·단일/복수귀속에 따른 분류 선행 예외는 없습니다. 조건·viewport가 바뀌어도 열 순서는 고정합니다.

거래처의 legalType과 roles를 분리했습니다. 표시 유형은 법인/개인이며 individual 조건은 개인사업자도 포함합니다. 원본 legalType·등록번호·UUID와 predicate는 유지합니다. 단일/복수 역할 여부가 타이틀 위치를 바꾸지 않습니다.

헤더와 행을 함께 이동하고 empty/error/loading colspan을 맞춥니다. 선택·상세·정렬·CSV는 DOM 열 인덱스가 아닌 기존 필드/ID를 유지합니다. 규칙 편차는 advisory이며, 데이터 매핑·클릭 대상·접근성 실패만 실제 고장으로 검증합니다.

제품 상태 API

상태 구현: src/composables/useConsoleListState.js, 기본 페이지 상태: src/composables/usePagination.js.

  1. 한 Main/목록에서 provideConsoleListState()를 만들고 실제 표의 useConsoleListRows(source, { key, searchText, criteria })가 원천을 연결합니다. 한 목록에는 원천 하나만 연결합니다.
  2. 원천을 부모가 이미 소유하거나 한 페이지에 표가 여러 개면 createConsoleListState()를 목록마다 만들고 명시적으로 연결합니다. 기존 도메인 composable의 계산·필터·저장은 대체하지 않습니다.
  3. searchText는 명시적 업무 필드 accessor입니다. 렌더된 DOM 문자열이나 임의 JSON 전체를 검색하지 않습니다.
  4. pageRows는 표시 전용입니다. filteredRows·원천 배열과 급여/청구 합계는 페이지 배열로 대체하지 않습니다. 그룹 목록은 최상위 그룹만 자르고 그 하위 행은 부모와 함께 렌더합니다.

usePagination은 page/pageSize/total, setTotal/setPage/setPageSize, slice를 제공합니다. 기본 20, 허용 크기는 20/50/100입니다. first/last 등 내부 계산 helper가 남아 있더라도 UI에 First/Last/goto/전체 옵션을 다시 노출하지 않습니다. 페이지 컨트롤의 렌더링은 ETablePagination이 소유합니다.

검색과 조건

  • EListQueryBar mode=explicit. v-model은 draftSearch이고 search 이벤트가 적용 상태를 갱신합니다. 검색 제출 버튼은 입력 밖 1개입니다.
  • 상세 조건 invoker는 검색 입력 내부 끝의 EInputGroupButton(type=button)입니다. 기존 EDS 기본 전경을 사용하며 제품별 색상 override를 추가하지 않습니다.
  • 즉시 선택 기준은 inline ECriteriaSelect를 사용합니다. Query에 포함된 날짜·기간 초안은 해당 검색 제출 시 적용하고, Sheet 안의 날짜·기간 초안은 Sheet 적용으로만 반영합니다. 실제 조건이 없다면 trigger/Sheet도 없습니다.
  • Criteria Sheet는 native dialog + form.e-sheet-content 조합입니다. 검색 초안과 Sheet 조건 초안은 독립이며 Sheet 적용이 검색을 제출하지 않습니다. 취소·닫기 후 다시 열면 적용된 조건에서 초안을 복원합니다.
  • 조회가 적용되거나 pageSize가 바뀌면 1페이지로 돌아갑니다. 입력만 편집하는 동안 현재 결과와 페이지를 바꾸지 않습니다.

선택·액션·접근성

  • 선택 ID는 업무 ID를 사용합니다. 현재 페이지 전체 선택과 결과 전체 선택은 같은 의미가 아닙니다. 현재 구현의 헤더 체크박스는 현재 페이지 선택입니다.
  • 선택 상태에서는 SelectionActionBar가 ListActionBar를 대체하고 role=status로 선택 개수를 한 번 표시합니다. 페이지 범위는 계속 표시합니다.
  • 선택 해제 또는 선택 행이 제거되어 기존 액션이 사라지면 연결된 선택 체크박스, 없으면 검색 입력으로 포커스를 복원합니다.
  • 전체 목록 작업은 ListAction, 선택 작업은 SelectionAction, 행 작업은 해당 행, 급여 확정 등 업무 단계 명령은 Card 밖 EPageActionBar가 소유합니다. 표를 페이지로 나눴다는 이유로 기존 API가 없는 일괄 작업을 만들지 않습니다.
  • ETable이 수평 스크롤을 소유합니다. Card Body나 데이터 액션 자식에 중첩 overflow 경계를 추가해 포커스 테두리를 자르지 않습니다. 별도 PageActionBar가 긴 명령 행을 소유할 경우 해당 영역이 국소 스크롤을 소유합니다.
  • 표는 caption, aria-labelledby 또는 aria-label로 이름을 갖고, 검색·조건·페이지 landmark 이름은 해당 목록을 식별합니다. 한 페이지 여러 목록은 서로 다른 이름을 사용합니다.
  • 로딩·오류·빈 결과는 목록의 실제 상태에 따라 표시합니다. 빈 결과에는 pager를 렌더하지 않습니다. 새 데이터가 없는 상태를 성공한 서버 조회로 표현하지 않습니다.

적용 범위와 예외

이번 기능형 변경은 거래처·사업자, 시설 자산/유닛/거래처, 현장, CRM 4종, 룸/룸 타입, 조직 유닛, 구매요청/재고, 계정과목, 통합 계약 멤버/유닛, 급여/급여대장, 문서센터, 업무일지, 본부 고객계정과 Portal 채널을 포함합니다. 정적 목록·빌링·회계 보고서 전파와 실제 활성 경로 집계는 별도 전체 채택 보고서가 소유합니다. 이 문서만으로 모든 화면의 런타임 검증 완료를 주장하지 않습니다.

  • 보고서·계층 편집·로그인 조직 선택은 행 개수만 보고 목록 페이지로 강제 변환하지 않습니다.
  • Portal 채널의 카드 상세, 실제 권한/서버 원천, 기존 저장 미지원 안내는 유지합니다.
  • 원래 작동하지 않던 All/tag 1/tag 2와 업무일지 기간 토글은 조회 조건으로 남기지 않았습니다. 원천에 의미가 있는 유형·상태·기준일만 연결했습니다.
  • 본부 고객계정은 기존 서버 query/판매주체/status를 사용하고 반환된 배열을 클라이언트 페이지로 나눕니다. 이미 페이지된 서버 응답을 이 slice에 다시 넣으면 안 됩니다.

검증 근거와 한계

기능형 targeted unit: functionalListAdoption.spec.js, functionalGroupedListAdoption.spec.js, PortalChannelsPag.spec.js, SalesCustomerAccountsPag.spec.js 및 각 도메인의 기존 관련 테스트를 사용합니다. synthetic fixture의 페이지 2/조건/선택 검증은 운영 서버 데이터 검증과 구분합니다.

최종 실제 route의 412/768/960/1024/1440 geometry, 수평 스크롤, Sheet 내부 날짜 picker와 포커스 검증은 해당 작업의 보존 artifact에 기록합니다. 기존 probe-pagination.mjs의 unprefixed selector·First/Last 측정이나 과거 build 수치를 현재 증거로 재사용하지 않습니다. 문서 미러·제품 게시·운영 배포는 별도 승인과 결과가 필요합니다.