Spaces:
Running
Running
File size: 9,060 Bytes
e3b05e4 51e6db5 9957d62 51e6db5 e3b05e4 9957d62 445b4fb e3b05e4 9957d62 51e6db5 9957d62 445b4fb 9957d62 445b4fb e3b05e4 445b4fb e3b05e4 445b4fb 9957d62 51e6db5 445b4fb 51e6db5 445b4fb 9957d62 445b4fb 51e6db5 445b4fb 51e6db5 445b4fb 51e6db5 9957d62 445b4fb e3b05e4 51e6db5 e3b05e4 51e6db5 e3b05e4 445b4fb e3b05e4 51e6db5 9957d62 e3b05e4 445b4fb 9957d62 51e6db5 e3b05e4 51e6db5 e3b05e4 445b4fb 51e6db5 9957d62 445b4fb 51e6db5 445b4fb 51e6db5 e3b05e4 445b4fb e3b05e4 445b4fb e3b05e4 445b4fb e3b05e4 51e6db5 e3b05e4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | /**
* V.AI STUDIO — Order Button v4
*
* v4: Expose showOrderPicker ra window._showOrderPicker
* để cards SP trong chat AI cũng có nút "+ Đơn" hoạt động
*/
(function(){
'use strict';
var STORE_KEY='vai_orders';
function waitReady(cb){
var t=setInterval(function(){
if(typeof D!=='undefined'&&D.length>100){clearInterval(t);cb();}
},2000);
setTimeout(function(){clearInterval(t);cb();},20000);
}
function fmt(n){if(!n||isNaN(n))return'0đ';return Number(n).toLocaleString('vi-VN')+'đ';}
function getOrdersSafe(){
if(window.VAI_ORDERS&&typeof window.VAI_ORDERS.getAll==='function'){
var orders=window.VAI_ORDERS.getAll();
if(orders&&orders.length)return orders;
}
try{
var raw=localStorage.getItem(STORE_KEY);
if(raw){var parsed=JSON.parse(raw);if(Array.isArray(parsed)&&parsed.length)return parsed;}
}catch(e){}
return [];
}
function addOrderSafe(order){
if(window.VAI_ORDERS&&typeof window.VAI_ORDERS.add==='function'){
window.VAI_ORDERS.add(order);
}else{
try{
var orders=getOrdersSafe();
var idx=orders.findIndex(function(o){return o.code===order.code;});
if(idx>=0)orders[idx]=order;else orders.unshift(order);
localStorage.setItem(STORE_KEY,JSON.stringify(orders));
}catch(e){}
}
}
function showOrderPicker(product,onDone){
var old=document.getElementById('vai-order-picker');if(old)old.remove();
var orders=getOrdersSafe();
var overlay=document.createElement('div');
overlay.id='vai-order-picker';
overlay.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:99999;display:flex;align-items:center;justify-content:center;padding:16px;backdrop-filter:blur(2px)';
overlay.addEventListener('click',function(e){if(e.target===overlay)overlay.remove();});
var name=product.name||product.n||'';
var sku=product.sku||product.model||product.mod||'';
var price=product.priceNum||product.pn||0;
if(!price)price=parseInt((product.price||product.p||'').toString().replace(/[^\d]/g,''))||0;
var h='<div style="background:#fff;border-radius:16px;max-width:420px;width:100%;max-height:75vh;overflow-y:auto;box-shadow:0 20px 60px rgba(0,0,0,.3)">';
h+='<div style="padding:14px 18px;background:#003f62;border-radius:16px 16px 0 0;color:#fff"><div style="font-weight:800;font-size:14px">🛒 Thêm vào đơn</div><div style="font-size:11px;margin-top:4px;color:#bae6fd">'+name.substring(0,45)+'</div>';
if(sku)h+='<div style="font-size:10px;color:#93c5fd;margin-top:2px">Mã: '+sku+' • Giá: '+fmt(price)+'</div>';
h+='</div><div style="padding:14px 18px">';
if(!orders.length){
h+='<div style="text-align:center;padding:24px 16px;color:#64748b"><div style="font-size:32px;margin-bottom:8px">📋</div><div style="font-weight:600;margin-bottom:4px">Chưa có đơn hàng nào</div><div style="font-size:11px;color:#94a3b8">Vui lòng tạo báo giá trước, sau đó lưu đơn.</div></div>';
}else{
h+='<div style="font-size:11px;color:#64748b;margin-bottom:8px;font-weight:600">Chọn đơn hàng ('+orders.length+' đơn):</div>';
orders.forEach(function(o,idx){
var isC=o.status==='confirmed';var itemCount=(o.items&&o.items.length)||0;
h+='<div class="vai-op-item" data-idx="'+idx+'" style="padding:10px 12px;border:1px solid #e2e8f0;border-radius:8px;margin-bottom:6px;cursor:pointer;transition:all .15s;border-left:3px solid '+(isC?'#16a34a':'#f59e0b')+'" onmouseover="this.style.background=\'#f0f9ff\'" onmouseout="this.style.background=\'\'">';
h+='<div style="display:flex;justify-content:space-between;align-items:center"><b style="color:#003f62;font-size:13px">'+o.code+'</b><span style="font-size:10px;background:#f1f5f9;padding:2px 6px;border-radius:4px;color:#475569">'+itemCount+' SP</span></div>';
h+='<div style="font-size:11px;color:#64748b;margin-top:3px">'+(o.customer||'Chưa có KH')+(o.grandTotal?' • <b style="color:#059669">'+fmt(o.grandTotal)+'</b>':'')+'</div></div>';
});
}
h+='<button id="vai-op-close" style="margin-top:12px;width:100%;padding:10px;background:#e2e8f0;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-size:12px;color:#475569">Đóng</button></div></div>';
overlay.innerHTML=h;document.body.appendChild(overlay);
document.getElementById('vai-op-close').onclick=function(){overlay.remove();};
overlay.querySelectorAll('.vai-op-item').forEach(function(item){
item.addEventListener('click',function(){
var idx=parseInt(this.getAttribute('data-idx'));
var order=JSON.parse(JSON.stringify(orders[idx]));
if(!order)return;order.items=order.items||[];
if(sku){for(var i=0;i<order.items.length;i++){if(order.items[i].model===sku){overlay.remove();if(typeof showToast==='function')showToast('ℹ️ SP đã có trong đơn '+order.code);if(onDone)onDone('dup');return;}}}
order.items.push({name:name,model:sku,image:product.image||product.img||product.i||'',price:price,discPrice:price,qty:1,total:price,brand:product.brand||'',note:''});
order.grandTotal=(order.grandTotal||0)+price;order.remaining=(order.remaining||0)+price;order.savedAt=new Date().toISOString();
addOrderSafe(order);overlay.remove();
if(typeof showToast==='function')showToast('✅ Đã thêm vào đơn '+order.code);
if(onDone)onDone('ok');
});
});
}
// === EXPOSE ra global để chat-fix.js cards gọi được ===
window._showOrderPicker=showOrderPicker;
function enhanceSearchDropdown(){
new MutationObserver(function(){
var dropdown=document.getElementById('vai-search-dropdown');
if(!dropdown||dropdown.style.display==='none')return;
dropdown.querySelectorAll('.vai-dd-item:not([data-ob])').forEach(function(item){
item.setAttribute('data-ob','1');
var slug=item.getAttribute('data-slug');if(!slug)return;
var btn=document.createElement('button');
btn.textContent='+ Đơn';
btn.style.cssText='padding:4px 8px;background:#003f62;color:#fff;border:none;border-radius:4px;font-size:10px;font-weight:700;cursor:pointer;white-space:nowrap;margin-left:6px;flex-shrink:0';
btn.addEventListener('click',function(e){
e.stopPropagation();e.preventDefault();
if(typeof D==='undefined'||!D.length)return;
for(var i=0;i<D.length;i++){
if(D[i]&&D[i].slug===slug){
showOrderPicker(D[i],function(r){
if(r==='ok'){btn.textContent='✓';btn.style.background='#059669';}
else if(r==='dup'){btn.textContent='Đã có';btn.style.background='#94a3b8';}
setTimeout(function(){btn.textContent='+ Đơn';btn.style.background='#003f62';},2500);
});break;
}
}
});
item.appendChild(btn);
});
}).observe(document.body,{childList:true,subtree:true,attributes:true});
}
function addProductPageButton(){
var slugMatch=window.location.pathname.match(/\/san-pham\/([^/]+)/);
if(!slugMatch)return;var slug=slugMatch[1];
var attempts=0;var t=setInterval(function(){
attempts++;if(attempts>30){clearInterval(t);return;}
if(typeof D==='undefined'||!D.length)return;
if(document.getElementById('vai-page-add-btn'))return;
var product=null;for(var i=0;i<D.length;i++){if(D[i]&&D[i].slug===slug){product=D[i];break;}}
if(!product)return;clearInterval(t);
var btn=document.createElement('button');btn.id='vai-page-add-btn';btn.innerHTML='🛒 Thêm vào đơn';
btn.style.cssText='position:fixed;bottom:80px;right:16px;z-index:999;padding:12px 20px;background:linear-gradient(135deg,#003f62,#0369a1);color:#fff;border:none;border-radius:30px;font-size:14px;font-weight:700;cursor:pointer;box-shadow:0 4px 16px rgba(0,63,98,.4);transition:transform .2s';
btn.onmouseover=function(){this.style.transform='scale(1.05)';};btn.onmouseout=function(){this.style.transform='';};
btn.addEventListener('click',function(){
showOrderPicker(product,function(r){
if(r==='ok'){btn.innerHTML='✅ Đã thêm!';btn.style.background='linear-gradient(135deg,#059669,#10b981)';}
else if(r==='dup'){btn.innerHTML='ℹ️ Đã có';btn.style.background='#64748b';}
setTimeout(function(){btn.innerHTML='🛒 Thêm vào đơn';btn.style.background='linear-gradient(135deg,#003f62,#0369a1)';},2500);
});
});
document.body.appendChild(btn);
},1500);
}
waitReady(function(){enhanceSearchDropdown();addProductPageButton();console.log('✅ Order buttons v4 | Exposed _showOrderPicker | Orders:',getOrdersSafe().length);});
})();
|