<buttonclass="btn btn-sm"id="btnApproveAll"style="background:#0d6efd;color:#fff;border:none;font-weight:600;"onclick="approveAll()">✅ Duyệt TOÀN BỘ</button>
<buttonclass="btn btn-sm"id="btnApproveAll"style="background:#0d6efd;color:#fff;border:none;font-weight:600;"onclick="approveAll()">✅ Duyệt TOÀN BỘ</button>
<buttonclass="btn btn-sm"id="btnBatch"style="background:#6a0dad;color:#fff;border:none;"onclick="batchGeneratePage()">🤖 Sinh AI (Trang này)</button>
<buttonclass="btn btn-sm"id="btnBatch"style="background:#6a0dad;color:#fff;border:none;"onclick="batchGeneratePage()">🤖 Sinh AI (Trang này)</button>
<buttonclass="btn btn-sm"id="btnBatchAll"style="background:#d63384;color:#fff;border:none;"onclick="batchGenerateAll()">🚀 Sinh AI (Toàn bộ thiếu)</button>
<buttonclass="btn btn-sm"id="btnBatchAll"style="background:#d63384;color:#fff;border:none;"onclick="batchGenerateAll()">🚀 Sinh AI (Toàn bộ thiếu)</button>
</div>
</div>
...
@@ -360,6 +371,9 @@ async function loadOverview() {
...
@@ -360,6 +371,9 @@ async function loadOverview() {
document.getElementById('statMissingCleanSub').textContent=`Đã có ${((data.has_desc||0)-(data.missing_clean_desc||0)).toLocaleString()} / ${(data.has_desc||0).toLocaleString()} bản có format sạch`;
alert('Không có sản phẩm nào thiếu clean description chuẩn.');
return;
}
if(!confirm(`Phát hiện ${missing} sản phẩm đang thiếu hoặc lỗi format clean description.\n\nBấm OK để render lại hàng loạt theo format chuẩn từ description_data hiện có.`)){