@@ -122,6 +159,76 @@ class JobSpecModal extends BaseModal {
onSave(); this.close(); closeModals();
}
});
+
+ // 자동완성 바인딩
+ this.bindAutocomplete('job-spec-cpu-standard', 'job-spec-cpu-autocomplete', 'CPU');
+ this.bindAutocomplete('job-spec-ram-standard', 'job-spec-ram-autocomplete', 'RAM');
+ this.bindAutocomplete('job-spec-gpu-standard', 'job-spec-gpu-autocomplete', 'GPU');
+
+ // 실시간 점수 계산 이벤트 바인딩
+ const inputs = ['job-spec-cpu-standard', 'job-spec-ram-standard', 'job-spec-gpu-standard'];
+ inputs.forEach(id => {
+ const el = document.getElementById(id);
+ el?.addEventListener('input', () => this.updateMinScore());
+ el?.addEventListener('change', () => this.updateMinScore());
+ });
+ }
+
+ private bindAutocomplete(inputId: string, autocompleteId: string, category: string) {
+ const input = document.getElementById(inputId) as HTMLInputElement;
+ const list = document.getElementById(autocompleteId) as HTMLDivElement;
+ if (!input || !list) return;
+
+ const showList = (filterText: string = '') => {
+ if (!this.isEditMode) return;
+ const items = (state.masterData.partsMaster || []).filter((c: any) => c.category === category);
+ const filtered = filterText
+ ? items.filter((c: any) => c.component_name.toLowerCase().includes(filterText.toLowerCase()))
+ : items;
+
+ if (filtered.length === 0) {
+ list.innerHTML = '
검색 결과 없음
';
+ } else {
+ list.innerHTML = filtered.map((c: any) => `
${c.component_name}
`).join('');
+ }
+ list.classList.remove('hidden');
+ };
+
+ input.addEventListener('focus', () => {
+ showList(input.value);
+ });
+
+ input.addEventListener('input', () => {
+ showList(input.value);
+ });
+
+ list.addEventListener('mousedown', (e) => {
+ const item = (e.target as HTMLElement).closest('.autocomplete-item');
+ if (item && item.getAttribute('data-val')) {
+ input.value = item.getAttribute('data-val') || '';
+ list.classList.add('hidden');
+ this.updateMinScore();
+ }
+ });
+
+ document.addEventListener('mousedown', (e) => {
+ if (e.target !== input && !list.contains(e.target as Node)) {
+ list.classList.add('hidden');
+ }
+ });
+ }
+
+ private updateMinScore(): void {
+ const cpu = (document.getElementById('job-spec-cpu-standard') as HTMLInputElement)?.value || '';
+ const ram = (document.getElementById('job-spec-ram-standard') as HTMLInputElement)?.value || '';
+ const gpu = (document.getElementById('job-spec-gpu-standard') as HTMLInputElement)?.value || '';
+
+ const score = calculatePcScoreDeductive(cpu, ram, gpu, '');
+
+ const minScoreEl = document.getElementById('job-spec-min-score') as HTMLInputElement;
+ if (minScoreEl) {
+ minScoreEl.value = score.toString();
+ }
}
protected fillFormData(asset: any): void {
@@ -130,7 +237,7 @@ class JobSpecModal extends BaseModal {
setFieldValue('job-spec-cpu-standard', asset.cpu_standard || '');
setFieldValue('job-spec-ram-standard', asset.ram_standard || '');
setFieldValue('job-spec-gpu-standard', asset.gpu_standard || '');
- setFieldValue('job-spec-min-score', asset.min_score !== undefined ? asset.min_score.toString() : '0');
+ setFieldValue('job-spec-min-score', asset.min_score !== undefined ? asset.min_score.toString() : '100');
setFieldValue('job-spec-remarks', asset.remarks || '');
}
@@ -148,7 +255,6 @@ class JobSpecModal extends BaseModal {
const deleteBtn = document.getElementById('btn-delete-job-spec-asset')!;
const saveBtn = document.getElementById('btn-save-job-spec-asset')!;
- // 추가 모드일 때는 삭제 버튼 숨김
deleteBtn.style.display = (mode === 'add') ? 'none' : 'block';
if (mode === 'add') {
@@ -162,6 +268,8 @@ class JobSpecModal extends BaseModal {
saveBtn.textContent = '수정';
saveBtn.style.display = 'block';
}
+
+ this.updateMinScore();
}
}