2026-09-14(월) 세션 — 네스팅 QA 5건(버튼줄·제목·칼라DB·Enter 점프·계산기) — 기록: [코디]
논의·대안
[페페] 가 네스팅 화면(/production/nesting 도어전용 탭)에서 QA helper 로 요소를 집어 5건 + 「운영 배포」를 던졌다.
넷은 순수 UI 였고, ③ 칼라 DB 연동만 결정거리였다.
poin_colors(board_color 840행 · 고유 835) 는 NOT NULL 칸이 3개(edge_color·poin_color_type_id·company_id)인데
네스팅 저장 시점에는 그 값이 없다. 두 안:
- A. 기존 다수 관례대로
('', 1=PP, 0)— 840행 중 449행이 이 조합이고, 마지막 수작업 등록 5건(2024-05)도 전부 같다. - B.
poin_color_type_id=0같은 미사용 값으로 「미지정」 표식 — 자동등록 행을 나중에 골라내기 쉽다.
GPT 상의 결론도 A — 미사용 값은 조회·필터 로직을 깨뜨릴 수 있고, 이 행의 쓸모는 칼라명 자동완성 하나뿐이라 마감종류·업체는 나중에 사람이 채우는 칸이다. A 채택.
인라인 검색은 네이티브 <input list> + <datalist> 로 갔다(라이브러리 0 · JS 최소).
web-designer 가 실측으로 화살표 키 충돌을 잡아냈다 — 이 그리드는 setupKeys 가 ArrowUp/Down/Enter 를 전역으로
가로채 셀 이동에 쓰기 때문에, datalist 팝업이 떠 있어도 ArrowDown 이 다음 행 컬러칸으로 포커스를 옮기고 값은 안 골라진다.
대안(컬러칸만 키 예외 처리 / 자체 콤보박스 JS)은 각각 「손맛이 다르다」는 새 혼란과 코드량 초과라 현행 유지로 결론.
④ Enter 점프는 web-designer 가 setupKeys(gridId, cols, onEnterLast, enterJump) 로 시그니처를 늘리는 안을 냈는데,
목표 칸을 실제 data-k 로 찾으면 인자가 아예 필요 없다 — 호출부 2곳 + keyup 재호출까지 3곳을 고치다 하나를 빠뜨려
조용히 깨지는 위험을 없앴다.
결정
- 버튼줄(
+행 추가·초기화·샘플·tread JSON)을 부재 표 위로(.toolrowflex), 우측 끝에 계산기. - h3 괄호 안내 +
<p class="muted">5문단 삭제.(총 N행)카운터는 상태값이라 유지. - 컬러칸 =
poin_colors자동완성(문서에<datalist>1개, 부재·자재 컬러칸이 공유) + 저장 시POST /api/poin/colors. 가드 = 빈값·32자 초과 스킵 · 대소문자 무시 중복차단(서버 collationutf8mb3_unicode_ci+ 프런트 소문자 비교 두 겹) · 회당 50건 상한. - 수량칸 Enter → 다음 행 「가로」(
ENTER_JUMP={qty:'w'}). 마지막 행이면 새 행 만들고 그 행 가로. - 계산기 = 화이트리스트 검사 후
Function. 콤마를 먼저 지운다 — 안 지우면(1,200)이 쉼표 연산자로 200 이 되는 조용한 오답.
산출물·커밋
C:\dev\pfs\web\nesting\nesting.html·C:\dev\pfs\api\pfs\poin_color\controller\poin_color_controller.py(2파일)- master
462a50d→ 운영de24c6f(체리픽, blob 해시 2/2 일치) - 검사기
C:\dev\pfs\scripts\_nesting_qa5_check.py— 로컬 32/32 ·--test40/40 ·--test --newcolor1/1 ·--prod41/41(운영 쓰기 0건) - devplan
C:\dev\devplan\pfs-nesting-qa5.html+ 허브 카드pfs-nesting-qa5(furniture·live) - 사이트맵 재빌드 = 그룹 8 · 페이지 58 · 미반영 1(
/field/worklog— 26.9.9부터 있던 기존 건, 이번 건 아님)
2차(같은 날 오후) — 상단 고정 · 구분색 · 자체 드롭리스트
[페페] 3건. ③은 1차에서 내가 만든 것을 도로 걷어내는 지시였다.
- 「해당 라인까지 상단 고정(스크롤 영향 X)」 → 2단 sticky. 1단
.sticky-top(제목+탭바) · 2단.sticky-sub(부재 제목+버튼줄). 🔴2단을.col안에 두면 안 된다 — sticky 컨테이닝 블록이 그.col이라 표를 지나 결과·BOM 으로 내려가는 순간 버튼줄이 같이 사라진다. 그런데 그게 이 화면의 주 스크롤 동작이다 →.col밖(.wrap직속)으로 빼고showTab()이 표시를 토글. 🔴고정 높이는 px 로 못 박는다 — 640px(200% 확대)에서 탭바·버튼줄이 둘 다 접혀 126→201px(실측).recalcStickyTop()이 실측해--stickyH로 내리고#partWrap높이가 그만큼 줄어든다(1080p 33행 · 768p 23행). - 컬러 값별 파스텔 구분색 — 값이 아니라 등장 순서로 8색 배정, 부재·자재가 같은 맵 공유.
🔴인라인
background로 칠하면 범위선택 하이라이트를 덮는다 →td에--tint+.tint클래스, CSS 에서.cellsel앞에 선언. 팔레트에서 2색 제외 = 하늘#dbeafe은 범위선택색#d7e8ff와 사실상 같은 색(45쌍 중 최소거리 4.6), 회청#e2e8f0은 헤더·민트와 녹색약 거리 5.1. 페페가 의심한 살구↔테라코타는 거리 26.9 로 안전. - 크롬 자동완성 드롭리스트 금지 → 자체 드롭리스트 —
<datalist>삭제,data-drop="color", 그리드 텍스트칸 전부autocomplete=off. 새로 안 만들었다 — pncad 가 26.9.3 에 만든droplist.js(232줄, 함정 5개 반영)가sync_to_pfs.py로 이미 pfs 에 와 있다 →/production/pncad/droplist.js를 import 하고providers.color만 등록. -setupKeys에if(e.defaultPrevented) return;한 줄 — droplist 는 캡처 단계에서 소비할 때만 preventDefault 를 부르므로 팝업이 먹은 ↑↓/Enter 는 그리드가 안 건드리고, 안 먹은 Enter 는 종전대로 다음 셀로 간다. - 값이 찬 칸은 focusin 자동열기만 억제(표를 훑고 지날 때 방해). 클릭·타이핑·Alt+↓ 는 그대로 연다. ⛔click 을stopImmediatePropagation으로 막으면 범위선택(Shift+클릭)까지 죽는다. - 🔴new Event('change')는 버블하지 않는다 → 구분색 갱신 리스너는 캡처여야 한다(버블만 걸었더니 조용히 안 먹었다). - 🔴팝업 CSS 는body #pcDrop으로 특이도를 올려야 이긴다 — droplist 가initDrops()때<style>을 런타임 append 해서 문서 순서로는 늘 나중이다. 폰트 12/11px → 13px 하한,--acc→#1a73e8.
어긴 규칙과 승격
③은 새 지시가 아니었다. 「모든 목록·자동완성은 크롬 양식 금지」는 26.9.3 페페 지시로 이미 있었는데
projects/pncad/rules.md 안에만 적혀 있어 pfs 작업에서 안 읽혔고, 오전에 배포한 1차가 그 위반이다.
C:\dev\CLAUDE.md§3 확정 규칙에 ② 추가(①폰트 13px 옆) — 항상 로드되는 파일- kb
08-forms-inputs.md§1-0 원문(금지 3종 대응표 ·droplist.js재사용 경로 · datalist 가 틀린 이유 4개) - ruleguard
chrome-native-dropdown규칙 + 탐지기(selftest 13/13, block) projects/pncad/rules.md는 포인터 1줄로 강등- 🔑교훈 = 「이 규칙은 이 프로젝트 것」이라 판단해 리포 하위에 적으면, 두 번째 프로젝트에서 그대로 다시 밟는다.
2차 산출·검증 = master ab664ae → 운영 60b1eb4(체리픽, blob 일치) · 검사기 ⑥⑦⑧ 추가 →
로컬 71/71 · --test 87/87 · --prod 88/88 · 운영 쓰기 0건 · 사이트맵 미반영 1(그대로, 이번 건 아님).
⚠다른 세션이 같은 리포에 커밋 3건(요율감시, scripts/ 만)을 넣어 놨다 — 경계 확인으로 내 파일만 올라간 것 확인.
3차(같은 날 오후) — 드롭 토글 · 행 드래그 · 컬럼폭+비고 · 행별 [+]
[페페] 4건 + 운영배포. master 2449737 → 운영 975ccad(체리픽, blob 일치).
- 드롭 토글 — droplist 는
D.anchor!==t일 때만 열어 재클릭에 무반응이었다. 🔴판정은 click 이 아니라 mousedown 시점(포커스 이동 전) — click 때 재면 「빈 칸 첫 클릭」까지 오인해 즉시 닫힌다. - 행 드래그 — 손잡이 = 순번칸(입력 요소가 없어 범위선택과 제스처 충돌 자체가 없다).
HTML5
draggable은setupRange의 전역dragstart차단과 부딪혀 못 쓴다. 4px 임계 · 드롭선box-shadow:inset(행높이 불변) · 가장자리 자동 스크롤 · 키보드 대체Alt+Shift+↑↓. ⚠raw mouse 라 터치 미지원. - 컬럼폭 + 비고 — 진짜 바닥은
.grid-scroll input{min-width:60px}(→36).#partGrid{max-width:1000px}없으면 1920px 에서 auto-layout 이 두께칸까지 170px 로 부푼다. 🔴비고는 맨 끝 +newCol:1둘 다 필수 (빼면 옛 9열 붙여넣기 판정이 9→10 으로 틀어져 조용히 어긋난다). - 행별 [+] — 누른 행 바로 아래 새 행.
[✕]는 버튼 2개 폭(48px) 띄움.delbtn12→13px. 행 높이 25px 불변.
검증 = 로컬 98/98 · --test 114/114 · --prod 114/115 · 운영 쓰기 0건.
🔴미해결 = --prod ⑦ select 팝업 1건. 운영 파일이 테스트와 바이트 동일(93279)인데 테스트만 통과.
팝업이 열린 흔적(항목 3 · top:355px)을 남기고 display:none → 열렸다 닫힌다. networkidle·scroll_into_view 로 안 풀림.
볼 곳 = droplist 의 scroll/focusout/pointerdown capture. 페페 육안 1회면 실사용 영향 여부가 갈린다.
다음
- ⏳[페페] 실기 1회 — ①8색 파스텔이 실제 모니터에서 구분되고 「예쁘게」 나오는지 ②드롭리스트 팝업이 표 우측 끝 칸에서 스크롤바에 안 가리는지 ③상단 고정 2단 세로 공간(1080p 33행 · 768p 23행) ④안드로이드 실기 고정헤더+팝업(웹 모바일뷰 대체 불가).
- ⏳[페페] 판단 — 삭제한 설명 5문단을
<details>접이식으로 되살릴지. 지시는 「모두 삭제」라 그대로 지웠다. - ⚠
droplist.js를/static/js/로 승격(P2) — 지금은/production/pncad/를 빌려 쓴다. 소비자가 둘이 된 지금이 적기. - ⚠
.muted가 12px(이 파일 수십 곳) = 13px 하한 위반. 새로 만든 요소는 전부 13px 로 맞췄지만 클래스 자체는 지시 범위 밖이라 안 건드렸다 → web-designer 미결 「13px 전면 정리」와 한 건으로 묶는다. - ⚠
.tabbar가 390px 에서 가로 73px 넘친다(web-designer 가 재다 발견한 기존 버그, 이번 건과 무관). - 테스트 DB 에
_QA칼라_202609141행 잔재(등록 경로 실측). 운영은 깨끗. 검사기 기본--test는 쓰기 0건(--newcolor옵트인).
관계
- 주제 그룹: pfs-nesting
- 관련 문서: pfs-session-2026-09-10-nesting-grid-modal-plan, pfs-session-2026-09-10-nesting-grid-range