Spaces:
Running
Running
Thêm tìm kiếm catalogue OCR vào thanh tìm kiếm chính: khi search sản phẩm cũng hiển thị các trang catalogue liên quan
Browse files- index.html +56 -2
index.html
CHANGED
|
@@ -366,6 +366,7 @@ textarea.form-input{height:120px;resize:vertical}
|
|
| 366 |
</div>
|
| 367 |
<div class="pg" id="grid"></div>
|
| 368 |
<div class="pagination" id="pag"></div>
|
|
|
|
| 369 |
</main>
|
| 370 |
</div>
|
| 371 |
</div>
|
|
@@ -643,11 +644,11 @@ document.getElementById('tab-'+id).classList.add('active');
|
|
| 643 |
// ===== ACTIONS =====
|
| 644 |
function setCat(s){S.cat=s;S.pg=1;updActive('.cat-item','data-s',s);render();closeMsb()}
|
| 645 |
function setPrice(min,max,i){S.pmin=min;S.pmax=max;S.pg=1;document.querySelectorAll('.pr-item').forEach((e,j)=>e.classList.toggle('active',j===i));render();closeMsb()}
|
| 646 |
-
function doSearch(){S.q=document.getElementById('q').value.trim();S.pg=1;render()}
|
| 647 |
function doSort(){S.sort=document.getElementById('ss').value;S.pg=1;render()}
|
| 648 |
function setV(v){S.view=v;document.getElementById('gb').classList.toggle('active',v==='g');document.getElementById('lb').classList.toggle('active',v==='l');render()}
|
| 649 |
function goPg(p){let f=getF(),tp=Math.ceil(f.length/PP);if(p<1||p>tp)return;S.pg=p;render();document.querySelector('.toolbar').scrollIntoView({behavior:'smooth',block:'start'})}
|
| 650 |
-
function resetAll(){S={cat:'all',q:'',pmin:0,pmax:1e15,sort:'default',pg:1,view:S.view};document.getElementById('q').value='';document.getElementById('ss').value='default';updActive('.cat-item','data-s','all');document.querySelectorAll('.pr-item').forEach((e,i)=>e.classList.toggle('active',i===0));render()}
|
| 651 |
function updActive(sel,attr,val){document.querySelectorAll(sel).forEach(e=>e.classList.toggle('active',e.getAttribute(attr)===val))}
|
| 652 |
function closeMsb(){document.getElementById('msb').classList.remove('open')}
|
| 653 |
document.addEventListener('keydown',e=>{if(e.key==='Escape')goBack();if(e.key==='/'&&document.activeElement.tagName!=='INPUT'){e.preventDefault();document.getElementById('q').focus()}});
|
|
@@ -797,6 +798,59 @@ let re=new RegExp('('+q.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')+')','gi');
|
|
| 797 |
return text.replace(re,'<mark style="background:var(--al);color:var(--d);padding:1px 2px;border-radius:2px">$1</mark>');
|
| 798 |
}
|
| 799 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 800 |
// ===== NAVIGATION =====
|
| 801 |
let currentPage='products';
|
| 802 |
|
|
|
|
| 366 |
</div>
|
| 367 |
<div class="pg" id="grid"></div>
|
| 368 |
<div class="pagination" id="pag"></div>
|
| 369 |
+
<div id="catSearchResults"></div>
|
| 370 |
</main>
|
| 371 |
</div>
|
| 372 |
</div>
|
|
|
|
| 644 |
// ===== ACTIONS =====
|
| 645 |
function setCat(s){S.cat=s;S.pg=1;updActive('.cat-item','data-s',s);render();closeMsb()}
|
| 646 |
function setPrice(min,max,i){S.pmin=min;S.pmax=max;S.pg=1;document.querySelectorAll('.pr-item').forEach((e,j)=>e.classList.toggle('active',j===i));render();closeMsb()}
|
| 647 |
+
function doSearch(){S.q=document.getElementById('q').value.trim();S.pg=1;render();renderMainCatSearch()}
|
| 648 |
function doSort(){S.sort=document.getElementById('ss').value;S.pg=1;render()}
|
| 649 |
function setV(v){S.view=v;document.getElementById('gb').classList.toggle('active',v==='g');document.getElementById('lb').classList.toggle('active',v==='l');render()}
|
| 650 |
function goPg(p){let f=getF(),tp=Math.ceil(f.length/PP);if(p<1||p>tp)return;S.pg=p;render();document.querySelector('.toolbar').scrollIntoView({behavior:'smooth',block:'start'})}
|
| 651 |
+
function resetAll(){S={cat:'all',q:'',pmin:0,pmax:1e15,sort:'default',pg:1,view:S.view};document.getElementById('q').value='';document.getElementById('ss').value='default';updActive('.cat-item','data-s','all');document.querySelectorAll('.pr-item').forEach((e,i)=>e.classList.toggle('active',i===0));render();let csr=document.getElementById('catSearchResults');if(csr)csr.innerHTML='';}
|
| 652 |
function updActive(sel,attr,val){document.querySelectorAll(sel).forEach(e=>e.classList.toggle('active',e.getAttribute(attr)===val))}
|
| 653 |
function closeMsb(){document.getElementById('msb').classList.remove('open')}
|
| 654 |
document.addEventListener('keydown',e=>{if(e.key==='Escape')goBack();if(e.key==='/'&&document.activeElement.tagName!=='INPUT'){e.preventDefault();document.getElementById('q').focus()}});
|
|
|
|
| 798 |
return text.replace(re,'<mark style="background:var(--al);color:var(--d);padding:1px 2px;border-radius:2px">$1</mark>');
|
| 799 |
}
|
| 800 |
|
| 801 |
+
// ===== MAIN SEARCH → CATALOGUE OCR RESULTS =====
|
| 802 |
+
function renderMainCatSearch(){
|
| 803 |
+
let container=document.getElementById('catSearchResults');
|
| 804 |
+
if(!container)return;
|
| 805 |
+
let q=S.q;
|
| 806 |
+
if(!q||q.length<2){container.innerHTML='';return;}
|
| 807 |
+
// Ensure OCR data and catalogue list are loaded
|
| 808 |
+
if(!catOcrData){
|
| 809 |
+
loadCatOcr().then(()=>{
|
| 810 |
+
if(!CAT_LIST.length){
|
| 811 |
+
fetch('catalogues.json').then(r=>r.json()).then(data=>{CAT_LIST=data;renderMainCatSearch()});
|
| 812 |
+
}else{renderMainCatSearch()}
|
| 813 |
+
});
|
| 814 |
+
return;
|
| 815 |
+
}
|
| 816 |
+
if(!CAT_LIST.length){
|
| 817 |
+
fetch('catalogues.json').then(r=>r.json()).then(data=>{CAT_LIST=data;renderMainCatSearch()});
|
| 818 |
+
return;
|
| 819 |
+
}
|
| 820 |
+
let ql=q.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g,'');
|
| 821 |
+
let results=[];
|
| 822 |
+
for(let ci=0;ci<CAT_LIST.length;ci++){
|
| 823 |
+
let ocr=catOcrData&&catOcrData[ci]?catOcrData[ci].texts:[];
|
| 824 |
+
let pages=CAT_LIST[ci].pages;
|
| 825 |
+
for(let pi=0;pi<pages.length;pi++){
|
| 826 |
+
let txt=(ocr[pi]||'').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g,'');
|
| 827 |
+
if(txt.includes(ql)){
|
| 828 |
+
results.push({catIdx:ci,catName:CAT_LIST[ci].name,pageIdx:pi,pageNum:pi+1,img:pages[pi],text:ocr[pi]||''});
|
| 829 |
+
}
|
| 830 |
+
}
|
| 831 |
+
}
|
| 832 |
+
if(!results.length){container.innerHTML='';return;}
|
| 833 |
+
let shown=results.slice(0,8);
|
| 834 |
+
let moreCount=results.length-shown.length;
|
| 835 |
+
container.innerHTML=`
|
| 836 |
+
<div style="margin-top:24px;background:#fff;border-radius:var(--r);padding:20px;box-shadow:0 2px 12px rgba(0,0,0,.06)">
|
| 837 |
+
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;flex-wrap:wrap;gap:8px">
|
| 838 |
+
<h3 style="font-size:.95rem;font-weight:700;color:var(--d);display:flex;align-items:center;gap:8px">
|
| 839 |
+
<i class="fas fa-book-open" style="color:var(--a)"></i> Tìm thấy trong Catalogue: <strong style="color:var(--p)">${results.length} trang</strong>
|
| 840 |
+
</h3>
|
| 841 |
+
${results.length>8?`<button onclick="showPage('catalogue');document.getElementById('catSearch').value='${q.replace(/'/g,"\\'")}';setTimeout(searchCatalogue,300)" style="padding:6px 16px;border:2px solid var(--p);border-radius:8px;background:#fff;color:var(--p);font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit">Xem tất cả ${results.length} trang <i class="fas fa-arrow-right" style="margin-left:4px"></i></button>`:''}
|
| 842 |
+
</div>
|
| 843 |
+
<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px">
|
| 844 |
+
${shown.map(r=>`<div style="position:relative;border-radius:10px;overflow:hidden;border:2px solid var(--gl);cursor:pointer;transition:all .2s;aspect-ratio:1.4" onmouseover="this.style.borderColor='var(--p)';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='var(--gl)';this.style.transform=''" onclick="openCatImage('${r.img.replace(/'/g,"\\'")}')">
|
| 845 |
+
<img src="${r.img}" alt="" loading="lazy" style="width:100%;height:100%;object-fit:cover">
|
| 846 |
+
<div style="position:absolute;top:6px;left:6px;background:var(--p);color:#fff;padding:2px 8px;border-radius:5px;font-size:.6rem;font-weight:700">${r.catName} — Trang ${r.pageNum}</div>
|
| 847 |
+
<div style="position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(0,0,0,.75));padding:8px 10px 6px;color:#fff;font-size:.65rem;line-height:1.3">${highlightText(r.text.substring(0,100),q)}...</div>
|
| 848 |
+
</div>`).join('')}
|
| 849 |
+
</div>
|
| 850 |
+
${moreCount>0?`<div style="text-align:center;margin-top:12px"><button onclick="showPage('catalogue');document.getElementById('catSearch').value='${q.replace(/'/g,"\\'")}';setTimeout(searchCatalogue,300)" style="padding:8px 20px;border:none;background:var(--p);color:#fff;border-radius:8px;font-size:.8rem;font-weight:600;cursor:pointer;font-family:inherit">+${moreCount} trang khác trong Catalogue <i class="fas fa-arrow-right" style="margin-left:4px"></i></button></div>`:''}
|
| 851 |
+
</div>`;
|
| 852 |
+
}
|
| 853 |
+
|
| 854 |
// ===== NAVIGATION =====
|
| 855 |
let currentPage='products';
|
| 856 |
|