server v2.4.1  ·  pid 38291  ·  node 20.11
IDLE
up 0s
$
✓ Configuration saved
let ruleCounter = 4; const TEAM_DESCS = { 'Team A': 'Senior Sales · High-value buyers · Commercial leads', 'Team B': 'Standard Pipeline · Rentals · Low-mid budget', 'Team F': 'Field Agents · Site visits · Urgent requests', }; const TEAM_PILL = { 'Team A': 'team-pill-A', 'Team B': 'team-pill-B', 'Team F': 'team-pill-F', }; const FIELD_VALS = { intent: ['Buyer','Renter','Seller','Commercial','Unknown'], budget: ['Low','Mid','High','Flexible','Unknown'], urgency: ['Low','Normal','Urgent'], source: ['Facebook Ad','WhatsApp','Email','Web Form','Instagram','Referral'], channel: ['email','whatsapp','meta','webform'], }; function addCondition(condsId, ruleId) { const conds = document.getElementById(condsId); const row = document.createElement('div'); row.className = 'rule-condition-row'; row.innerHTML = `
`; conds.appendChild(row); updateCardSummary(ruleId); } function removeCond(btn) { const row = btn.closest('.rule-condition-row'); const card = btn.closest('.rule-card'); const ruleId = card.id.replace('rule-',''); const conds = card.querySelector('.rule-conditions'); if (conds.querySelectorAll('.rule-condition-row').length <= 1) return; // keep at least 1 row.remove(); updateCardSummary(ruleId); } function updateValOptions(fieldSel) { const field = fieldSel.value; const valSel = fieldSel.closest('.rule-condition-row').querySelector('.rule-cond-val'); const vals = FIELD_VALS[field] || []; valSel.innerHTML = vals.map((v,i) => `${v}`).join(''); const ruleId = fieldSel.closest('.rule-card').id.replace('rule-',''); updateCardSummary(ruleId); } function updateConnectorLabel(sel, ruleId) { updateCardSummary(ruleId); // update the conditions header label const card = document.getElementById('rule-'+ruleId); const allConns = card.querySelectorAll('.rule-connector select'); const lastConn = allConns[allConns.length - 1]; const label = card.querySelector('.rule-card-body > div:first-child span'); if (label && lastConn) { label.textContent = lastConn.value === 'AND' ? 'all of these must match (AND)' : 'any one is enough (OR)'; } } function updateRuleHeader(teamSel) { const card = teamSel.closest('.rule-card'); const ruleId = card.id.replace('rule-',''); const team = teamSel.value; const pill = card.querySelector('.rule-card-team'); pill.textContent = '→ ' + team; pill.className = 'rule-card-team ' + (TEAM_PILL[team] || '') + ' rule-card-team'; pill.style.cssText = 'border-radius:3px;font-size:0.6rem;padding:0.1rem 0.5rem;'; const desc = document.getElementById('team-desc-' + ruleId); if (desc) desc.textContent = TEAM_DESCS[team] || ''; updateCardSummary(ruleId); } function updateCardSummary(ruleId) { const card = document.getElementById('rule-' + ruleId); if (!card) return; const rows = card.querySelectorAll('.rule-condition-row'); const parts = []; rows.forEach((row, i) => { const conn = i > 0 ? row.querySelector('.rule-connector select')?.value + ' ' : ''; const field = row.querySelector('.rule-cond-field')?.value || ''; const op = row.querySelector('.rule-cond-op')?.value || '='; const val = row.querySelector('.rule-cond-val')?.value || ''; parts.push(conn + field + ' ' + op + ' ' + val); }); const team = card.querySelector('.rule-then-select')?.value || ''; const summary = card.querySelector('.rule-card-summary'); if (summary) summary.textContent = 'If ' + parts.join(' ') + ' → ' + team; } function addRule() { ruleCounter++; const id = ruleCounter; const div = document.createElement('div'); div.className = 'rule-card'; div.id = 'rule-' + id; div.innerHTML = `
Rule ${document.querySelectorAll('.rule-card').length + 1} If intent = Buyer → Team A → Team A
Conditions — all of these must match (AND)
→ Then route to Senior Sales · High-value buyers · Commercial leads
`; document.getElementById('ruleList').appendChild(div); div.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } function reindexRules() { document.querySelectorAll('.rule-card').forEach((card, i) => { const num = card.querySelector('.rule-card-num'); if (num) num.textContent = 'Rule ' + (i + 1); }); }