Commit Graph

88 Commits

Author SHA1 Message Date
SeongHyun Kim bb6e17ec28 refactor(pop-work-detail): 사이드바→탭 전환, KPI 카드, 풋터 액션바 도입
리서치 반영 UX 구조 대폭 변경:
- 좌측 사이드바(220px) → 상단 탭 바(48px)로 전환 (작업 전|작업 중|작업 후|실적)
- 탭마다 진행률 표시 (예: "작업 전 2/5")
- 고정 헤더: 진한 배경(#263238) + 흰색 텍스트로 작업 정보 표시
- KPI 카드 상시 표시: 접수량/작업완료/잔여/불량 (40px bold, 색상 구분)
- 고정 풋터 액션바: 일시정지(황)/불량등록(적)/작업완료(녹) 3버튼
- 작업완료 2단계 확인 (클릭 → "정말 완료?" 확인)
- 배경색 #F5F5F5 (공장 조명 눈부심 방지)
- 체크리스트 행: 좌측 상태 바 (완료=녹, 필수=적, 기본=회)
- ChecklistRowItem 래퍼로 행 전체 터치 영역 + 시각 피드백
- DESIGN 토큰 확장: tab, footer, header, kpi, bg 추가
- COLORS 확장: kpiInput, kpiComplete, kpiRemaining, kpiDefect 추가
- step 모드와 list 모드 모두 탭 구조 안에서 정상 동작
2026-03-25 11:30:54 +09:00
SeongHyun Kim 525237d42d style(pop-work-detail): ISA-101 디자인 토큰 도입 및 크기 수정
- DESIGN 상수 도입 (button, input, stat, section, sidebar, nav, infoBar, defectRow)
- COLORS 상수 도입 (good, defect, complete, warning, info)
- 버튼 높이: 44px → 56px (ISA-101 장갑 터치 기준)
- 핵심 숫자(수량/실적): 18px → 36px (2-3m 가독성)
- 섹션 제목/라벨: 14px → 16px (1m 가독성)
- 입력 필드 높이: 44px → 56px
- 불량 유형 행 높이: 40px → 56px
- 사이드바 너비: 208px → 220px, 항목 패딩 확대
- 기능 변경 없음 (디자인만 수정)
2026-03-25 10:57:29 +09:00
SeongHyun Kim a8bb72050f Merge branch 'feature/fix-4579-customer-name' into ksh-cart-outbound-test 2026-03-24 19:14:42 +09:00
SeongHyun Kim 9afe98ec60 feat: pop-field에 json_extract_lookup valueSource 추가
cart_items.row_data에서 코드값(partner_id)을 추출한 후
참조 테이블(customer_mng)에서 표시값(customer_name)을 조회하는
json_extract_lookup 기능을 추가한다.
화면 4579(출고 확정)에서 거래처명이 표시되지 않는 문제를 해결한다.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 19:14:34 +09:00
SeongHyun Kim 4c113f2b8e feat: pop-cart-outbound 출고 전용 장바구니 카드 컴포넌트 추가
출고(판매/기타/외주) 전용 카드 리스트 컴포넌트를 신규 생성한다.
- 세로형 카드 레이아웃: 헤더 + 스탯 그리드 + 수량 입력 + 담기/취소
- ISA-101 산업 현장 디자인 토큰 (56px 버튼, 36px 숫자)
- useCartSync 훅 연동, 이벤트 버스 filter/collect/save 지원
- 디자이너 설정 패널 3탭 (데이터/카드/장바구니)
- React key prop fallback 패턴 적용 (sf.id || idx)
- PopComponentType, ComponentPalette, PopRenderer 레지스트리 등록
- @playwright/test devDependency 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-24 18:34:05 +09:00
SeongHyun Kim 8ee6d75b3d fix: pop-button showCartBadge 속성으로 장바구니 모드 활성화
cart-save 태스크 없이 배지만 표시하는 경우에도 isCartMode가
활성화되도록 showCartBadge 속성 조건을 추가한다.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-24 18:33:53 +09:00
SeongHyun Kim 7e54940963 fix: 가나다 필터 검색어 입력 시 전체 범위 검색으로 수정
검색어 입력 시 activeFilterTab(초성/알파벳) 필터가 동시 적용되어
검색 결과가 현재 탭 내로 제한되던 문제를 수정한다.
searchText가 있으면 필터 탭을 무시하고 전체 데이터에서 검색한다.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-24 18:33:47 +09:00
SeongHyun Kim b5e48f0b12 fix: PopCardListV2Component nullish coalescing 연산자 괄호 추가
SWC 빌더에서 ?? 와 || 혼용 시 명시적 괄호를 요구하는 문법 에러를 수정한다.
2026-03-23 10:41:57 +09:00
SeongHyun Kim 678e5fa368 Merge branch 'ksh-v2-work' into main
POP MES 전용 카드 + 디자인 감사 + 장바구니 분리 + 체크리스트/실적 관리 기능을 main에 통합한다.
주요 병합 내용:
- mes-process-card 전용 카드 + batch_done 워크플로우 + 실적 관리 강화
- MES 불량 처분 체계(disposition 3종) + 공정 흐름 스트립 필/칩 UI 개편
- MES 다중작업자 분할접수 4대 연쇄 버그 근본 해결
- MES 체크리스트 자동 복사 + 구조적 버그 3건 수정
- MES 카드 산업용 태블릿 UI 리디자인 (10인치 터치 최적화)
- MES 상태 탭 카드 내장 + pop-search 레거시 정리 + 하위 테이블 자동 판단
- pop-card-list-v2 설정 패널 MES 간소화 + 내 작업 표시 3모드
- BLOCK DETAIL Phase 4: 그룹별 타이머, 터치 최적화 UI, DB 저장 버그 수정
- POP 디자인 감사 + WYSIWYG 정렬 + MES/장바구니 분리
- POP 장바구니 입고 워크플로우 수정 및 접근성/UX 개선
- POP 뷰어 헤더 제거 + 디자이너-뷰어 그리드 칸 수 불일치 수정
- PopFieldConfig JsonKeySelect 개선
충돌 해결: 1건 (.gitignore - 양쪽 추가 항목 통합)
2026-03-23 10:31:45 +09:00
SeongHyun Kim da9bce2301 fix: POP 장바구니 입고 워크플로우 수정 및 접근성/UX 개선
장바구니(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로 화면 목록 필터링 적용
2026-03-23 10:26:06 +09:00
SeongHyun Kim 461ff6dbf7 refactor: POP 디자인 감사 + WYSIWYG 정렬 + MES/장바구니 분리 + 장바구니 코드 제거
POP 컴포넌트 전반의 디자인 일관성을 확보하고, 디자이너-뷰어 간 WYSIWYG를
달성하며, MES 공정흐름 컴포넌트에서 장바구니 코드를 완전 분리한다.
[POP 디자인 종합 감사]
- PopRenderer 고스트 보더 제거 (border-2 bg-white -> 투명 래퍼)
- 하드코딩 배경색 -> CSS 변수 hsl(var(--background))
- 빈 상태 메시지 border-dashed bg-muted/30 제거
- 콘텐츠 컴포넌트만 선택적 보더 (rounded-lg border-border/40 bg-card)
[뷰어-디자이너 WYSIWYG 통일]
- PopRenderer 행 높이: 디자이너/뷰어 모두 고정 24px (minmax 제거)
- page.tsx mx-auto + maxWidth 제거 -> 뷰어 전체 폭 채움
- pop-icon 셀 내 스케일링 (maxWidth/maxHeight 100% + aspectRatio)
- pop-icon 라벨 표시 + 배경 투명/아이콘 색상 설정 UI 추가
- pop-profile 반응형, pop-button 오버플로 클리핑
[마키(흐르는 텍스트) 추가]
- pop-text에 marquee 옵션 (marqueeSpeed, marqueeIcon 설정)
- CSS animation + paddingRight 100vw 연속 스크롤
[컴포넌트 이름 명확화]
- pop-card-list-v2: "카드 목록 V2" -> "MES 공정흐름"
- pop-card-list: "카드 목록" -> "장바구니 목록"
[MES 공정흐름에서 장바구니 코드 완전 제거]
- PopCardListV2Component: useCartSync, parseCartRow, isCartListMode,
  selectedKeys, cartRef, cart 이벤트 3개, fetchCartData,
  handleDeleteItem/UpdateQuantity/CartAdd/Cancel/Delete 제거 (~250줄)
- cell-renderers: CartButtonCell, DynamicLucideIcon, ShoppingCart 제거 (~50줄)
- PopCardListV2Config: cart-button 셀 편집 UI 제거
- index.tsx: cart_updated/cart_save_completed/selected_items/
  cart_save_trigger/confirm_trigger 이벤트 메타 제거
- migrate.ts: cartAction/cartListMode 마이그레이션 제거
- types.ts: PopCardListV2Config cartAction/cartListMode 필드,
  CardCellDefinitionV2 cart 4필드, CardCellType "cart-button" 제거
- pop-card-list(장바구니 목록)의 타입/훅은 그대로 유지
- 매 Phase마다 tsc --noEmit 검증, 신규 에러 0건
2026-03-20 16:31:25 +09:00
SeongHyun Kim 73674385be feat: MES 카드 산업용 태블릿 UI 리디자인 (10인치 터치 최적화)
산업현장 10인치 태블릿에서의 가독성과 터치 조작성을 대폭 개선한다.
HTML 시안(pop-design-v2)을 기반으로 기존 기능을 모두 보존하면서 디자인만 변경.
[카드 헤더 재구성]
- 품목명(item_name) 20px bold 강조 (기존: 미표시)
- WO번호+공정명 14px 보조 정보로 전환 (기존: WO번호 13px 주인공)
- 상태 배지 14px rounded-full pill (기존: 10px)
- 재작업 배지 12px (기존: 9px)
- 좌측 컬러바 4px (기존: 3px)
[메트릭 3단 통일 구조]
- 접수가능: 컨텍스트 + 파랑 박스(접수가능 N EA)
- 진행중: 컨텍스트 + 주황 박스(생산 N / N EA) + 칩(양품/불량/잔여)
- 완료: 컨텍스트+수율pill + 초록 박스(최종양품 N EA) + 칩
- 재작업: 컨텍스트 + 주황 박스(재작업 수량 N EA)
- 핵심 수량 36px extrabold, 컨텍스트 14px (기존: 18px/10px)
[카드 높이 일관성]
- 메트릭 영역 flex-1 적용: 같은 행의 카드들이 동일 높이로 정렬
- 공정 흐름/버튼이 항상 카드 하단 고정
[공정 흐름 노드 기반 디자인]
- 텍스트 칩 -> 40x40px 노드 박스 + 라벨 (기존: 10px 칩)
- 커넥터 라인으로 공정 연결 시각화
[액션 버튼 대형화]
- h-14(56px) full-width rounded-xl 17px bold (기존: h-7 28px 11px)
[MES 카드 래퍼 패딩]
- MES 카드 전용 p-1 제거 (카드 내부 충분한 패딩 px-5 보유)
2026-03-20 10:51:26 +09:00
SeongHyun Kim 17fb815513 feat: MES 상태 탭을 카드 컴포넌트에 내장
별도 pop-status-bar 컴포넌트 배치/연결 없이 카드 상단에
MES 고정 상태 탭(전체/대기/접수가능/진행/완료)을 내장한다.
[내장 상태 탭 UI]
- MES_STATUS_TABS 상수: waiting/acceptable/in_progress/completed 고정
- 카드 그리드 상단에 pill 형태 탭 렌더링
- 상태별 카운트 + "전체"는 클론 제외 originalCount 표시
- showStatusTabs && hasProcessFlow 조건부 표시
[자체 카운트/필터]
- statusCounts useMemo: filteredRows 기준 VIRTUAL_SUB_STATUS 집계
- statusFilteredRows useMemo: 선택 탭으로 내부 필터
- displayCards/hasMoreCards/totalPages가 statusFilteredRows 기준으로 동작
- 탭 전환 시 currentPage=1 리셋
[외부 status-bar 하위 호환]
- effectiveExternalFilters: showStatusTabs일 때 _source="status-bar"
  필터 무시 (내장 탭으로 대체, 충돌 방지)
- all_rows 이벤트 발행 유지 (기존 pop-status-bar 연결 안 깨짐)
- rowsForStatusCount: showStatusTabs일 때 filteredRows 직접 반환
[설정 패널]
- 고급 설정에 "상태 탭 내장" Switch 토글 추가
- showStatusTabs?: boolean 타입 추가 (기본 false)
2026-03-19 18:01:57 +09:00
SeongHyun Kim 1d85de8bf6 refactor: pop-search 레거시 정리 + 하위 테이블 자동 판단 + 초기값 프로필 세팅
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개 옵션)
2026-03-19 17:14:22 +09:00
SeongHyun Kim d001f82565 feat: pop-card-list-v2 설정 패널 MES 간소화 + Core Binding + 내 작업 표시 모드
MES 고정 구조에 맞게 설정 패널을 간소화하고, 작업상세 내장 모달과
작업자 기반 카드 필터링 기능을 추가한다.
[설정 패널 간소화]
- 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 고정 토글로 단순화
2026-03-19 16:09:11 +09:00
SeongHyun Kim 5d12bef5e5 fix: MES 체크리스트 자동 복사 + 구조적 버그 3건 수정
분할 접수/재작업 카드 생성 시 체크리스트가 복사되지 않던 문제를 해결하고,
공정 흐름 모달과 카드 클릭 이벤트 격리 버그를 수정한다.
[체크리스트 자동 복사]
- copyChecklistToSplit 공통 헬퍼 함수 추출
  (createWorkProcesses/acceptProcess/saveResult 3곳에서 통합 사용)
- routing_detail_id 존재 시: process_work_item 템플릿에서 복사
- routing_detail_id 부재 시: 마스터 process_work_result에서 구조만 복사
[ChecklistItem 렌더링 수정]
- 레거시 detail_type(inspect_numeric/inspect_ox 등)을 정규화하여
  detail_type=inspect + input_type 자동 파싱으로 InspectRouter 라우팅
- info 타입 렌더러 추가
[공정 흐름 모달 이벤트 격리]
- Dialog 래퍼에 onClick/onPointerDown stopPropagation 추가
  (모달 닫기 시 부모 카드 onClick 전파 차단)
[카드 클릭 진행 탭 제한]
- handleCardSelect에 VIRTUAL_SUB_STATUS 코드 가드 추가
  (in_progress가 아닌 카드는 작업상세 모달 열림 차단)
- 재작업 카드 포함 접수가능 탭에서 상세 진입 방지
2026-03-18 18:26:54 +09:00
SeongHyun Kim 9d164d08af feat: BLOCK MES-HARDEN Phase 0~3 + 공정 흐름 스트립 필/칩 UI 개편
MES 불량 처분 체계(disposition 3종)를 구현하고, 공정 카드의 흐름
스트립을 현재 공정 중심 필/칩 윈도우로 전면 재설계한다.
[Phase 0: 기반 안정화]
- confirmResult: SUM 버그 수정 + 마스터 캐스케이드 완료 판정
- checkAndCompleteWorkInstruction: 헬퍼 함수 추출
  (saveResult/confirmResult 양쪽에서 work_instruction 상태 갱신)
- saveResult: 초과 생산 에러 -> 경고 로그로 변경
[Phase 1: UI 정리]
- DISPOSITION_OPTIONS: 5종 -> 3종(폐기/재작업/특채)
- 카드 수동 완료 버튼: in_progress + 생산 있음 + 미완료 시 표시
  (__manualComplete -> confirmResult 호출)
[Phase 2: 양품 계산 서버화]
- concession_qty/is_rework/rework_source_id DB 컬럼 추가
- saveResult: defect_detail disposition별 서버 양품 계산
  (addGood = addProduction - addDefect, addConcession 분리)
- prevGoodQty 5곳: SUM(good_qty) + SUM(concession_qty) 통일
- 프론트 특채 표시: MesInProgressMetrics/MesCompletedMetrics
[Phase 3: 재작업 카드]
- saveResult: disposition=rework 시 동일 공정에 분할행 자동 INSERT
  (is_rework='Y', rework_source_id 연결, status='acceptable')
- 프론트: amber "재작업" 배지 + MesAcceptableMetrics 재작업 전용 UI
- 재작업 카드 접수가능 수량 버그 수정 (마스터 qty -> input_qty)
[공정 흐름 스트립 UI 개편]
- ProcessFlowStrip: 바 형태 -> 필/칩 5슬롯 윈도우
  (+N/이전/현재/다음/+N, 현재 공정 항상 중앙)
- 색상: 지나온=emerald(완료)/slate, 현재=primary,
  완료=emerald, 대기=muted, 남은=amber
2026-03-18 16:38:22 +09:00
SeongHyun Kim fba5390f5a fix: MES 다중작업자 분할접수 4대 연쇄 버그 근본 해결
분할 카드 접수량 오표시(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 에러 반환
2026-03-18 13:57:14 +09:00
SeongHyun Kim 20fbe85c74 feat: BLOCK MES-REWORK - mes-process-card 전용 카드 + batch_done 워크플로우 + 실적 관리 강화
MES 카드를 CSS Grid 다중 셀 방식에서 Flexbox 기반 단일 전용 카드(mes-process-card)로
전환하고, batch_done 상태를 도입하여 부분 확정 후 추가접수 워크플로우를 구현한다.
[mes-process-card 전용 카드]
- CardCellType "mes-process-card" 신규: 상태별 좌측 보더+배경, 공정 흐름 스트립, 클릭 모달
- MesAcceptableMetrics / MesInProgressMetrics / MesCompletedMetrics 서브 컴포넌트
- 워크플로우 기반 activeBtn 결정 로직 (상태+잔여량 조합으로 버튼 1개만 표시)
- 하드코딩 취소 버튼 제거, DB 설정 "접수취소" 라벨 인터셉트로 통합
[batch_done 워크플로우]
- confirmResult API: 부분 확정 시 status = 'batch_done' (진행 탭 숨김 + 접수가능 탭 유지)
- acceptProcess API: batch_done -> in_progress 복귀 (추가접수)
- 카드 복제 로직에 batch_done 포함 (잔여량 있으면 접수가능 탭에 클론 카드)
- status 매핑에 batch_done 추가 (semantic: active)
[실적 관리 강화]
- PopWorkDetailComponent: 실적 입력 UI 전면 구현 (차수별 등록, 누적 실적, 이력 표시)
- 모든 실적 저장 시 process_completed 이벤트 발행 (카드 리스트 즉시 갱신)
- 전량접수+전량생산 시 자동 완료 (status=completed, result_status=confirmed)
[버그 수정]
- 서브 필터 변경 시 __process_* 필드 미갱신 -> processFields 재주입
- cancelAccept SQL inconsistent types -> boolean 파라미터 분리
- 접수취소 라벨 매핑 누락 -> taskPreset 조건 확장
2026-03-17 21:36:43 +09:00
kjs ae4fe7a66e chore: update .gitignore and remove quick insert options from button configurations
- Added new entries to .gitignore for multi-agent MCP task queue and related rules.
- Removed "즉시 저장" (quick insert) options from the ScreenSettingModal and BasicTab components to streamline button configurations.
- Cleaned up unused event options in the V2ButtonConfigPanel to enhance clarity and maintainability.

These changes aim to improve project organization and simplify the user interface by eliminating redundant options.
2026-03-17 17:37:40 +09:00
SeongHyun Kim 06c52b422f feat: BLOCK DETAIL Phase 4 + 안정화 - 그룹별 타이머, 터치 최적화 UI, DB 저장 버그 수정
pop-work-detail 컴포넌트에 그룹별 타이머 시스템과 터치 최적화 UI를 추가하고,
체크리스트 결과가 DB에 저장되지 않던 버그를 수정하여 안정화를 완료한다.
[그룹별 타이머]
- group-timer API 신규: start/pause/resume/complete 액션 (popProductionController)
- process_work_result에 group_started_at/paused_at/total_paused_time/completed_at 활용
- GroupTimerHeader UI: 순수 작업시간 + 경과시간 이중 표시
- 첫 그룹 "시작" 시 work_order_process.started_at 자동 기록 (공정 시작 자동 감지)
- 공정 완료 시 actual_work_time을 그룹 타이머 합산으로 백엔드 자동 계산
[터치 최적화 UI]
- 12개 영역 전면 스케일업: 버튼 h-11~h-12, 입력 h-11, 체크박스 h-6 w-6
- 사이드바 w-[180px], InfoBar text-sm, 최소 터치 영역 40~44px 확보
- 산업 현장 태블릿 터치 사용 최적화
[DB 저장 버그 수정]
- saveResultValue/handleQuantityRegister: execute-action task 형식 수정
  (fixedValue + lookupMode:"manual" + manualItemField/manualPkColumn:"id")
- 원인: 백엔드가 __cart_row_key를 찾는데 프론트에서 id만 전송하여 lookup 실패
[디자이너 설정 확장]
- displayMode: list/step 전환 설정 추가
- PopWorkDetailConfig: 표시 모드 Select 드롭다운
- types.ts: PopWorkDetailConfig 인터페이스 displayMode 추가
- PopCardListV2Component: parentRow.__processFlow__ 전달 보강
2026-03-17 09:32:59 +09:00
SeongHyun Kim 230d35b03a fix: PopFieldConfig JsonKeySelect - 데이터 없을 때도 Combobox UI 유지
테이블에 데이터가 0건일 때 JsonKeySelect가 plain Input으로 폴백되어
설계 단계에서 Select 박스가 표시되지 않는 문제를 수정한다.
[JsonKeySelect 개선]
- 항상 Combobox(Popover + Command) UI로 렌더링
- keys 있을 때: 기존과 동일한 자동완성 목록 + 검색
- keys 없을 때: "테이블에 데이터가 없습니다" 안내 + Enter로 직접 입력 확정
- 검색 결과 없을 때도 Enter로 자유 입력 가능
[updateSaveMapping 경합 조건 수정]
- onUpdateConfig 두 번 연속 호출 시 React batching으로 첫 번째 호출이
  덮어쓰여지는 문제 수정
- syncAndUpdateSaveMappings에 extraPartial 파라미터 추가하여
  한 번의 onUpdateConfig 호출로 병합
2026-03-16 16:24:27 +09:00
SeongHyun Kim 3bd0eff82e feat: BLOCK DETAIL Phase 3 - pop-work-detail 컴포넌트 + 모달 캔버스 시스템
세부진행화면(4502)의 프론트엔드 구현: pop-work-detail 컴포넌트 신규 생성과
디자이너 모달 캔버스 편집을 통해, 카드 클릭 시 공정별 체크리스트/검사/실적 상세
작업 화면을 내부 모달로 표시할 수 있게 한다.
[신규] pop-work-detail 컴포넌트 (4파일)
- PopWorkDetailComponent: parentRow → 현재 공정 추출 → process_work_result 조회,
  좌측 사이드바(PRE/IN/POST 3단계 작업항목 그룹) + 우측 체크리스트(5종: check/inspect/
  input/procedure/material) + 타이머 제어(start/pause/resume) + 수량 등록 + 공정 완료
- PopWorkDetailConfig: showTimer/showQuantityInput/phaseLabels 설정 패널
- PopWorkDetailPreview: 디자이너 프리뷰
- index.tsx: PopComponentRegistry 등록 (category: display, touchOptimized)
[모달 캔버스 시스템] PopDesigner.tsx 대규모 리팩토링
- handleMoveComponent/handleResizeComponent/handleRequestResize:
  layout 직접 참조 → setLayout(prev => ...) 함수형 업데이트로 전환
  + activeCanvasId 분기: main이면 기존 로직, modal-*이면 modals 배열 내 해당 모달 수정
- PopCardListV2Config: 모달 캔버스 생성/열기 버튼 (usePopDesignerContext 연동)
- PopCardListV2Component: modal-* screenId → setSharedData + __pop_modal_open__ 이벤트
- PopViewerWithModals: parentRow prop + fullscreen 모달 지원 + flex 레이아웃
[기타]
- ComponentPalette: pop-work-detail 팔레트 항목 + ClipboardCheck 아이콘
- pop-layout.ts: PopComponentType에 pop-work-detail 추가, 기본 크기 38x26
- PopRenderer: COMPONENT_TYPE_LABELS에 pop-work-detail 추가
- types.ts: PopWorkDetailConfig 인터페이스
- PopCanvas.tsx: activeLayout.components 참조 수정 (모달 캔버스 호환)
DB 변경 0건. 백엔드 변경 0건.
2026-03-16 10:32:58 +09:00
SeongHyun Kim ed0f3393f6 Merge branch 'ksh-v2-work' into ksh-partial-quantity-flow
ksh-v2-work의 최신 변경사항을 동기화한다.
주요 병합 내용:
- GRID-V6 정사각형 블록 그리드 시스템 (842ac27d)
- POP 그리드 시스템 명칭 통일 + Dead Code 제거 (320100c4)
- 다수 PC 화면 config-panel 리팩토링 (jskim/mhkim/gbpark)
- V2 컴포넌트 config-panel 신규 18종
- 감사 로그 기능 강화
충돌 해결: 0건 (자동 병합 완료)
2026-03-13 16:58:58 +09:00
SeongHyun Kim 320100c4e2 refactor: POP 그리드 시스템 명칭 통일 + Dead Code 제거
V5→V6 전환 과정에서 누적된 버전 접미사, 미사용 함수, 레거시 잔재를
정리하여 코드 관리성을 확보한다. 14개 파일 수정, 365줄 순감.
[타입 리네이밍] (14개 파일)
- PopLayoutDataV5 → PopLayoutData
- PopComponentDefinitionV5 → PopComponentDefinition
- PopGlobalSettingsV5 → PopGlobalSettings
- PopModeOverrideV5 → PopModeOverride
- createEmptyPopLayoutV5 → createEmptyLayout
- isV5Layout → isPopLayout
- addComponentToV5Layout → addComponentToLayout
- createComponentDefinitionV5 → createComponentDefinition
- 구 이름은 deprecated 별칭으로 유지 (하위 호환)
[Dead Code 삭제] (gridUtils.ts -350줄)
- getAdjustedBreakpoint, convertPositionToMode, isOutOfBounds,
  mouseToGridPosition, gridToPixelPosition, isValidPosition,
  clampPosition, autoLayoutComponents (전부 외부 사용 0건)
- needsReview + ReviewPanel/ReviewItem (항상 false, 미사용)
- getEffectiveComponentPosition export → 내부 함수로 전환
[레거시 로더 분리] (신규 legacyLoader.ts)
- convertV5LayoutToV6 → loadLegacyLayout (legacyLoader.ts)
- V5 변환 상수/함수를 gridUtils에서 분리
[주석 정리]
- "v5 그리드" → "POP 블록 그리드"
- "하위 호환용" → "뷰포트 프리셋" / "레이아웃 설정용"
- 파일 헤더, 섹션 구분, 함수 JSDoc 정리
기능 변경 0건. DB 변경 0건. 백엔드 변경 0건.
2026-03-13 16:39:51 +09:00
SeongHyun Kim 842ac27d60 feat: V6 정사각형 블록 그리드 시스템 실험 구현
고정 칸 수(4/6/8/12) 기반의 V5 그리드를 24px 정사각형 블록 기반의
동적 칸 수 시스템으로 교체한다. 뷰포트 너비에 따라 블록 수가 자동
계산되며(375px=13칸, 1024px=38칸), 작은 화면에서는 행 그룹 리플로우
(CSS Flexbox wrap 원리)로 자동 재배치된다.
[그리드 코어]
- pop-layout.ts: BLOCK_SIZE=24, BLOCK_GAP=2, BLOCK_PADDING=8,
  getBlockColumns() 동적 칸 수 계산, GRID_BREAKPOINTS V6 값
- gridUtils.ts: 행 그룹 리플로우(방식 F) - 같은 행 묶음 처리,
  최소 2x2칸 터치 보장, 메인 컨텐츠 전체 너비 확장
- PopRenderer.tsx: repeat(N, 1fr) 블록 렌더링, 동적 칸 수
- PopCanvas.tsx: 뷰포트 프리셋 동적 칸 수, 블록 좌표 변환
[V5→V6 런타임 변환]
- convertV5LayoutToV6: DB 미수정, 로드 시 메모리 변환
  12칸 좌표 → 38칸 블록 변환, V5 overrides 제거
- PopDesigner/page.tsx: 로드 지점에 변환 함수 삽입
[충돌 해결]
- ComponentEditorPanel: 높이 표시/모드 라벨 V6 수치
- PopCardListConfig: 카드 추천 threshold V6 기준
- PopDesigner: handleHideComponent 기본 모드 제한 해제
[기본 사이즈]
- 소형(2x2): 아이콘, 프로필, 스캐너
- 중형(8x4): 검색, 버튼, 텍스트
- 대형(19x6~10): 카드, 대시보드, 필드
DB 변경 0건, 백엔드 변경 0건, 컴포넌트 코드 변경 0건.
2026-03-13 16:03:24 +09:00
SeongHyun Kim c4d7b16538 fix: LOCK-OWNER 카드 비활성화 UI 누락분 반영
a2c532c7 커밋에서 누락된 CardV2 잠금 UI를 반영한다.
- locked 계산: ownerSortColumn 값이 존재하고 현재 사용자와 불일치 시 true
- isLockedByOther prop을 CardV2에 전달
- 잠금 카드: opacity-50, cursor-not-allowed, onClick/onKeyDown 차단, tabIndex=-1
2026-03-13 14:23:26 +09:00
SeongHyun Kim a2c532c7c7 feat: 낙관적 잠금 + 소유자 기반 액션 제어 + 디자이너 설정 UI
동시 접수 충돌 방지(preCondition WHERE + 409 에러), 소유자 일치 시에만
버튼 활성화(owner-match showCondition), 본인 카드 우선 정렬(ownerSortColumn)을
구현하고 디자이너에서 설정할 수 있는 UI 3종을 추가한다.
[백엔드]
- popActionRoutes: TaskBody에 preCondition 추가, data-update WHERE 조건 삽입,
  rowCount=0 시 409 Conflict 반환 (isPreConditionFail)
[프론트엔드 - 런타임]
- types.ts: ActionPreCondition 인터페이스, owner-match 타입, ownerSortColumn 필드
- cell-renderers: evaluateShowCondition에 owner-match 분기 + currentUserId prop
- PopCardListV2Component: useAuth 연동, preCondition 전달/409 처리,
  ownerSortColumn 기반 카드 정렬, currentUserId 하위 전달
[프론트엔드 - 디자이너 설정 UI]
- PopCardListV2Config: showCondition 드롭다운에 "소유자 일치" 옵션 + 컬럼 선택,
  ImmediateActionEditor에 "사전 조건(중복 방지)" 토글 + 검증 컬럼/기대값/실패 메시지,
  TabActions에 "소유자 우선 정렬" 컬럼 드롭다운
2026-03-12 18:26:47 +09:00
SeongHyun Kim 55063367ea Merge branch 'ksh-v2-work' into main
ksh-v2-work의 POP 화면 디자이너 기능을 main에 병합한다.
[병합 내용]
- pop-card-list-v2: 슬롯 기반 CSS Grid 카드 컴포넌트 (12종 셀 타입)
- pop-status-bar: 독립 상태 칩 컴포넌트 (카운트 순환 문제 해결)
- pop-scanner: 바코드/QR 스캐너 + 멀티필드 파싱
- pop-profile: 사용자 프로필/PC전환/로그아웃 컴포넌트
- pop-button: 설정 패널 UX 전면 개선 + 제어 실행 기능
- pop-search: 날짜 입력 타입 + 연결 탭 일관성 통합
- POP 모드 네비게이션: PC <-> POP 양방향 전환 + 로그인 POP 모드 토글
- 타임라인 범용화 + 상태 값 매핑 동적 배열 전환
- 다중 액션 체이닝 + 외부 테이블 선택 + 카드 클릭 모달
[충돌 해결 4건]
- authController.ts: 양쪽 통합 (스마트공장 로그 + POP 랜딩 경로)
- AppLayout.tsx: 양쪽 통합 (메뉴 드래그 + POP 모드 메뉴, 리디자인 UI + POP 모드 항목)
- ConnectionEditor.tsx: ksh-v2-work 선택 (하위 테이블 필터 구조) + CSS 변수 적용
- pop-button.tsx: ksh-v2-work 선택 (자연어 UX + 제어 실행) + CSS 변수 스타일 유지
2026-03-12 09:00:52 +09:00
SeongHyun Kim e1188027ed feat(pop): 다중 액션 체이닝 + 외부 테이블 선택 + 카드 클릭 모달 + 필터 전 비표시
버튼 규칙 하나에 여러 액션을 순차 실행하는 다중 액션 체이닝,
DB 직접 선택으로 외부 테이블에 값을 변경하는 기능,
카드 클릭 시 조건부 모달 열기, 필터 전 데이터 비표시 옵션을 추가한다.
[다중 액션 체이닝]
- types.ts: ActionButtonDef.clickActions 배열 추가 (하위호환 유지)
- PopCardListV2Config: 액션 목록 UI (추가/삭제/순서)
- cell-renderers: __allActions 배열로 config 전달
- PopCardListV2Component: actionsToRun 순차 실행, 실패 시 스킵
[외부 테이블 선택]
- ActionButtonClickAction.joinConfig (sourceColumn, targetColumn) 추가
- ImmediateActionEditor: "DB에서 직접 선택..." 옵션 + 조인키 설정 UI
- DbTableCombobox: 테이블명(영어)+설명(한글) 검색 가능
- Component: joinConfig 기반 lookupValue/lookupColumn 처리
[카드 클릭 모달]
- types.ts: V2CardClickAction에 "modal-open", V2CardClickModalConfig 추가
- PopCardListV2Config: 동작 탭에 모달 설정 (화면 ID, 조건, 제목)
- PopCardListV2Component: handleCardSelect 조건 체크 후 openPopModal
[필터 전 데이터 비표시]
- PopCardListV2Config.hideUntilFiltered Switch
- Component: externalFilters 없을 때 안내 메시지
[버그 수정]
- availableTableOptions: dataSource.table -> dataSource.tableName 수정
- popActionRoutes: INSERT 시 created_date/updated_date/writer 자동 추가,
  UPDATE 시 updated_date 자동 갱신
[액션 버튼 구조 개선]
- evaluateShowCondition: 버튼별 조건 평가 (visible/disabled/hidden)
- ActionButtonsEditor: 아코디언 UI + sessionStorage 상태 유지
- 1셀 1버튼 렌더링: 조건 맞는 버튼 1개만 표시
2026-03-11 18:20:02 +09:00
SeongHyun Kim c7b8acbac3 refactor(pop): status-chip을 pop-status-bar 독립 컴포넌트로 분리 + 카운트 순환 문제 수정
pop-search에 내장되어 있던 status-chip 기능을 pop-status-bar라는
독립 컴포넌트로 분리하여 재사용성과 설정 유연성을 높인다.
상태 칩 클릭 시 카운트가 왜곡되던 순환 의존 문제를 해결한다.
[pop-status-bar 신규 컴포넌트]
- types.ts: StatusBarConfig, StatusChipOption, hiddenMessage 등 타입 정의
- PopStatusBarComponent: all_rows 구독 + 카운트 집계 + filter_value 발행
  _source: "status-bar" 마커로 자신의 필터를 식별
  hideUntilSubFilter: 하위 필터 선택 전 칩 숨김 + 설정 가능 안내 문구
- PopStatusBarConfig: 설정 패널 (DB 자동 채우기, 고유값 클릭 추가,
  숨김 문구 설정, 하위 필터 가상 컬럼 안내)
- index.tsx: 레지스트리 등록, connectionMeta(filter_value/all_rows/set_value)
[카운트 순환 문제 수정]
- PopCardListV2Component: externalFilters에 _source 필드 저장
  all_rows 발행 시 status-bar 소스 필터를 제외한 rowsForStatusCount 계산
  상태 칩 클릭해도 전체 카운트가 유지됨
[pop-search에서 status-chip 제거]
- PopSearchComponent: StatusChipInput, allRows 구독, autoSubStatusColumn 제거
- PopSearchConfig: StatusChipDetailSettings 제거, 분리 안내 메시지로 대체
- index.tsx: receivable에서 all_rows 제거
- types.ts: StatusChipStyle, StatusChipConfig에 @deprecated 주석 추가
[설정 UX 개선]
- "전체 칩 자동 추가" → "전체 보기 칩 표시" + 설명 문구 추가
- hiddenMessage: 숨김 상태 안내 문구 설정 가능 (하드코딩 제거)
- useSubCount 활성 시 가상 컬럼 안내 경고 표시
2026-03-11 16:35:49 +09:00
kjs 5a8c6df550 Merge branch 'gbpark-node' of http://39.117.244.52:3000/kjs/ERP-node into jskim-node 2026-03-11 12:23:52 +09:00
SeongHyun Kim 12ccb85308 feat(pop): 공정 상태 자동 계산 + 하위 필터 연동 + 타임라인 연동 상태배지
공정 필터 선택 시 상태 뱃지/카운트/버튼이 공정 상태 기준으로 동작하도록
파생 상태 자동 계산, 하위 필터 __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 패턴으로 통일
2026-03-11 12:07:11 +09:00
SeongHyun Kim c17dd86859 feat(pop): pop-search status-chip 입력 타입 추가 + all_rows 이벤트 연동
pop-search 컴포넌트에 status-chip 입력 타입을 추가하여 연결된 카드의
전체 데이터를 구독하고 상태별 건수를 집계/표시한다. 칩 클릭 시
filter_value를 발행하여 카드 목록을 필터링한다.
[status-chip 입력 타입]
- types.ts: StatusChipStyle, StatusChipConfig, STATUS_CHIP_STYLE_LABELS
- PopSearchComponent: StatusChipInput 컴포넌트 (allRows 구독 + 건수 집계)
- PopSearchConfig: StatusChipDetailSettings 설정 패널 (칩 옵션/스타일)
- index.tsx: receivable에 all_rows 이벤트 등록
[all_rows 이벤트]
- pop-card-list-v2: 데이터 로드 시 all_rows publish + sendable 등록
- pop-card-list: 데이터 로드 시 all_rows publish + sendable 등록
- useConnectionResolver: all_rows 타입 자동 매칭 로직 추가
[pop-card-list-v2 개선]
- 하위 테이블 필터 적용 시 __subStatus__ 가상 컬럼 주입
- externalFilters에 하위 테이블 조건 분리 처리
2026-03-10 18:51:22 +09:00
SeongHyun Kim ed3707a681 refactor(pop): 타임라인 라벨 범용화 + 상태 값 매핑 동적 배열 전환
설정 패널의 도메인 특화 라벨("공정")을 범용 라벨("하위 데이터/표시명")로
교체하고, 상태 값 매핑을 고정 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 기반으로 전환
2026-03-10 17:33:25 +09:00
SeongHyun Kim 599b5a4426 feat(pop): pop-card-list-v2 슬롯 기반 카드 컴포넌트 신규 + 타임라인 범용화 + 액션 인라인 설정
CSS Grid 기반 슬롯 구조의 pop-card-list-v2 컴포넌트를 추가한다.
기존 pop-card-list의 데이터 로딩/필터링/장바구니 로직을 재활용하되,
카드 내부는 12종 셀 타입(text/field/image/badge/button/number-input/
cart-button/package-summary/status-badge/timeline/action-buttons/
footer-status)의 조합으로 자유롭게 구성할 수 있다.
[신규 컴포넌트: pop-card-list-v2]
- PopCardListV2Component: 런타임 렌더링 (데이터 조회 + CSS Grid 카드)
- PopCardListV2Config: 3탭 설정 패널 (데이터/카드 디자인/동작)
- PopCardListV2Preview: 디자이너 미리보기
- cell-renderers: 셀 타입별 독립 렌더러 12종
- migrate: v1 -> v2 설정 마이그레이션 함수
- index: PopComponentRegistry 자동 등록
[타임라인 데이터 소스 범용화]
- TimelineDataSource 인터페이스로 공정 테이블/FK/컬럼/상태값 매핑 설정
- 하드코딩(work_orders+work_order_process) 제거 -> 설정 기반 동적 조회
- injectProcessFlow: 설정 기반 공정 데이터 조회 + __processFlow__ 가상 컬럼 주입
- 상태값 정규화(DB값 -> waiting/accepted/in_progress/completed)
[액션 버튼 인라인 설정]
- actionRules 내 updates 배열로 동작 정의 (별도 DB 테이블 불필요)
- execute-action API 재활용 (targetTable/column/valueType)
- 백엔드 __CURRENT_USER__/__CURRENT_TIME__ 특수값 치환
[디자이너 통합]
- PopComponentType에 "pop-card-list-v2" 추가
- ComponentEditorPanel/ComponentPalette/PopRenderer 등록
- PopDesigner loadLayout: components 존재 확인 null 체크 추가
[기타]
- .gitignore: .gradle/ 추가
2026-03-10 16:56:14 +09:00
DDD1542 fa6f76bff1 feat: add next-themes package and update styles
- Added `next-themes` package for theme management.
- Updated various components to use `hsl(var(--foreground))` for color consistency.
- Changed background colors from `bg-white` to `bg-card` in multiple components for better theming support.

Made-with: Cursor
2026-03-10 15:24:05 +09:00
SeongHyun Kim 712f81f6cb Merge branch 'ksh-function-stabilization' into ksh-v2-work
ksh-function-stabilization의 9개 커밋을 ksh-v2-work에 병합한다.
[병합 내용]
- BLOCK O: pop-search 연결 탭 일관성 통합
- BLOCK P: 날짜 입력 타입 구현 + 셀 반응형 레이아웃
- pop-button 설정 패널 UX/UI 전면 개선
- 일괄 채번 + 모달 distinct + 선택 해제
- pop-scanner 바코드/QR 스캐너 컴포넌트
- pop-button 제어 실행 + 연결 데이터 UX
- BLOCK R: PC <-> POP 네비게이션 + Landing
- pop-profile 컴포넌트 (10번째 POP 컴포넌트)
- BLOCK S: 로그인 POP 모드 토글
[충돌 해결 3건 - 모두 양쪽 통합]
- UserDropdown.tsx: HEAD 결재함 + source POP 모드 메뉴 통합
- AppLayout.tsx: HEAD 결재함 + source POP 모드 메뉴 (모바일+사이드바 2곳)
- MenuFormModal.tsx: HEAD menuIcon 필드 + source 주석 제거 통합
2026-03-09 15:36:53 +09:00
DDD1542 4f10b5e42d refactor: 전체 프론트엔드 하드코딩 색상 → CSS 변수 일괄 치환
447+ 파일, 4500+ 줄 변경:
- gray-* → border/bg-muted/text-foreground/text-muted-foreground
- blue-* → primary/ring
- red-* → destructive
- green-* → emerald (일관성)
- indigo-* → primary
- yellow/orange → amber (통일)
- dark mode 변형도 시맨틱 토큰으로 변환

Made-with: Cursor
2026-03-09 14:31:59 +09:00
SeongHyun Kim 4176fed07f feat(pop): pop-profile 컴포넌트 추가 - 사용자 프로필/PC전환/로그아웃
디자이너 팔레트에서 배치 가능한 10번째 POP 컴포넌트로 pop-profile을
추가한다. 화면 설계자가 필요한 화면에만 프로필 기능을 배치할 수 있도록
시스템 UI가 아닌 컴포넌트 등록 방식으로 구현한다.
[뷰어 컴포넌트]
- useAuth() 연동으로 실제 로그인 사용자 정보 표시
- Popover 드롭다운: 사용자 정보 + POP 대시보드 / PC 모드 / 로그아웃
- 비로그인 시 로그인 버튼 표시
- 아바타: 사용자 사진 또는 이름 이니셜 표시
[설정 패널]
- 아바타 크기 선택 (sm 32px / md 40px / lg 48px)
- 메뉴 항목 개별 on/off (대시보드 이동 / PC 모드 전환 / 로그아웃)
[디자이너 통합]
- PopComponentType에 "pop-profile" 추가
- DEFAULT_COMPONENT_GRID_SIZE: 1x1
- PALETTE_ITEMS: UserCircle 아이콘 + 설명
- COMPONENT_TYPE_LABELS: "프로필"
- PopComponentRegistry 등록 (category: action)
2026-03-09 13:21:18 +09:00
SeongHyun Kim 62e11127a7 feat(pop-button): 제어 실행 기능 추가 + 연결 데이터 UX 개선 + 필터 UI 개선
POP 버튼 컴포넌트에서 백엔드 제어관리(node_flows)를 직접 실행할 수
있도록 "제어 실행" 작업 유형을 추가하고, 데이터 수정 시 연결된
컴포넌트 기반으로 필드를 선택하는 UX로 개선한다.
[제어 실행 (custom-event 확장)]
- ButtonTask에 flowId/flowName 필드 추가
- ControlFlowTaskForm: Combobox(Popover+Command)로 검색/선택 UI
- executePopAction: flowId 기반 POST /dataflow/node-flows/:flowId/execute
- 기존 eventName 발행 메커니즘은 폴백으로 유지
[연결 데이터 UX 개선]
- extractCardFields -> extractConnectedFields 리팩토링
  (connections 기반 연결 컴포넌트에서만 필드 추출)
- pop-card-list/pop-field/pop-search 타입별 필드 추출 로직
- 시스템 필드(__cart_quantity 등)에 한글 라벨 부여
- UI 라벨: "화면 데이터" -> "연결된 데이터"
[pop-card-list 필터 UI]
- 필터 조건 레이아웃을 가로 -> 세로 스택으로 변경
- 조건 번호 표시 + 입력 필드 높이 확대
[버그 수정]
- apiClient baseURL 이중 /api 경로 수정
- 응답 필드명 camelCase 통일
2026-03-07 09:56:58 +09:00
SeongHyun Kim 20ad1d6829 feat(pop-scanner): 바코드/QR 스캐너 컴포넌트 + 멀티필드 파싱 + 반자동 매핑
모바일/태블릿 환경에서 바코드·QR을 카메라로 스캔하여 검색·입력 필드에
값을 자동 전달하는 pop-scanner 컴포넌트를 추가하고, JSON 형태의
멀티필드 데이터를 여러 컴포넌트에 분배하는 파싱 체계를 구현한다.
[pop-scanner 신규]
- 카메라 스캔 UI (BarcodeScanModal) + 아이콘 전용 버튼
- parseMode 3모드: none(단일값), auto(전역 자동매칭), json(반자동 매핑)
- auto: scan_auto_fill 전역 이벤트로 fieldName 기준 자동 입력
- json: 연결된 컴포넌트 필드를 체크박스 목록으로 표시,
  fieldName==JSON키 자동 매칭 + 관리자 override(enabled/sourceKey)
- getDynamicConnectionMeta로 parseMode별 sendable 동적 생성
[pop-field 연동]
- scan_auto_fill 구독: sections.fields의 fieldName과 JSON 키 매칭
- columnMapping 키를 fieldName 기준으로 통일 (fieldId→fieldName)
- targetColumn 선택 시 fieldName 자동 동기화
- 새 필드 fieldName 기본값을 빈 문자열로 변경
[pop-search 연동]
- scan_auto_fill 구독: filterColumns 전체 키 매칭
- set_value 수신 시 모달 타입이면 modalDisplayText도 갱신
[BarcodeScanModal 개선]
- 모달 열릴 때 상태 리셋 (scannedCode/error/isScanning)
- "다시 스캔" 버튼 추가
- 스캔 가이드 영역 확대 (h-3/5 w-4/5)
[getConnectedFields 필드 추출]
- filterColumns(복수) > modalConfig.valueField > fieldName 우선순위
- pop-field sections.fields[].fieldName 추출
2026-03-06 19:52:18 +09:00
SeongHyun Kim 955da6ae87 feat(pop): 일괄 채번 + 모달 distinct 중복 제거 + 선택 해제 기능
장바구니에서 여러 품목을 한꺼번에 입고 확정할 때 동일한 입고번호를
공유하도록 일괄 채번(shareAcrossItems) 기능을 추가하고, 입고 목록
화면에서 모달 검색 시 중복 항목을 제거하는 distinct 옵션과 선택된
필터를 해제하는 X 버튼을 구현한다.
[일괄 채번]
- pop-field 자동생성 설정에 shareAcrossItems 스위치 추가
- 백엔드 data-save / inbound-confirm: shareAcrossItems=true 매핑은
  아이템 루프 전 1회만 allocateCode 호출하여 공유 코드 발급
- PopFieldComponent에서 shareAcrossItems 값을 백엔드로 전달
[모달 distinct]
- ModalSelectConfig에 distinct?: boolean 필드 추가
- 설정 패널 필터 탭 영역에 "중복 제거" 체크박스 배치
- ModalDialog fetchData에서 displayField 기준 Set 필터링
[선택 해제]
- ModalSearchInput: 값 선택 시 > 아이콘 -> X 버튼으로 전환
- X 클릭 시 modalDisplayText + 필터값 초기화 (stopPropagation)
- handleModalClear 콜백 + onModalClear prop 체인 연결
2026-03-06 15:59:40 +09:00
SeongHyun Kim 516517eb34 feat(pop-button): 설정 패널 UX/UI 전면 개선 - 비개발자 친화적 설정 경험
화면 디자이너(비개발자)가 버튼 작업 설정을 직관적으로 할 수 있도록
설정 패널의 용어, 레이아웃, 구조를 전면 개선한다.
[디자인 통일]
- Input/Select 높이 h-8, 라벨 text-xs font-medium, 도움말 text-[11px]로 통일
- db-conditional UI를 가로 나열에서 세로 스택으로 전환 (좁은 패널 잘림 방지)
- 작업 항목 간 간격, 패딩, 둥근 모서리 일관성 확보
[자연어 라벨]
- "대상 테이블" → "어떤 테이블을 수정할까요?"
- "변경 컬럼" → "어떤 항목(컬럼)을 바꿀까요?"
- "연산" → "어떻게 바꿀까요?" + 각 연산별 설명 도움말
- "값 출처: 고정값" → "직접 입력", "연결 데이터" → "화면 데이터에서 가져오기"
- 비교 연산자에 한글 설명 추가 (">=" → ">= (이상이면)")
[구조 개선]
- "조회 키"를 "고급 설정" 토글로 숨김 (기본 접힘, 대부분 자동 매칭)
- "연결 필드명" 수동 입력 → 카드 컴포넌트 필드 목록에서 Select 선택
- 접힌 헤더에 요약 텍스트 표시 + 마우스 호버 시 전체 툴팁
- 펼친 상태 하단에 설정 요약 미리보기
[컬럼 코멘트 표시]
- 백엔드: getTableSchema SQL에 col_description() 추가
- 프론트: ColumnCombobox에서 코멘트 표시 + 한글명 검색 지원
- ColumnInfo 인터페이스에 comment 필드 추가
2026-03-06 14:06:53 +09:00
SeongHyun Kim 297b14d706 feat(pop-search): 날짜 입력 타입 구현 + 셀 반응형 레이아웃 개선
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
2026-03-06 12:22:23 +09:00
SeongHyun Kim 47384e1c2b feat(pop-search): 연결 탭 일관성 통합 + 필터 설정을 상세설정으로 이동
검색 컴포넌트의 연결 탭이 다른 컴포넌트(입력, 카드리스트)와 달리
필터 설정이 연결 폼에 포함되어 있던 비일관성을 해결한다.
- 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 자동 추론
2026-03-06 11:00:31 +09:00
SeongHyun Kim a81cb7ca19 Merge branch 'ksh-v2-work' 2026-03-05 19:04:54 +09:00
SeongHyun Kim 12a8290873 feat(pop): 설정 패널 아코디언 접기/펼치기 일관성 + sessionStorage 상태 기억
설정 패널을 열 때 섹션이 일부는 펼쳐져 있고 일부는 접혀 있어
일관성이 없던 UX를 개선하고, 사용자가 펼친 섹션을 탭 세션 내에서 기억한다.
- useCollapsibleSections 커스텀 훅 생성 (sessionStorage 기반, 초기 모두 접힘)
- PopCardListConfig: CollapsibleSection에 sectionKey/sections prop 패턴 적용
- PopFieldConfig: SaveTabContent 5개 고정 섹션 훅 적용,
  SectionEditor 초기값 접힘으로 변경
- PopDashboardConfig: PageEditor 초기값 접힘으로 변경
2026-03-05 18:54:29 +09:00
SeongHyun Kim 7a9a705f19 feat(pop-card-list): 포장 요약 바 UI + 카드 레이아웃 flex column 개선
포장 입력 완료 시 카드 하단에 포장 내역 요약을 표시하여
디자이너가 포장 계산 결과를 즉시 확인할 수 있도록 한다.
- 카드 하단에 포장 요약 바 추가 (emerald 테마, 포장완료 뱃지)
- height(고정) -> minHeight(유동)으로 카드 자연 성장 허용
- gridAutoRows를 minmax(높이, auto)로 변경 (그리드 셀도 성장)
- 카드 flex flex-col + 본문 flex-1 overflow-hidden 구조
- 오른쪽 버튼 영역 justify-center -> justify-start (위쪽 정렬)
2026-03-05 18:34:45 +09:00
SeongHyun Kim 85bf4882a8 fix(pop-card-list): 미입고 formula 필드 입력값 연동 복원
설정 UI에서 formulaRightType 기본값을 "input"으로 표시하지만
DB에 명시적으로 저장하지 않아, 렌더링 시 undefined === "input"이
false가 되어 입력필드 연동이 작동하지 않던 버그를 수정한다.
- FieldRow: (field.formulaRightType || "input") === "input"으로
  기본값 fallback 추가
2026-03-05 18:00:17 +09:00