ui(cupang): 품목 라인 번호열을 체크박스로 + 선택 라인 삭제 + 전체선택

- # 열 → 체크박스(헤더 전체선택, indeterminate 지원)
- "라인 삭제" → "선택 라인 삭제": 체크된 행 삭제(최소 1줄 유지)
- 캐시 버전 h

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-05-30 06:23:16 +09:00
parent f25948185b
commit fdabeec4e3
9 changed files with 47 additions and 22 deletions
+33 -11
View File
@@ -67,9 +67,9 @@
function makeRow(data) {
data = data || {};
var tr = document.createElement("tr");
// 컬럼: # / 제품명(select) / 제품코드 / 수량 / 입수량 / 박스계산 / 라인메모 / 삭제
// 컬럼: 체크 / 제품명(select) / 제품코드 / 수량 / 입수량 / 박스계산 / 라인메모
tr.innerHTML =
'<td class="cpg-line-no"></td>' +
'<td class="cpg-check-col"><input type="checkbox" class="cpg-row-check" /></td>' +
'<td class="cpg-cell-name"></td>' +
'<td><input class="erp-input cpg-code" type="text" placeholder="제품코드" /></td>' +
'<td><input class="erp-input cpg-qty" type="number" min="1" /></td>' +
@@ -108,27 +108,49 @@
body.appendChild(tr);
recalc(tr);
renumber();
syncCheckAll();
return tr;
}
function renumber() {
Array.prototype.forEach.call(body.querySelectorAll("tr"), function (tr, i) {
tr.querySelector(".cpg-line-no").textContent = i + 1;
// 전체 선택 체크박스 상태 동기화
var checkAll = document.getElementById("cpg-check-all");
function syncCheckAll() {
if (!checkAll) return;
var checks = body.querySelectorAll(".cpg-row-check");
var total = checks.length;
var on = 0;
Array.prototype.forEach.call(checks, function (c) { if (c.checked) on++; });
checkAll.checked = total > 0 && on === total;
checkAll.indeterminate = on > 0 && on < total;
}
if (checkAll) {
checkAll.addEventListener("change", function () {
Array.prototype.forEach.call(body.querySelectorAll(".cpg-row-check"), function (c) {
c.checked = checkAll.checked;
});
});
}
body.addEventListener("change", function (e) {
if (e.target && e.target.classList.contains("cpg-row-check")) syncCheckAll();
});
// 초기 라인
if (initLines.length) { initLines.forEach(makeRow); } else { makeRow(); }
document.getElementById("cpg-add-line").addEventListener("click", function () { makeRow(); });
// 마지막 라인 삭제 (최소 1줄 유지)
// 선택 라인 삭제 (체크된 행 삭제, 최소 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();
var checked = body.querySelectorAll(".cpg-row-check:checked");
if (!checked.length) { alert("삭제할 라인을 선택하세요."); return; }
Array.prototype.forEach.call(checked, function (c) {
var tr = c.closest("tr");
if (tr) tr.remove();
});
if (!body.querySelectorAll("tr").length) makeRow(); // 최소 1줄
if (checkAll) { checkAll.checked = false; checkAll.indeterminate = false; }
syncCheckAll();
});
}