bep40 commited on
Commit
241a94d
·
verified ·
1 Parent(s): fa14a5d

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
Files changed (1) hide show
  1. 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