feat: 품번/품명 Select2 AJAX 검색 기능 추가

- common.js에 initPartSelect2Ajax 함수 추가 (기존 select2 영향 없음)
- estimateList_new.jsp: 품번/품명 AJAX 검색 적용
- orderMgmtList.jsp: 품번/품명 AJAX 검색 적용
- 디버깅 로그 추가로 문제 해결 용이
This commit is contained in:
2025-10-20 15:55:15 +09:00
parent 889231ae27
commit ca25e0de56
10 changed files with 934 additions and 257 deletions

View File

@@ -3255,4 +3255,182 @@ function fnc_tabulCallbackFnc(objid, docType, columnField, fileCnt){
});
}
//tabulator용 Function 종료
//tabulator용 Function 종료
/**
* 품번/품명 Select2 AJAX 검색 함수 (견적 목록 전용)
* @param {string} partNoSelectId - 품번 셀렉트 박스 ID (예: "#search_partNo")
* @param {string} partNameSelectId - 품명 셀렉트 박스 ID (예: "#search_partName")
* @param {string} partObjIdInputId - 품목 OBJID hidden 필드 ID (예: "#search_partObjId")
* @param {object} options - 추가 옵션 (placeholder, minimumInputLength 등)
*/
function initPartSelect2Ajax(partNoSelectId, partNameSelectId, partObjIdInputId, options) {
options = options || {};
var partNoPlaceholder = options.partNoPlaceholder || "품번 입력하여 검색...";
var partNamePlaceholder = options.partNamePlaceholder || "품명 입력하여 검색...";
var minimumInputLength = options.minimumInputLength || 1;
var searchUrl = options.searchUrl || '/contractMgmt/searchPartList.do';
var debug = options.debug || false;
// 품번 Select2 AJAX 설정
$(partNoSelectId).select2({
placeholder: partNoPlaceholder,
allowClear: true,
width: '100%',
minimumInputLength: minimumInputLength,
language: {
inputTooShort: function() {
return "최소 " + minimumInputLength + "글자 이상 입력하세요";
},
searching: function() {
return "검색 중...";
},
noResults: function() {
return "검색 결과가 없습니다";
}
},
ajax: {
url: searchUrl,
dataType: 'json',
type: 'POST',
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
delay: 250,
data: function(params) {
return {
searchTerm: params.term
};
},
processResults: function(data) {
var results = $.map(data, function(item) {
var objId = item.OBJID || item.objid || item.objId;
var partNo = item.PART_NO || item.part_no || item.partNo;
var partName = item.PART_NAME || item.part_name || item.partName;
return {
id: partNo,
text: partNo,
objId: objId,
partName: partName,
partNo: partNo
};
});
return {
results: results
};
},
cache: true
}
});
// 품명 Select2 AJAX 설정
$(partNameSelectId).select2({
placeholder: partNamePlaceholder,
allowClear: true,
width: '100%',
minimumInputLength: minimumInputLength,
language: {
inputTooShort: function() {
return "최소 " + minimumInputLength + "글자 이상 입력하세요";
},
searching: function() {
return "검색 중...";
},
noResults: function() {
return "검색 결과가 없습니다";
}
},
ajax: {
url: searchUrl,
dataType: 'json',
type: 'POST',
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
delay: 250,
data: function(params) {
return {
searchTerm: params.term
};
},
processResults: function(data) {
var results = $.map(data, function(item) {
var objId = item.OBJID || item.objid || item.objId;
var partNo = item.PART_NO || item.part_no || item.partNo;
var partName = item.PART_NAME || item.part_name || item.partName;
return {
id: partName,
text: partName,
objId: objId,
partName: partName,
partNo: partNo
};
});
return {
results: results
};
},
cache: true
}
});
// 품번 변경 이벤트 핸들러
var partNoChangeHandler = function() {
var selectedData = $(this).select2('data')[0];
if(debug) console.log("품번 변경됨:", selectedData);
if(selectedData && selectedData.objId) {
if(debug) console.log("품목 OBJID 설정:", selectedData.objId);
$(partObjIdInputId).val(selectedData.objId);
// 품명 셀렉트박스도 동기화
var $partNameSelect = $(partNameSelectId);
$partNameSelect.off('change');
if($partNameSelect.find("option[value='" + selectedData.partName + "']").length === 0) {
var newOption = new Option(selectedData.partName, selectedData.partName, true, true);
$partNameSelect.append(newOption);
} else {
$partNameSelect.val(selectedData.partName);
}
$partNameSelect.trigger('change.select2');
setTimeout(function() {
$partNameSelect.on('change', partNameChangeHandler);
}, 100);
} else {
$(partObjIdInputId).val("");
}
};
// 품명 변경 이벤트 핸들러
var partNameChangeHandler = function() {
var selectedData = $(this).select2('data')[0];
if(debug) console.log("품명 변경됨:", selectedData);
if(selectedData && selectedData.objId) {
if(debug) console.log("품목 OBJID 설정:", selectedData.objId);
$(partObjIdInputId).val(selectedData.objId);
// 품번 셀렉트박스도 동기화
var $partNoSelect = $(partNoSelectId);
$partNoSelect.off('change');
if($partNoSelect.find("option[value='" + selectedData.partNo + "']").length === 0) {
var newOption = new Option(selectedData.partNo, selectedData.partNo, true, true);
$partNoSelect.append(newOption);
} else {
$partNoSelect.val(selectedData.partNo);
}
$partNoSelect.trigger('change.select2');
setTimeout(function() {
$partNoSelect.on('change', partNoChangeHandler);
}, 100);
} else {
$(partObjIdInputId).val("");
}
};
// 이벤트 연결
$(partNoSelectId).on('change', partNoChangeHandler);
$(partNameSelectId).on('change', partNameChangeHandler);
}