ui(cupang): 폼 프레임 크기 고정 + 라인 추가/삭제 버튼 하단 우측

- 공통 헤더 450px, 품목 라인 900x900 내부 스크롤
- 저장/취소 위 구분선 제거
- 라인 추가 + 라인 삭제 버튼을 품목 라인 하단 우측에 배치
- 행별 ✕ 삭제 제거 → "라인 삭제"가 마지막 라인 삭제(최소 1줄 유지)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-05-30 05:24:49 +09:00
parent d4e823f1fa
commit 150335cf87
3 changed files with 36 additions and 14 deletions
+11 -3
View File
@@ -75,8 +75,7 @@
'<td><input class="erp-input cpg-qty" type="number" min="1" /></td>' +
'<td><input class="erp-input cpg-upb" type="number" min="1" placeholder="입수량" /></td>' +
'<td><span class="cpg-line-calc">—</span></td>' +
'<td><input class="erp-input cpg-memo" type="text" /></td>' +
'<td><button type="button" class="erp-btn erp-btn-outline cpg-line-del">✕</button></td>';
'<td><input class="erp-input cpg-memo" type="text" /></td>';
var code = data.product_code || "";
var nameSel = buildNameSelect(code);
@@ -104,7 +103,6 @@
}
});
tr.querySelector(".cpg-line-del").addEventListener("click", function () { tr.remove(); renumber(); });
tr.querySelector(".cpg-qty").addEventListener("input", function () { recalc(tr); });
tr.querySelector(".cpg-upb").addEventListener("input", function () { recalc(tr); });
@@ -123,6 +121,16 @@
// 초기 라인
if (initLines.length) { initLines.forEach(makeRow); } else { makeRow(); }
document.getElementById("cpg-add-line").addEventListener("click", function () { makeRow(); });
// 마지막 라인 삭제 (최소 1줄 유지)
var delBtn = document.getElementById("cpg-del-line");
if (delBtn) {
delBtn.addEventListener("click", function () {
var rows = body.querySelectorAll("tr");
if (rows.length <= 1) { alert("최소 1개 라인은 필요합니다."); return; }
rows[rows.length - 1].remove();
renumber();
});
}
// 제출: 라인 직렬화
form.addEventListener("submit", function (e) {