Spaces:
Running
Running
Revert index.html to bb80fef31b
Browse files- index.html +23 -47
index.html
CHANGED
|
@@ -372,9 +372,7 @@ textarea.form-input{height:120px;resize:vertical}
|
|
| 372 |
.chat-close:hover{background:rgba(255,255,255,.4)}
|
| 373 |
.chat-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:10px;background:#f8fafc}
|
| 374 |
.chat-msg{max-width:88%;padding:11px 15px;border-radius:16px;font-size:.84rem;line-height:1.55;word-wrap:break-word}
|
| 375 |
-
.chat-msg.bot{background:#fff;color:var(--d);align-self:flex-start;border:1px solid var(--gl);border-bottom-left-radius:4px
|
| 376 |
-
.chat-msg.bot table{font-size:.7rem}
|
| 377 |
-
.chat-msg.bot td,.chat-msg.bot th{padding:4px 3px!important}
|
| 378 |
.chat-msg.user{background:var(--p);color:#fff;align-self:flex-end;border-bottom-right-radius:4px}
|
| 379 |
.chat-msg a{color:var(--a);font-weight:600;text-decoration:underline}
|
| 380 |
.chat-msg.bot a{color:var(--p)}
|
|
@@ -1682,36 +1680,6 @@ scores.sort((a,b)=>b.score-a.score);
|
|
| 1682 |
return scores.slice(0,4).map(s=>s.p);
|
| 1683 |
}
|
| 1684 |
|
| 1685 |
-
|
| 1686 |
-
// === SKU Detection Helpers for chatbox ===
|
| 1687 |
-
function _detectSKUs(text){
|
| 1688 |
-
if(typeof D==='undefined'||!D.length)return[];
|
| 1689 |
-
// Extract potential SKU-like tokens (alphanumeric 3+ chars)
|
| 1690 |
-
let tokens=text.split(/[,;\s]+/).map(t=>t.trim().toLowerCase().replace(/[.\-_ \/]/g,'')).filter(t=>t.length>=3&&/[a-z]/.test(t)&&/\d/.test(t));
|
| 1691 |
-
// Also check for known model patterns
|
| 1692 |
-
let extra=text.match(/[A-Za-z]{1,4}[\-_ ]?\d{2,}[A-Za-z]*/g)||[];
|
| 1693 |
-
extra.forEach(e=>{let n=e.toLowerCase().replace(/[.\-_ \/]/g,'');if(tokens.indexOf(n)===-1)tokens.push(n);});
|
| 1694 |
-
return tokens;
|
| 1695 |
-
}
|
| 1696 |
-
function _findProductsBySKU(text){
|
| 1697 |
-
if(typeof D==='undefined'||!D.length)return[];
|
| 1698 |
-
let tokens=_detectSKUs(text);
|
| 1699 |
-
if(!tokens.length)return[];
|
| 1700 |
-
let found=[];let seen={};
|
| 1701 |
-
tokens.forEach(code=>{
|
| 1702 |
-
for(let i=0;i<D.length;i++){
|
| 1703 |
-
let p=D[i];if(!p||seen[p.slug])continue;
|
| 1704 |
-
let pSku=((p.sku||'')+(p.model||p.mod||'')).toLowerCase().replace(/[.\-_ \/]/g,'');
|
| 1705 |
-
if(pSku&&(pSku.indexOf(code)!==-1||code.indexOf(pSku)!==-1)){
|
| 1706 |
-
seen[p.slug]=true;
|
| 1707 |
-
found.push({name:p.name||'',price:p.priceNum||p.pn||0,priceStr:p.price||p.p||'LH',image:p.image||p.img||p.i||'',sku:p.sku||p.model||p.mod||'',brand:p.brand||'',qty:1});
|
| 1708 |
-
break;
|
| 1709 |
-
}
|
| 1710 |
-
}
|
| 1711 |
-
});
|
| 1712 |
-
return found;
|
| 1713 |
-
}
|
| 1714 |
-
|
| 1715 |
async function sendChat(){
|
| 1716 |
if(chatBusy)return;
|
| 1717 |
let input=document.getElementById('chatInput');
|
|
@@ -1726,21 +1694,29 @@ appendMsg('user',msg.replace(/</g,'<').replace(/>/g,'>').replace(/\n/g,'<b
|
|
| 1726 |
|
| 1727 |
// Handle cart/quote/checkout commands
|
| 1728 |
let msgLower=nVN(msg);
|
| 1729 |
-
if(msgLower.match(/bao gia|lap bao gia|len bao gia|xuat bao gia|in bao gia/)
|
| 1730 |
-
|
| 1731 |
-
|
| 1732 |
-
|
| 1733 |
-
let total=foundProducts.reduce((s,c)=>s+c.price*c.qty,0);
|
| 1734 |
-
let rows=foundProducts.map((c,i)=>'<tr style="border-bottom:1px solid #e2e8f0"><td style="padding:5px 3px;text-align:center;font-size:.7rem">'+(i+1)+'</td><td style="padding:5px 3px">'+(c.image?'<img src="'+c.image+'" style="width:32px;height:32px;object-fit:contain;border-radius:3px" referrerpolicy="no-referrer" onerror="this.style.display=\'none\'">':'')+'</td><td style="padding:5px 3px;font-size:.72rem;font-weight:600;max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+c.name.substring(0,35)+'<br><span style="font-size:.6rem;color:#94a3b8">'+c.sku+'</span></td><td style="padding:5px 3px;text-align:center;font-size:.7rem">'+c.qty+'</td><td style="padding:5px 3px;text-align:right;font-size:.72rem;font-weight:700;white-space:nowrap">'+c.priceStr+'</td></tr>').join('');
|
| 1735 |
-
let quoteHtml='<div style="background:var(--l,#f8fafc);border-radius:10px;padding:10px;margin-top:6px;max-width:100%;overflow:hidden"><div style="font-weight:800;font-size:.82rem;color:var(--p,#003f62);margin-bottom:6px">📋 BÁO GIÁ</div><div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;border:1px solid var(--gl,#e2e8f0);border-radius:6px;overflow:hidden"><thead><tr style="background:var(--p,#003f62);color:#fff"><th style="padding:4px;font-size:.62rem">#</th><th style="padding:4px;font-size:.62rem">Ảnh</th><th style="padding:4px;font-size:.62rem;text-align:left">Sản phẩm</th><th style="padding:4px;font-size:.62rem">SL</th><th style="padding:4px;font-size:.62rem;text-align:right">Đơn giá</th></tr></thead><tbody>'+rows+'</tbody><tfoot><tr style="background:rgba(0,63,98,.05)"><td colspan="4" style="padding:7px;font-weight:800;font-size:.75rem;text-align:right">TỔNG:</td><td style="padding:7px;font-weight:900;font-size:.82rem;color:var(--p,#003f62);text-align:right;white-space:nowrap">'+total.toLocaleString('vi-VN')+'đ</td></tr></tfoot></table></div><div style="display:flex;gap:4px;margin-top:8px;flex-wrap:wrap"><button onclick="if(window.VAI_ORDERS&&window.VAI_ORDERS.save)window.VAI_ORDERS.save()" style="padding:5px 9px;background:#7c3aed;color:#fff;border:none;border-radius:6px;font-size:.68rem;font-weight:700;cursor:pointer">💾 Lưu</button><button onclick="if(typeof shareQuoteImage==='function')shareQuoteImage()" style="padding:5px 9px;background:#25D366;color:#fff;border:none;border-radius:6px;font-size:.68rem;font-weight:700;cursor:pointer">📤 Chia sẻ</button><button onclick="if(typeof openQuotation==='function'){openQuotation();if(typeof closeChat==='function')closeChat();}" style="padding:5px 9px;background:var(--p,#003f62);color:#fff;border:none;border-radius:6px;font-size:.68rem;font-weight:700;cursor:pointer">📋 Lập phiếu</button></div></div>';
|
| 1736 |
-
appendMsg('bot','Dạ em báo giá ngay ạ! 📋'+quoteHtml);
|
| 1737 |
-
chatBusy=false;return;
|
| 1738 |
-
}
|
| 1739 |
-
// If "báo giá" explicitly but no SKU found → ask
|
| 1740 |
-
if(msgLower.match(/bao gia/)){
|
| 1741 |
-
appendMsg('bot','Anh/chị cho em mã SP cần báo giá nhé! 😊<br>VD: <b>MDI702</b> hoặc <b>MDI702, MC9086HS</b>');
|
| 1742 |
-
chatBusy=false;return;
|
| 1743 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1744 |
}
|
| 1745 |
|
| 1746 |
if(msgLower.match(/thanh toan|chuyen khoan|qr|quyet toan/)){
|
|
|
|
| 372 |
.chat-close:hover{background:rgba(255,255,255,.4)}
|
| 373 |
.chat-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:10px;background:#f8fafc}
|
| 374 |
.chat-msg{max-width:88%;padding:11px 15px;border-radius:16px;font-size:.84rem;line-height:1.55;word-wrap:break-word}
|
| 375 |
+
.chat-msg.bot{background:#fff;color:var(--d);align-self:flex-start;border:1px solid var(--gl);border-bottom-left-radius:4px}
|
|
|
|
|
|
|
| 376 |
.chat-msg.user{background:var(--p);color:#fff;align-self:flex-end;border-bottom-right-radius:4px}
|
| 377 |
.chat-msg a{color:var(--a);font-weight:600;text-decoration:underline}
|
| 378 |
.chat-msg.bot a{color:var(--p)}
|
|
|
|
| 1680 |
return scores.slice(0,4).map(s=>s.p);
|
| 1681 |
}
|
| 1682 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1683 |
async function sendChat(){
|
| 1684 |
if(chatBusy)return;
|
| 1685 |
let input=document.getElementById('chatInput');
|
|
|
|
| 1694 |
|
| 1695 |
// Handle cart/quote/checkout commands
|
| 1696 |
let msgLower=nVN(msg);
|
| 1697 |
+
if(msgLower.match(/bao gia|lap bao gia|len bao gia|xuat bao gia|in bao gia/)){
|
| 1698 |
+
if(cart.length===0){
|
| 1699 |
+
appendMsg('bot','Giỏ hàng đang trống. Anh/chị hãy chọn sản phẩm trước rồi em lên báo giá nhé! 😊<br><br>Anh/chị cần tìm sản phẩm gì ạ?');
|
| 1700 |
+
chatBusy=false;return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1701 |
}
|
| 1702 |
+
let total=cart.reduce((s,c)=>s+c.priceNum*c.qty,0);
|
| 1703 |
+
let rows=cart.map((c,i)=>`<tr><td style="padding:8px;font-size:.78rem">${i+1}</td><td style="padding:8px;font-size:.78rem">${c.name}</td><td style="padding:8px;text-align:center;font-size:.78rem">${c.qty}</td><td style="padding:8px;text-align:right;font-size:.78rem;white-space:nowrap">${c.priceNum?c.priceNum.toLocaleString('vi-VN')+'đ':'Liên hệ'}</td><td style="padding:8px;text-align:right;font-size:.78rem;font-weight:700;white-space:nowrap">${(c.priceNum*c.qty).toLocaleString('vi-VN')}đ</td></tr>`).join('');
|
| 1704 |
+
let quoteHtml=`<div style="background:var(--l);border-radius:12px;padding:14px;margin-top:8px">
|
| 1705 |
+
<div style="font-weight:800;font-size:.9rem;color:var(--p);margin-bottom:10px">📋 BẢNG BÁO GIÁ</div>
|
| 1706 |
+
<table style="width:100%;border-collapse:collapse;border:1px solid var(--gl);border-radius:8px;overflow:hidden">
|
| 1707 |
+
<thead><tr style="background:var(--p);color:#fff"><th style="padding:8px;font-size:.72rem;text-align:left">STT</th><th style="padding:8px;font-size:.72rem;text-align:left">Sản phẩm</th><th style="padding:8px;font-size:.72rem;text-align:center">SL</th><th style="padding:8px;font-size:.72rem;text-align:right">Đơn giá</th><th style="padding:8px;font-size:.72rem;text-align:right">Thành tiền</th></tr></thead>
|
| 1708 |
+
<tbody>${rows}</tbody>
|
| 1709 |
+
<tfoot><tr style="background:rgba(0,63,98,.05)"><td colspan="4" style="padding:10px;font-weight:800;font-size:.85rem;text-align:right">TỔNG CỘNG:</td><td style="padding:10px;font-weight:900;font-size:.95rem;color:var(--p);text-align:right;white-space:nowrap">${total.toLocaleString('vi-VN')}đ</td></tr></tfoot>
|
| 1710 |
+
</table>
|
| 1711 |
+
<div style="display:flex;gap:8px;margin-top:10px;flex-wrap:wrap">
|
| 1712 |
+
<button onclick="viewQuoteInline(this)" style="padding:8px 14px;background:#fff;color:var(--p);border:2px solid var(--p);border-radius:8px;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit;display:flex;align-items:center;gap:6px"><i class="fas fa-eye"></i> Xem chi tiết</button>
|
| 1713 |
+
<button onclick="openQuotation()" style="padding:8px 14px;background:var(--p);color:#fff;border:none;border-radius:8px;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit;display:flex;align-items:center;gap:6px"><i class="fas fa-file-pdf"></i> PDF</button>
|
| 1714 |
+
<button onclick="exportQuoteExcel()" style="padding:8px 14px;background:#217346;color:#fff;border:none;border-radius:8px;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit;display:flex;align-items:center;gap:6px"><i class="fas fa-file-excel"></i> Excel</button>
|
| 1715 |
+
<button onclick="openCheckout()" style="padding:8px 14px;background:var(--a);color:#fff;border:none;border-radius:8px;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit;display:flex;align-items:center;gap:6px"><i class="fas fa-qrcode"></i> Thanh toán</button>
|
| 1716 |
+
</div>
|
| 1717 |
+
</div>`;
|
| 1718 |
+
appendMsg('bot','Dạ, em lên bảng báo giá cho anh/chị ngay ạ! 📋'+quoteHtml);
|
| 1719 |
+
chatBusy=false;return;
|
| 1720 |
}
|
| 1721 |
|
| 1722 |
if(msgLower.match(/thanh toan|chuyen khoan|qr|quyet toan/)){
|