/** * DMP ๅ็ซฏๅบ็จ * * ๐ ไบคไบ้ป่พ v2๏ผ * 1. ้ป่ฎคๆ๏ผๆฏๅผ ๅก็ๅชๆพ็คบๅ จ้ไบบๆฐ๏ผcoverage๏ผ * 2. ้็ฌฌไธไธชๆ ็ญพๅ๏ผๅ ถไปๅก็ๅฎๆถ้ข็ฎ"ๅฆๆๅ ไธ่ฟไธชๆ ็ญพ็ปๆ้ๆๅคๅฐไบบ" * 3. ๆฏๆฌก็นๅปๆฐๅขๆ ็ญพ๏ผๅก็ๅณไธ่งๆพ็คบ็ธๆฏ็นๅปๅ็ไบบๆฐ/่ฝฌๅ็ๅๅ (ยฑฮ) * 4. ้ฒๆ 350ms๏ผ้ฟๅ ๅฟซ้็นๅป้ข็น่ฏทๆฑ */ const API = ''; // โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ // ๅ จๅฑ็ถๆ // โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ const state = { totalUsers: 0, categories: [], // ๅ จ้จๅ็ฑป+ๆ ็ญพ selected: new Map(), // tagId โ { tagId, name, mode, color } lastResult: null, // ๆๆฐ่ฎก็ฎ็ปๆ prevResult: null, // ็นๅปๅ็็ปๆ๏ผ็จไบ่ฎก็ฎ delta๏ผ computeTimer: null, previewTimer: null, previewAbortCtrl: null, // ็จไบๅๆถ่ฟๆ็้ข่ง่ฏทๆฑ phase: 'default', // 'default' | 'preview' | 'computed' }; const CURRENT_THEME = 'onion'; // โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ // ๅๅงๅ // โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ async function init() { try { const data = await apiFetch(`/api/tags?theme=${CURRENT_THEME}`); if (!data) return; state.categories = data.categories; state.totalUsers = data.totalUsers; renderBoard(data.categories, data.totalUsers); document.getElementById('tagBoard').classList.add('phase-default'); document.getElementById('rcTotal').textContent = fmtNum(data.totalUsers); document.getElementById('rcRate').textContent = 'โ'; } catch (e) { console.error('Init failed', e); } } // โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ // ๆธฒๆๆ ็ญพ็ๆฟ // โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ function renderBoard(categories, totalUsers) { const board = document.getElementById('tagBoard'); board.innerHTML = ''; for (const cat of categories) { const col = document.createElement('div'); col.className = 'col'; col.dataset.catKey = cat.key; const header = document.createElement('div'); header.className = 'col-header'; header.innerHTML = `
| UID | Name | |
|---|---|---|
| ${u.uid} | ${u.name || '-'} | ${u.email || '-'} |
{
"source": "crm_sync",
"users": [
{ "uid": "u_001", "name": "Alice", "email": "alice@example.com" },
{ "uid": "u_002", "name": "Bob", "email": "bob@example.com",
"extra_json": { "plan": "pro", "country": "US" } }
]
}
{ batchId, imported, total }
{
"source": "ml_model_v2",
"mode": "replace",
"assignments": [
{ "uid": "u_001", "tagKey": "sub_plus" },
{ "uid": "u_001", "tagKey": "uc_coding" }
]
}