jskim-node #1
Reference in New Issue
Block a user
Delete Branch "jskim-node"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
검색 컴포넌트의 연결 탭이 다른 컴포넌트(입력, 카드리스트)와 달리 필터 설정이 연결 폼에 포함되어 있던 비일관성을 해결한다. - ConnectionEditor: FilterConnectionForm 제거, 모든 컴포넌트가 SimpleConnectionForm 사용하도록 통합 - PopSearchConfig: 상세설정 탭에 FilterConnectionSection 추가 (text/select/date-preset/modal 타입별 통합) - FilterConnectionSection: 연결된 대상 컴포넌트의 테이블 컬럼을 API 조회하여 체크박스 기반 복수 선택 UI 제공 ("카드에서 표시 중" / "기타 컬럼" 그룹 구분) - types: SearchFilterMode, filterColumns 타입 추가 - PopSearchComponent: filterColumns 배열을 이벤트 payload에 포함 - useConnectionResolver: filterColumns를 targetColumns로 전달, auto-match에서 filter_value 타입 매칭 + filterConfig 자동 추론pop-search 컴포넌트의 date 입력 타입이 미구현 상태에서 네이티브 input으로 임시 처리되어 있던 것을 shadcn Calendar 기반 POP 전용 UI로 교체하고, 셀 크기에 입력 필드가 반응하지 않던 레이아웃 문제를 함께 해결한다. [BLOCK P: 날짜 입력 타입] - DateSingleInput: Calendar + Dialog/Popover 기반 단일 날짜 선택 - DateRangeInput: 프리셋(오늘/이번주/이번달) + Calendar 기간 선택 - CalendarDisplayMode(popover/modal) 설정으로 터치 환경 대응 - resolveFilterMode로 date->equals, range->range 자동 결정 - DateDetailSettings 설정 패널 추가 (모드 선택 + 캘린더 표시 방식) - PopStringListComponent: range 필터 모드 구현 + 날짜 equals 비교 개선 [레이아웃 개선] - 입력 필드가 셀 너비/높이에 반응하도록 h-full min-h-8 + w-full 적용 - labelPosition("top"/"left") 분기 제거 -> 항상 라벨 위 고정 - 설정 패널에서 "라벨 위치" Select UI 제거 - 기본 배치 크기 colSpan:4 rowSpan:2 -> colSpan:2 rowSpan:1화면 디자이너(비개발자)가 버튼 작업 설정을 직관적으로 할 수 있도록 설정 패널의 용어, 레이아웃, 구조를 전면 개선한다. [디자인 통일] - Input/Select 높이 h-8, 라벨 text-xs font-medium, 도움말 text-[11px]로 통일 - db-conditional UI를 가로 나열에서 세로 스택으로 전환 (좁은 패널 잘림 방지) - 작업 항목 간 간격, 패딩, 둥근 모서리 일관성 확보 [자연어 라벨] - "대상 테이블" → "어떤 테이블을 수정할까요?" - "변경 컬럼" → "어떤 항목(컬럼)을 바꿀까요?" - "연산" → "어떻게 바꿀까요?" + 각 연산별 설명 도움말 - "값 출처: 고정값" → "직접 입력", "연결 데이터" → "화면 데이터에서 가져오기" - 비교 연산자에 한글 설명 추가 (">=" → ">= (이상이면)") [구조 개선] - "조회 키"를 "고급 설정" 토글로 숨김 (기본 접힘, 대부분 자동 매칭) - "연결 필드명" 수동 입력 → 카드 컴포넌트 필드 목록에서 Select 선택 - 접힌 헤더에 요약 텍스트 표시 + 마우스 호버 시 전체 툴팁 - 펼친 상태 하단에 설정 요약 미리보기 [컬럼 코멘트 표시] - 백엔드: getTableSchema SQL에 col_description() 추가 - 프론트: ColumnCombobox에서 코멘트 표시 + 한글명 검색 지원 - ColumnInfo 인터페이스에 comment 필드 추가설정 패널의 도메인 특화 라벨("공정")을 범용 라벨("하위 데이터/표시명")로 교체하고, 상태 값 매핑을 고정 4키 객체에서 동적 배열(statusMappings)로 전환하여 임의 개수의 워크플로우 상태를 지원한다. [라벨 범용화] - "공정 데이터 소스" → "하위 데이터 소스" - "공정 테이블" → "하위 테이블" - "공정명" → "표시명" - "현재 공정 강조" → "현재 항목 강조" - "전체 공정 모달" → "전체 목록 모달" - cell-renderers 내 "공정" 텍스트 전부 범용 교체 [상태 값 매핑 동적 배열] - types.ts: statusValues(고정 4키) → statusMappings(StatusValueMapping[]) TimelineStatusSemantic("pending"|"active"|"done"), StatusValueMapping 타입 추가 TimelineProcessStep에 semantic? 필드 추가 - PopCardListV2Config: StatusMappingsEditor 컴포넌트 신규 (행 추가/삭제 + 시맨틱 Select + 기본값 적용 버튼) - PopCardListV2Component: resolveStatusMappings() 레거시 자동 변환 함수 injectProcessFlow 동적 맵 기반 정규화로 전환 - cell-renderers: TIMELINE_STATUS_STYLES → TIMELINE_SEMANTIC_STYLES getTimelineStyle() + LEGACY_STATUS_TO_SEMANTIC 레거시 호환 completedCount/statusLabel/isAcceptable 모두 semantic 기반으로 전환공정 필터 선택 시 상태 뱃지/카운트/버튼이 공정 상태 기준으로 동작하도록 파생 상태 자동 계산, 하위 필터 __subStatus__ 주입, 접수 버튼 공정 행 특정 로직을 구현한다. [파생 상태 자동 계산] - types.ts: StatusValueMapping.isDerived 필드 추가 isDerived=true면 DB에 없는 상태로, 이전 공정 완료 시 자동 변환 - PopCardListV2Component: injectProcessFlow에 derivedRules 기반 변환 로직 같은 semantic의 원본 상태를 자동 추론 (waiting → acceptable) - TimelineProcessStep에 processId, rawData 필드 추가 [하위 필터 __subStatus__ 주입] - PopCardListV2Component: filteredRows를 2단계로 분리 1단계: 하위 테이블(work_order_process) 필터 → 매칭 공정의 상태를 VIRTUAL_SUB_STATUS/SEMANTIC/PROCESS/SEQ 가상 컬럼으로 주입 2단계: 메인 필터에서 status 컬럼을 __subStatus__로 자동 대체 - cell-renderers: StatusBadgeCell/ActionButtonsCell이 __subStatus__ 우선 참조 하드코딩된 접수가능 판별 로직(isAcceptable) 제거 → 설정 기반으로 전환 - all_rows 발행: { rows, subStatusColumn } envelope 구조로 메타 포함 [타임라인 강조(isCurrent) 개선] - "기준" 상태(isDerived) 기반 강조 + 공정 필터 시 매칭 공정 강조 - 폴백: active → pending 순서로 자동 결정 [접수 버튼 공정 행 특정] - cell-renderers: ActionButtonsCell에서 현재 공정의 processId를 __processId로 전달 - PopCardListV2Component: onActionButtonClick에서 __processId로 공정 행 UPDATE [상태배지 타임라인 연동] - PopCardListV2Config: StatusMappingEditor에 "타임라인 연동" 버튼 추가 같은 카드의 타임라인 statusMappings에서 값/라벨/색상/컬럼 자동 가져옴 [타임라인 설정 UI] - PopCardListV2Config: StatusMappingsEditor에 "기준" 라디오 버튼 추가 하나만 선택 가능, 재클릭 시 해제 [연결 탭 하위 테이블 필터 설정] - ConnectionEditor: isSubTable 체크박스 + targetColumn/filterMode 설정 UI - pop-layout.ts: filterConfig.isSubTable 필드 추가 [status-chip 하위 필터 자동 전환] - PopSearchComponent: 카드가 전달한 subStatusColumn 자동 감지 useSubCount 활성 시 집계/필터 컬럼 자동 전환 - PopSearchConfig: useSubCount 체크박스 설정 UI - types.ts: StatusChipConfig.useSubCount 필드 추가 [디자이너 라벨] - ComponentEditorPanel: comp.label || comp.id 패턴으로 통일0277b6baa3ebed48d0501325e4542663e9e6f375252dea6aa6921cb1afe1bcbad3a002f3784dc73affc7cb7933232650bcfe3c6d3bce2b4500a9cc51ad71da87a7431ec55520f01cd3acf391ad48b227708e4791c5360a9ab1aa분할 카드 접수량 오표시(800), 모달 접수량 0, 실적등록 미반영, 접수취소 실패의 근본 원인을 분석하고 4건의 수정을 적용한다. 근본 원인: acceptProcess에서 마스터를 in_progress로 변경 -> 프론트 isCurrent가 코팅(acceptable)을 잡음 -> 분할 카드 미생성 -> 마스터ID로 API 호출하여 모든 후속 동작이 실패하는 연쇄 구조. [Fix A] acceptProcess: 마스터 상태를 in_progress로 변경하는 로직 제거 - 마스터는 항상 acceptable 유지, completed로만 전환 [Fix B] buildProcessSteps: isCurrent 결정 시 활성 분할 행 우선 - in_progress 등 비완료 분할이 있는 공정을 최우선 선택 - 분할 카드(__splitProcessId)가 정상 생성되도록 보장 [Fix C] applySubFilterAndDuplicate: 분할 카드 데이터 보호 - __splitProcessId가 있는 카드의 __process_* 필드를 마스터 SUM 집계값으로 덮어쓰지 않음 [Fix D] saveResult: 마스터 행 직접 실적등록 차단 - 분할 행이 존재하는 마스터에 실적 등록 시 400 에러 반환609460cdab477abf8b577e9c120f156446517f33b3fdcd0f0df34dMES 고정 구조에 맞게 설정 패널을 간소화하고, 작업상세 내장 모달과 작업자 기반 카드 필터링 기능을 추가한다. [설정 패널 간소화] - 3탭(데이터/디자인/동작) -> 2탭(정보/동작)으로 축소 - "정보" 탭: 데이터 소스, 카드 구성, 클릭 동작을 읽기 전용 요약으로 표시 - "동작" 탭: cardClickAction 선택(none/modal-open/built-in-work-detail) + 내 작업 표시 + 고급 설정(필터 전 숨김, 기본 표시 수) 유지 - PopWorkDetailConfigPanel을 카드 설정에서 분리 (작업상세 컴포넌트 자체 설정 패널에서 관리) [Core Binding 내장 모달] - cardClickAction="built-in-work-detail" 시 내부 Dialog로 PopWorkDetail 직접 렌더링, parentRow를 prop으로 전달 - LazyPopWorkDetail dynamic import로 성능 최적화 - in_progress 상태 카드만 상세 모달 열림 [카드 열 수 선택] - 정보 탭 상단에 1열/2열/3열/4열 버튼 UI 추가 - gridColumns 설정 즉시 반영 [내 작업 표시 3모드] - 전체 보기: 모든 카드 동등 표시 - 우선 표시: 내 카드 상단 + 다른 카드 비활성화(기존 동작) - 내 작업만: worker 컬럼 기준 내 카드만 표시, 나머지 숨김 - ownerFilterMode("priority"|"only") 타입 추가, 컬럼 선택 드롭다운 제거하고 worker 고정 토글로 단순화MES 고정 구조에 맞게 검색/연결/필터 컴포넌트를 간소화하고, 하위 테이블 필터를 수동 설정에서 자동 판단으로 전환한다. [pop-search 레거시 정리] - LegacySearchInputType, StatusChipConfig, StatusChipStyle, SelectDataSource 등 미사용 타입 제거 - status-chip, multi-select, combo 입력 타입 제거 (DB 호환: normalizeInputType에서 text로 정규화) - 설정 패널에서 status-chip 관련 UI/안내문 제거 - SEARCH_INPUT_TYPE_LABELS 간소화 (7종 -> 5종) [하위 테이블 자동 판단] - PopCardListV2Component: subTableKeys useMemo 추가 (processFlow rawData 키셋에서 하위 테이블 컬럼 자동 추출) - isSubTableColumn useCallback: filterConfig.isSubTable 하위 호환 + subTableKeys 기반 자동 판단으로 메인/하위 필터 분류 - ConnectionEditor: "하위 테이블 기준으로 필터" 체크박스 UI 제거, isSubTable 상태 및 setIsSubTable 전부 제거 - 컬럼 선택 드롭다운: 메인+하위 테이블 컬럼 통합 표시 - 기존 연결 배지 "하위 테이블" -> "자동 판단"으로 변경 [초기값 프로필 세팅] - PopSearchConfig.initialValueSource 타입 추가 ({ type: "user_profile", column: string }) - PopSearchComponent: useAuth + useEffect로 사용자 프로필 값 자동 필터 발행 (userId, deptCode, positionCode 등) - 설정 패널: "초기값 자동 세팅" Select 드롭다운 추가 (사용 안 함 / 사용자ID / 부서코드 / 직급 등 7개 옵션)장바구니(cart) 기반 구매입고 흐름에서 버튼 동작, 검색 접근성, 필터 안내 메시지 기능을 수정하여 실제 운영 시나리오에서의 안정성을 확보한다. [pop-button 장바구니 모드 판단 수정] - isCartMode: v1 preset뿐 아니라 v2 tasks에 cart-save가 포함된 경우에도 장바구니 모드로 인식하도록 개선 - resolvedCartScreenId: v2 tasks의 cartScreenId도 참조 - 장바구니 모드 분기를 v2 tasks 처리보다 먼저 실행하여 cart-save 버튼이 정상 동작하도록 순서 변경 [pop-search 아이콘 카드 접근성] - IconView의 div 카드에 role="button", tabIndex={0}, onKeyDown(Enter/Space) 추가 - 브라우저 자동화 및 키보드 사용자가 아이콘 카드를 인터랙티브 요소로 인식 가능 [필터 필수 안내 메시지 기능] - pop-card-list(장바구니 목록): requireFilter, requireFilterMessage 설정 추가, 필터 미선택 시 커스텀 안내 문구 표시 - pop-card-list-v2(MES 공정흐름): hideUntilFilteredMessage 설정 추가, 기존 필터 전 숨김에 커스텀 문구 지원 - 양쪽 설정 패널에 안내 문구 입력 UI 추가 [원본 화면 선택 Combobox 전환] - PopCardListConfig 장바구니 모드의 원본 화면 선택을 Select에서 검색 가능한 Combobox로 변경 - 로그인 계정의 companyCode로 화면 목록 필터링 적용require("../../package.json")이 Docker 컨테이너(/app/src/)에서 모듈을 찾지 못해 서버가 크래시하는 문제를 try-catch로 해결한다. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>- GroupCompleteButton: !isGroupCompleted 조건 제거 → 모든 그룹에서 항상 표시 - 이미 완료된 그룹에서는 "작업완료됨" 완료 표시 렌더링 - isGroupCompleted prop 추가 - GroupTimerHeader: isGroupStarted 상태(진행 중/일시정지)에 완료 버튼 추가 - GlossyButton green variant, onTimerAction("complete") 호출