From dcd40e692f35975b43506e7f82b9914136a5c8bc Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Wed, 1 Apr 2026 09:50:15 +0900 Subject: [PATCH] =?UTF-8?q?fix(purchase):=20=EB=84=A4=EB=B9=84=20=EB=AA=85?= =?UTF-8?q?=EC=B9=AD/=EA=B6=8C=ED=95=9C=20=EC=88=98=EC=A0=95=20+=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EC=9E=AC=EC=84=A0=ED=83=9D=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 네비: '소모품 관리' → '소모품 구매 관리'(admin only), 일반 사용자는 '소모품 신청'만 표시 - 권한: purchase.request_mobile → purchase.request alias 등록 (비관리자 접근 가능) - 검색: 품목 선택 후 다시 입력하면 이전 선택 자동 해제 (데스크탑+모바일) - 모바일: selectSearchItem에서 불필요한 API 재호출 제거, 로컬 캐시 활용 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../web/pages/purchase/request-mobile.html | 10 +++--- .../web/pages/purchase/request.html | 4 +-- .../web/static/js/purchase-request-mobile.js | 36 +++++++++++-------- .../web/static/js/purchase-request.js | 7 ++++ system1-factory/web/static/js/tkfb-core.js | 3 +- 5 files changed, 37 insertions(+), 23 deletions(-) diff --git a/system1-factory/web/pages/purchase/request-mobile.html b/system1-factory/web/pages/purchase/request-mobile.html index c02dff3..df1047a 100644 --- a/system1-factory/web/pages/purchase/request-mobile.html +++ b/system1-factory/web/pages/purchase/request-mobile.html @@ -6,8 +6,8 @@ 소모품 신청 - TK 공장관리 - - + + @@ -140,8 +140,8 @@
- - - + + + diff --git a/system1-factory/web/pages/purchase/request.html b/system1-factory/web/pages/purchase/request.html index 14497a2..158eea1 100644 --- a/system1-factory/web/pages/purchase/request.html +++ b/system1-factory/web/pages/purchase/request.html @@ -310,7 +310,7 @@ - - + + diff --git a/system1-factory/web/static/js/purchase-request-mobile.js b/system1-factory/web/static/js/purchase-request-mobile.js index d128c66..c5a9ee1 100644 --- a/system1-factory/web/static/js/purchase-request-mobile.js +++ b/system1-factory/web/static/js/purchase-request-mobile.js @@ -191,6 +191,14 @@ document.addEventListener('DOMContentLoaded', () => { const input = document.getElementById('searchInput'); input.addEventListener('input', () => { clearTimeout(searchTimer); + // 검색어 입력 시 이전 선택 자동 해제 + if (document.getElementById('selectedItemId').value || document.getElementById('selectedCustomName').value) { + document.getElementById('selectedItemWrap').classList.add('hidden'); + document.getElementById('selectedItemId').value = ''; + document.getElementById('selectedCustomName').value = ''; + document.getElementById('newItemForm').classList.add('hidden'); + isRegisterMode = false; + } const q = input.value.trim(); if (q.length === 0) { document.getElementById('searchResults').classList.remove('open'); @@ -212,6 +220,7 @@ document.addEventListener('DOMContentLoaded', () => { }); function renderSearchResults(items, query) { + lastSearchResults = items; const container = document.getElementById('searchResults'); let html = ''; @@ -240,23 +249,20 @@ function renderSearchResults(items, query) { } /* ===== 품목 선택 ===== */ -let searchItemsCache = []; +let lastSearchResults = []; function selectSearchItem(itemId) { - // API 검색 결과에서 선택 — searchResults에서 데이터 가져오기 - api('/purchase-requests/search?q=' + encodeURIComponent(document.getElementById('searchInput').value.trim())) - .then(res => { - const item = (res.data || []).find(i => i.item_id === itemId); - if (!item) return; - document.getElementById('selectedItemId').value = item.item_id; - document.getElementById('selectedCustomName').value = ''; - document.getElementById('selectedItemName').textContent = item.item_name + (item.spec ? ' [' + item.spec + ']' : '') + (item.maker ? ' (' + item.maker + ')' : ''); - document.getElementById('selectedItemMeta').textContent = (CAT_LABELS[item.category] || '') + (item.base_price ? ' · ' + Number(item.base_price).toLocaleString() + '원' : ''); - document.getElementById('selectedItemWrap').classList.remove('hidden'); - document.getElementById('searchResults').classList.remove('open'); - document.getElementById('newItemForm').classList.add('hidden'); - isRegisterMode = false; - }); + const item = lastSearchResults.find(i => i.item_id === itemId); + if (!item) return; + document.getElementById('selectedItemId').value = item.item_id; + document.getElementById('selectedCustomName').value = ''; + document.getElementById('selectedItemName').textContent = item.item_name + (item.spec ? ' [' + item.spec + ']' : '') + (item.maker ? ' (' + item.maker + ')' : ''); + document.getElementById('selectedItemMeta').textContent = (CAT_LABELS[item.category] || '') + (item.base_price ? ' · ' + Number(item.base_price).toLocaleString() + '원' : ''); + document.getElementById('selectedItemWrap').classList.remove('hidden'); + document.getElementById('searchResults').classList.remove('open'); + document.getElementById('searchInput').value = ''; + document.getElementById('newItemForm').classList.add('hidden'); + isRegisterMode = false; } function selectNewItem() { diff --git a/system1-factory/web/static/js/purchase-request.js b/system1-factory/web/static/js/purchase-request.js index 4dfcb56..427a170 100644 --- a/system1-factory/web/static/js/purchase-request.js +++ b/system1-factory/web/static/js/purchase-request.js @@ -51,6 +51,13 @@ function initItemSearch() { input.addEventListener('input', () => { clearTimeout(searchDebounceTimer); + // 검색어 변경 시 이전 선택 자동 해제 + if (document.getElementById('prItemId').value) { + document.getElementById('prItemId').value = ''; + document.getElementById('prCustomItemName').value = ''; + document.getElementById('prItemPreview').classList.add('hidden'); + document.getElementById('prCustomCategoryWrap').classList.add('hidden'); + } searchDebounceTimer = setTimeout(() => { const query = input.value.trim(); if (query.length === 0) { diff --git a/system1-factory/web/static/js/tkfb-core.js b/system1-factory/web/static/js/tkfb-core.js index f32db15..9c955cd 100644 --- a/system1-factory/web/static/js/tkfb-core.js +++ b/system1-factory/web/static/js/tkfb-core.js @@ -134,7 +134,7 @@ const NAV_MENU = [ ]}, { cat: '소모품 관리', items: [ { href: '/pages/purchase/request-mobile.html', icon: 'fa-shopping-cart', label: '소모품 신청', key: 'purchase.request_mobile' }, - { href: '/pages/purchase/request.html', icon: 'fa-clipboard-list', label: '소모품 관리', key: 'purchase.request' }, + { href: '/pages/purchase/request.html', icon: 'fa-clipboard-list', label: '소모품 구매 관리', key: 'purchase.request', admin: true }, { href: '/pages/admin/purchase-analysis.html', icon: 'fa-chart-line', label: '소모품 분석', key: 'purchase.analysis', admin: true }, ]}, { cat: '근태 관리', items: [ @@ -170,6 +170,7 @@ const PAGE_KEY_ALIASES = { 'attendance.work_status': 'inspection.work_status', 'work.meeting_detail': 'work.meetings', 'work.proxy_input': 'work.daily_status', + 'purchase.request_mobile': 'purchase.request', }; function _getCurrentPageKey() {