Spaces:
Running
Running
Fix nut Xac nhan don: gate bang __odUnlocked (mo khoa trong modal don, chặn tren link chiết khấu) + cho nhap ma truy cap truc tiep trong modal
Browse files- index.html +1 -1
- src/greeting-news.js +26 -13
index.html
CHANGED
|
@@ -556,7 +556,7 @@
|
|
| 556 |
<script defer src="./src/cart-quote.js?gc=28"></script> <!-- Cart + Quote module (Giỏ hàng / Báo giá) -->
|
| 557 |
<script defer src="./src/customers.js?gc=15"></script> <!-- Customer list (Danh sách khách hàng) -->
|
| 558 |
<script defer src="./src/vaix-rag.js?gc=51"></script> <!-- V.AI STUDIO RAG Module - loads FASTER via light index; lazy galleries; spec-aware search -->
|
| 559 |
-
<script defer src="./src/greeting-news.js?gc=
|
| 560 |
<script defer src="./src/order-sync.js?gc=16"></script> <!-- Order sync with V.AISTUDIO backend -->
|
| 561 |
<script type="module" src="./src/app.js?gc=57"></script>
|
| 562 |
<script defer src="./src/greeting-source-cards.js?gc=15"></script> <!-- FIX: Nguồn tin cards under greeting -->
|
|
|
|
| 556 |
<script defer src="./src/cart-quote.js?gc=28"></script> <!-- Cart + Quote module (Giỏ hàng / Báo giá) -->
|
| 557 |
<script defer src="./src/customers.js?gc=15"></script> <!-- Customer list (Danh sách khách hàng) -->
|
| 558 |
<script defer src="./src/vaix-rag.js?gc=51"></script> <!-- V.AI STUDIO RAG Module - loads FASTER via light index; lazy galleries; spec-aware search -->
|
| 559 |
+
<script defer src="./src/greeting-news.js?gc=34"></script> <!-- Greeting HOT news cards + source links -->
|
| 560 |
<script defer src="./src/order-sync.js?gc=16"></script> <!-- Order sync with V.AISTUDIO backend -->
|
| 561 |
<script type="module" src="./src/app.js?gc=57"></script>
|
| 562 |
<script defer src="./src/greeting-source-cards.js?gc=15"></script> <!-- FIX: Nguồn tin cards under greeting -->
|
src/greeting-news.js
CHANGED
|
@@ -579,6 +579,9 @@
|
|
| 579 |
order = applyOrderCustomerCk(order) || order;
|
| 580 |
var old = document.getElementById('vai-order-detail-modal');
|
| 581 |
if (old) old.remove();
|
|
|
|
|
|
|
|
|
|
| 582 |
var ov = document.createElement('div');
|
| 583 |
ov.id = 'vai-order-detail-modal';
|
| 584 |
ov.style.cssText = 'position:fixed;inset:0;background:rgba(15,23,42,0.6);z-index:5100;display:flex;align-items:flex-start;justify-content:center;padding:24px 16px;overflow-y:auto;backdrop-filter:blur(2px)';
|
|
@@ -633,7 +636,7 @@
|
|
| 633 |
+ '<button data-ord="back" onclick="if(window.vaiGoBackFromOrder){window.vaiGoBackFromOrder()}else{document.getElementById(\'vai-order-detail-modal\').remove();window.openOrderModal&&window.openOrderModal()}" style="padding:10px 16px;border:1px solid #cbd5e1;background:#fff;color:#334155;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-arrow-left"></i> Quay lại</button>'
|
| 634 |
+ '<button data-ord="add" style="padding:10px 16px;border:none;background:#0ea5e9;color:#fff;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-plus-circle"></i> Thêm SP</button>'
|
| 635 |
+ '<button data-ord="toggle" style="padding:10px 16px;border:none;background:' + (order.status === 'confirmed' ? '#92400e' : '#059669') + ';color:#fff;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-' + (order.status === 'confirmed' ? 'undo' : 'check-circle') + '"></i> ' + (order.status === 'confirmed' ? 'Bỏ chốt' : 'Chốt đơn') + '</button>'
|
| 636 |
-
+ '<button data-ord="confirm" style="padding:10px 16px;border:none;background:#0b7a3b;color:#fff;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer;display:' + ((window.
|
| 637 |
+ '<button data-ord="delete" style="padding:10px 16px;border:none;background:#dc2626;color:#fff;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-trash"></i> Xóa đơn</button>'
|
| 638 |
+ '<span style="flex:1"></span>'
|
| 639 |
+ '<button data-ord="delivery-excel" style="padding:10px 16px;border:2px solid #16a34a;background:#fff;color:#15803d;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-truck"></i> Giao hàng Excel</button>'
|
|
@@ -682,19 +685,28 @@
|
|
| 682 |
|
| 683 |
// ── CK (chiết khấu) features, mirroring the new quote modal ──
|
| 684 |
var ACCESS_CODE = 'V.AISTUDIO';
|
| 685 |
-
// Unlock CK inputs when the V.AISTUDIO access code is entered — but
|
| 686 |
-
// the admin identity may edit CK
|
| 687 |
-
// the Đơn giá CK read-only (tuyệt
|
|
|
|
| 688 |
var odCanEdit = (window.canEditCk ? window.canEditCk() : false);
|
| 689 |
-
|
|
|
|
| 690 |
var odAccessEl = ov.querySelector('#od-access-code');
|
| 691 |
-
if (odAccessEl)
|
| 692 |
-
|
| 693 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 694 |
}
|
| 695 |
window.__odCheckAccess = function () {
|
| 696 |
-
|
| 697 |
-
|
|
|
|
| 698 |
return;
|
| 699 |
}
|
| 700 |
var inp = ov.querySelector('#od-access-code');
|
|
@@ -886,9 +898,10 @@
|
|
| 886 |
openOrderDetail(order.code);
|
| 887 |
}
|
| 888 |
else if (act === 'confirm') {
|
| 889 |
-
// XÁC NHẬN ĐƠN — admin only (
|
| 890 |
-
|
| 891 |
-
|
|
|
|
| 892 |
return;
|
| 893 |
}
|
| 894 |
var cur2 = orders().find(function (o) { return String(o.code) === String(order.code); });
|
|
|
|
| 579 |
order = applyOrderCustomerCk(order) || order;
|
| 580 |
var old = document.getElementById('vai-order-detail-modal');
|
| 581 |
if (old) old.remove();
|
| 582 |
+
// CK unlock state: mirror the admin identity. On a chiết khấu link isAdmin()
|
| 583 |
+
// is always false, so the confirm button stays hidden & handler returns.
|
| 584 |
+
window.__odUnlocked = !!(window.isAdmin ? window.isAdmin() : false);
|
| 585 |
var ov = document.createElement('div');
|
| 586 |
ov.id = 'vai-order-detail-modal';
|
| 587 |
ov.style.cssText = 'position:fixed;inset:0;background:rgba(15,23,42,0.6);z-index:5100;display:flex;align-items:flex-start;justify-content:center;padding:24px 16px;overflow-y:auto;backdrop-filter:blur(2px)';
|
|
|
|
| 636 |
+ '<button data-ord="back" onclick="if(window.vaiGoBackFromOrder){window.vaiGoBackFromOrder()}else{document.getElementById(\'vai-order-detail-modal\').remove();window.openOrderModal&&window.openOrderModal()}" style="padding:10px 16px;border:1px solid #cbd5e1;background:#fff;color:#334155;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-arrow-left"></i> Quay lại</button>'
|
| 637 |
+ '<button data-ord="add" style="padding:10px 16px;border:none;background:#0ea5e9;color:#fff;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-plus-circle"></i> Thêm SP</button>'
|
| 638 |
+ '<button data-ord="toggle" style="padding:10px 16px;border:none;background:' + (order.status === 'confirmed' ? '#92400e' : '#059669') + ';color:#fff;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-' + (order.status === 'confirmed' ? 'undo' : 'check-circle') + '"></i> ' + (order.status === 'confirmed' ? 'Bỏ chốt' : 'Chốt đơn') + '</button>'
|
| 639 |
+
+ '<button data-ord="confirm" style="padding:10px 16px;border:none;background:#0b7a3b;color:#fff;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer;display:' + ((window.__odUnlocked === true) ? '' : 'none') + '"><i class="fas fa-check-double"></i> ' + (order.verified ? 'Đã xác nhận' : 'Xác nhận đơn') + '</button>'
|
| 640 |
+ '<button data-ord="delete" style="padding:10px 16px;border:none;background:#dc2626;color:#fff;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-trash"></i> Xóa đơn</button>'
|
| 641 |
+ '<span style="flex:1"></span>'
|
| 642 |
+ '<button data-ord="delivery-excel" style="padding:10px 16px;border:2px solid #16a34a;background:#fff;color:#15803d;border-radius:9px;font-size:0.78rem;font-weight:700;cursor:pointer"><i class="fas fa-truck"></i> Giao hàng Excel</button>'
|
|
|
|
| 685 |
|
| 686 |
// ── CK (chiết khấu) features, mirroring the new quote modal ──
|
| 687 |
var ACCESS_CODE = 'V.AISTUDIO';
|
| 688 |
+
// Unlock CK inputs when the V.AISTUDIO access code is entered — but only
|
| 689 |
+
// the admin identity may edit CK, and NEVER on a chiết khấu link. A
|
| 690 |
+
// customer opening their own order sees the Đơn giá CK read-only (tuyệt
|
| 691 |
+
// đối không sửa được).
|
| 692 |
var odCanEdit = (window.canEditCk ? window.canEditCk() : false);
|
| 693 |
+
var odViaLink = (window.enteredViaLink ? window.enteredViaLink() : false);
|
| 694 |
+
if (!odCanEdit || odViaLink) {
|
| 695 |
var odAccessEl = ov.querySelector('#od-access-code');
|
| 696 |
+
if (odAccessEl) {
|
| 697 |
+
// On a discount link the access-code input + confirm button stay hidden
|
| 698 |
+
// entirely (enteredViaLink ⇒ isAdmin/__odUnlocked false ⇒ hidden).
|
| 699 |
+
if (odViaLink) odAccessEl.style.display = 'none';
|
| 700 |
+
}
|
| 701 |
+
if (odViaLink) {
|
| 702 |
+
var odStatusEl2 = ov.querySelector('#od-access-status');
|
| 703 |
+
if (odStatusEl2) odStatusEl2.textContent = '🔒 Chỉ admin chỉnh sửa';
|
| 704 |
+
}
|
| 705 |
}
|
| 706 |
window.__odCheckAccess = function () {
|
| 707 |
+
// A chiết khấu link must NEVER unlock admin (confirm button + CK edit).
|
| 708 |
+
if (window.enteredViaLink && window.enteredViaLink()) {
|
| 709 |
+
if (window.showToast) window.showToast('🔒 Không khả dụng trên link chiết khấu');
|
| 710 |
return;
|
| 711 |
}
|
| 712 |
var inp = ov.querySelector('#od-access-code');
|
|
|
|
| 898 |
openOrderDetail(order.code);
|
| 899 |
}
|
| 900 |
else if (act === 'confirm') {
|
| 901 |
+
// XÁC NHẬN ĐƠN — admin only (gated by the Mã truy cập / __odUnlocked,
|
| 902 |
+
// which NEVER unlocks on a chiết khấu link).
|
| 903 |
+
if (!(window.__odUnlocked === true)) {
|
| 904 |
+
if (window.showToast) window.showToast('🔒 Nhập mã truy cập để xác nhận đơn');
|
| 905 |
return;
|
| 906 |
}
|
| 907 |
var cur2 = orders().find(function (o) { return String(o.code) === String(order.code); });
|