bep40 commited on
Commit
eb98956
·
1 Parent(s): 5a10d8a

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
Files changed (2) hide show
  1. index.html +1 -1
  2. 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=33"></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 -->
 
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.isAdmin ? window.isAdmin() : false) ? '' : 'none') + '"><i class="fas fa-check-double"></i> ' + (order.verified ? 'Đã xác nhận' : 'Xác nhận đơn') + '</button>'
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 ONLY
686
- // the admin identity may edit CK. A customer opening their own order sees
687
- // the Đơn giá CK read-only (tuyệt đối không sửa được).
 
688
  var odCanEdit = (window.canEditCk ? window.canEditCk() : false);
689
- if (!odCanEdit) {
 
690
  var odAccessEl = ov.querySelector('#od-access-code');
691
- if (odAccessEl) odAccessEl.style.display = 'none';
692
- var odStatusEl = ov.querySelector('#od-access-status');
693
- if (odStatusEl) odStatusEl.textContent = '🔒 Chỉ admin chỉnh sửa';
 
 
 
 
 
 
694
  }
695
  window.__odCheckAccess = function () {
696
- if (!(window.canEditCk ? window.canEditCk() : false)) {
697
- if (window.showToast) window.showToast('🔒 Chỉ admin mới được chỉnh sửa chiết khấu');
 
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 (button hidden on discount-link / non-admin).
890
- if (!(window.isAdmin ? window.isAdmin() : false)) {
891
- if (window.showToast) window.showToast('🔒 Chỉ admin mới được xác nhận đơn');
 
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 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); });