MakelyOS

Employee Workstation v17
WORKER · MARIA
M

Good morning, Maria

Sunday, May 24 · 10 businesses assigned · 3 priorities today
M
Maria · #2 this month 🥈
🔥 6-day streak · Silver Closer · 87% close rate
Posts approved
142
Deals closed
18
Calls today
24
Total points
3,420
🏆 This Month's Leaderboard
🥇
Lisa Park
4,180 pts · 22 closes
🥈
Maria (you)
3,420 pts · 18 closes
🥉
Sarah Chen
2,890 pts · 14 closes
🎉
First Close
earned
🔥
5-day Streak
earned
🥈
Silver Closer
earned
📞
100 Calls
earned
🥇
Gold Closer
5 more closes
💎
VIP Tier Mover
0/1
🚀
10-day Streak
4 more days
🏆
Top of Month
760 pts to #1
🎁 Next reward at Gold Closer: $500 bonus + custom VIP badge + restaurant dinner with Boss
TODAY'S 3 PRIORITIES
URGENT · DUE 11 AM
Post weekend special
Bella Vista Spa · Orlando, FL
PENDING APPROVAL
12 client posts ready
Approve or edit before 5pm
COMPLETED · 14 OF 17
Daily standup done
3 carry-over to Monday
Posts today
14
↑ 22%
Pending
12
↓ 4
Healthy
5
/ 10
Avg visibility
87%
↑ 3 pts
10 of 10 businesses

🌐
Websites — active of
Latest post:

Relationship Overview

Revenue & Billing

💰 Client Wallet

💳 Payment History

📊 Payment Analytics

Quantum insights

📝 Posting Studio Command

🎁 Extras & Exchanges

Vertical Performance

Services & Entitlements

Package Includes

⭐ Recommended Upsells

📝
E-Signature Document Center
Send contract, payment authorization, package change, or new business form — client signs with one tap

Next Best Action

Setup Progress

Performance Snapshot

last 30 days

⚠️ Complaints & Resolutions

📝 Activity Log & Comments

Timeline

Risk & Opportunity

🌐 Websites

Active
0
Posts left
0
Total Views
0
Total Calls
0
Bookings
0

Quick View

Team Chat

4 online · 3 unread
Via:
Done
⚠️

Are you sure?

This action cannot be undone.

💰 Wallet Top-Up
Add Credit to
Pick an amount or enter custom · Credit lands instantly · Burns against monthly invoice + per-post publishing
Current Balance
$0
New Balance
$100
Quick Pick
Custom Amount
💡 Credit auto-applies to next invoice + posting credits. Burns ~1 month at $599/mo. Per-post publish: $1-4/site depending on tier.

📞 Contact for Payment

Pick channel + language. Pre-written template fills with client's info. Click → opens native app with message ready.

💰 Apply Discount to Next Bill/Receipt

Pick a percentage discount or free months. Applies to the next document you print.

📄 Choose document language

The bill/receipt will be generated and saved in this language.

🌐 Lang:
`; const w = window.open('', 'clientview-'+c.id+'?t='+Date.now()); w.document.open(); w.document.write(html); w.document.close(); showToast(`Client view opened for ${c.name} · ${ps.remaining}/${ps.quota} posts remaining`); } let __activeYear = 'recent'; function setPaymentYear(y) { __activeYear = y; renderDetail(); } function printBill(langOverride) { if (!langOverride) { pickPrintLanguage(() => printBill('en')); return; } const c = currentClient; const amount = c.open_balance > 0 ? c.open_balance : c.monthly; const due = formatDate(c.next_invoice); const refCode = c.id.replace('PRF-','') + Math.floor(Math.random()*9000+1000); const sales = { name:'Lisa Park', title:'Sales Agent', phone:'(407) 555-0900', email:'lisa@makelyos.com' }; const t = TRANSLATIONS[langOverride] || TRANSLATIONS.en; /* v18 — savings calc (shows WAS / YOU SAVE only when discount active) */ let __was = null, __save = null; if (__activeDiscount?.kind === 'pct') { const orig = amount / (1 - __activeDiscount.value/100); __was = orig.toFixed(2); __save = (orig - amount).toFixed(2); } else if (__activeDiscount?.kind === 'fm') { __save = (c.monthly * __activeDiscount.value).toFixed(2); __was = (amount + parseFloat(__save)).toFixed(2); } /* v18 — clickable PDF deep-links (preserve as live anchors when printed to PDF) */ const phoneDigits = sales.phone.replace(/\D/g,''); const payUrl = `https://pay.makelyos.com/INV-${refCode}`; const _sms = `sms:+1${phoneDigits}?&body=${encodeURIComponent(`Hi ${sales.name.split(' ')[0]}, re: INV-${refCode} for $${amount} due ${due}.`)}`; const _tel = `tel:+1${phoneDigits}`; const _mail = `mailto:${sales.email}?subject=${encodeURIComponent(`Invoice #INV-${refCode}`)}&body=${encodeURIComponent(`Hi ${sales.name.split(' ')[0]},\n\nRe: Invoice #INV-${refCode} for $${amount}.\nView + pay: ${payUrl}\n\nThank you,\n${c.owner_name}`)}`; const _tg = `https://t.me/share/url?url=${encodeURIComponent(payUrl)}&text=${encodeURIComponent(`Invoice #INV-${refCode} · $${amount} · MakelyOS`)}`; const _wa = `https://wa.me/1${phoneDigits}?text=${encodeURIComponent(`Hi ${sales.name.split(' ')[0]}, re: INV-${refCode} for $${amount}. ${payUrl}`)}`; const _zelle = `https://www.zellepay.com/`; const html = ` ${t.invoice} — ${c.name} ${premiumDocBase('invoice','#6C7CFF','#8A5CFF')}
M

MakelyOS

${t.tagline}

${t.invoice}

${t.issued} ${formatDate(new Date().toISOString())}

#INV-${refCode}
${sales.name.split(' ').map(n=>n[0]).join('')}
${t.your_sales_agent}
${sales.name} · ${sales.title}
📞 ${sales.phone} · ✉️ ${sales.email}
${t.bill_to}
${c.name}

${c.owner_name}
${c.street_num} ${c.street}
${c.city}, ${c.state} ${c.zip}
${c.email}
${c.phone}

${t.invoice_details}

${t.issue_date}: ${formatDate(new Date().toISOString())}
${t.due_date}: ${due}
${t.account}: ${c.id}
${t.package_lbl}: ${c.package}

⚡ ${t.total_due}
$${amount.toLocaleString()}
${__was ? `
Was $${__was}YOU SAVE $${__save}
` : ''}
${c.package} · 1 month · ${t.due_by} ${due}${__activeDiscount?` · ${__activeDiscount.label} APPLIED`:''}
${c.open_balance>0 && c.open_balance!==c.monthly ? `` : ''}
${t.description}${t.amount}
${c.package} ${t.subscription}
${c.package_features.slice(0,5).join(' · ')} · ${t.methods_accepted}: ${c.payment_methods.slice(0,4).join(' · ')}
$${c.monthly}.00
${t.balance_carried}
$${(c.open_balance-c.monthly).toFixed(2)}
⚡ Tap to Contact or Pay Now
All buttons stay clickable when printed to PDF · pay.makelyos.com/INV-${refCode}
⭐ ${t.exclusive_reward}

${t.refer_friend}

${t.refer_desc}

📩 payment@MakelyOS.com
🌐 Lang:
`; const w = window.open('','_blank?'+Date.now()); w.document.open(); w.document.write(html); w.document.close(); c.activity_log.unshift({when:new Date().toISOString().slice(0,16).replace('T',' '),who:'Maria',type:'system',text:`Generated bill PDF v13 (${langOverride}) · $${amount} · Sales: ${sales.name}`}); renderDetail(); showToast(`📄 v13 ${t.invoice} opened in ${langOverride.toUpperCase()}`); } function printReceipt() { const c = currentClient; const last = c.payment_history[0]; if (!last) { showToast('No payment to receipt'); return; } buildAndPrintReceipt(c, [last], 'single'); } function buildAndPrintReceipt(c, payments, mode, langOverride) { if (!langOverride) { pickPrintLanguage((lang) => buildAndPrintReceipt(c, payments, mode, lang)); return; } const t = TRANSLATIONS[langOverride] || TRANSLATIONS.en; const sales = { name:'Lisa Park', title:'Sales Agent', phone:'(407) 555-0900', email:'lisa@makelyos.com' }; const total = payments.reduce((s,p)=>s+p.amount,0); const refCode = c.id.replace('PRF-','') + Math.floor(Math.random()*9000+1000); const isMulti = payments.length > 1; /* v9: ALWAYS blur CC on print — only last 4 visible. Per Boss: "blur the credit card and only puts the last 5 numbers" */ const methodDetails = (p) => { let bits = []; if (p.cc_brand) bits.push(`${p.cc_brand} •••• ${p.cc_last4}`); if (p.check_number) bits.push(`${t.check_n} #${p.check_number} · ${p.check_bank}`); if (p.zelle_confirmation) bits.push(`Zelle conf: ${p.zelle_confirmation}`); if (p.paypal_email) bits.push(`PayPal: ${p.paypal_email}`); if (p.stripe_charge_id) bits.push(`Stripe ID: ••••${p.stripe_charge_id.slice(-6)}`); if (p.cash_split) bits.push(p.cash_split.length>1 ? `${t.cash_split} ${p.cash_split.length}` : 'Cash'); return bits.join(' · '); }; const lineRows = payments.map(p => `
${formatDate(p.date)} — ${p.method} · ${p.type}
Ref ${p.reference} · Agent ${p.sales_agent}${methodDetails(p) ? ' · ' + methodDetails(p) : ''}
+$${p.amount}.00 `).join(''); /* v18 — savings calc on receipt (shows WAS / YOU SAVED when discount was applied at print time) */ let __was = null, __save = null; if (__activeDiscount?.kind === 'pct') { const orig = total / (1 - __activeDiscount.value/100); __was = orig.toFixed(2); __save = (orig - total).toFixed(2); } else if (__activeDiscount?.kind === 'fm') { __save = (c.monthly * __activeDiscount.value).toFixed(2); __was = (total + parseFloat(__save)).toFixed(2); } /* v18 — clickable PDF deep-links */ const phoneDigits = sales.phone.replace(/\D/g,''); const payUrl = `https://pay.makelyos.com/RCT-${refCode}`; const _sms = `sms:+1${phoneDigits}?&body=${encodeURIComponent(`Hi ${sales.name.split(' ')[0]}, received RCT-${refCode} for $${total}. Thanks!`)}`; const _tel = `tel:+1${phoneDigits}`; const _mail = `mailto:${sales.email}?subject=${encodeURIComponent(`Receipt #RCT-${refCode}`)}&body=${encodeURIComponent(`Hi ${sales.name.split(' ')[0]},\n\nRe: Receipt #RCT-${refCode} for $${total}.\n\nThank you,\n${c.owner_name}`)}`; const _tg = `https://t.me/share/url?url=${encodeURIComponent(payUrl)}&text=${encodeURIComponent(`Receipt #RCT-${refCode} · $${total} · MakelyOS`)}`; const _wa = `https://wa.me/1${phoneDigits}?text=${encodeURIComponent(`Hi ${sales.name.split(' ')[0]}, received RCT-${refCode} for $${total}. Thank you!`)}`; const _zelle = `https://www.zellepay.com/`; const html = ` ${t.receipt} — ${c.name} ${premiumDocBase('receipt','#6C7CFF','#8A5CFF')}
M

MakelyOS

${t.tagline}

${t.receipt}

${t.issued} ${formatDate(new Date().toISOString())}

#RCT-${refCode}
${sales.name.split(' ').map(n=>n[0]).join('')}
${t.your_sales_agent}
${sales.name} · ${sales.title}
📞 ${sales.phone} · ✉️ ${sales.email}
${t.received_from}
${c.name}

${c.owner_name}
${c.street_num} ${c.street}
${c.city}, ${c.state} ${c.zip}
${c.email}
${c.phone}

${t.receipt_details}

${t.date}: ${formatDate(new Date().toISOString())}
${t.receipt_n}: R-${refCode}
${t.account}: ${c.id}
${t.payments_included}: ${payments.length}

✓ ${t.paid} · ${t.total_received}
$${total.toLocaleString()}
${__was ? `
Was $${__was}YOU SAVED $${__save}
` : ''}
${c.package} · ${payments.length} month${payments.length>1?'s':''} · ${isMulti ? t.consolidated : payments[0].type}${__activeDiscount?` · ${__activeDiscount.label} APPLIED`:''}
${lineRows}
${t.payment_details}${t.amount}
⚡ Tap to Contact or Pay Next Cycle
All buttons stay clickable when printed to PDF · pay.makelyos.com/RCT-${refCode}
⭐ ${t.exclusive_reward}

${t.refer_friend}

${t.refer_desc}

📩 payment@MakelyOS.com
🌐 Lang:
`; const w = window.open('','_blank?'+Date.now()); w.document.open(); w.document.write(html); w.document.close(); c.activity_log.unshift({when:new Date().toISOString().slice(0,16).replace('T',' '),who:'Maria',type:'system',text:`Generated v13 ${isMulti?`combined receipt PDF (${payments.length} payments)`:'receipt PDF'} · $${total} total`}); renderDetail(); showToast(`🧾 ${isMulti?'Combined receipt':'Receipt'} opened — print dialog ready`); } /* ═══ v8 helper functions ═══ */ function toggleBlur(el) { el.classList.toggle('revealed'); if (el.classList.contains('revealed')) { setTimeout(()=>el.classList.remove('revealed'), 5000); // auto-rehide after 5s } } function togglePayExpand(id) { if (!window.__payExpanded) window.__payExpanded = new Set(); if (window.__payExpanded.has(id)) window.__payExpanded.delete(id); else window.__payExpanded.add(id); renderDetail(); } function togglePaySelectMode() { window.__paySelectMode = !window.__paySelectMode; if (!window.__paySelectMode) window.__paySelected = new Set(); renderDetail(); } function togglePaySelect(id, checked) { if (!window.__paySelected) window.__paySelected = new Set(); if (checked) window.__paySelected.add(id); else window.__paySelected.delete(id); renderDetail(); } function clearSelection() { window.__paySelected = new Set(); renderDetail(); } function toggleSendMenu(btn) { document.querySelectorAll('.send-menu.open').forEach(m=>{if(m!==btn.nextElementSibling)m.classList.remove('open');}); btn.nextElementSibling.classList.toggle('open'); } document.addEventListener('click', e => { if (!e.target.closest('.send-popover')) { document.querySelectorAll('.send-menu.open').forEach(m=>m.classList.remove('open')); } }); function sendVia(channel, paymentId) { const c = currentClient; const p = c.payment_history.find(x=>x.id===paymentId); const channelName = {email:'Email',sms:'SMS',telegram:'Telegram',wechat:'WeChat',copy:'Clipboard',download:'Downloaded'}[channel]; const target = channel==='email'?c.email : (channel==='sms'||channel==='telegram'||channel==='wechat')?c.phone : 'clipboard'; c.activity_log.unshift({when:new Date().toISOString().slice(0,16).replace('T',' '),who:'Maria',type:'comm',text:`Sent receipt for ${formatDate(p.date)} payment ($${p.amount}) via ${channelName} → ${target}`}); renderDetail(); showToast(`✉️ Sent via ${channelName} → ${target}`); } function printSinglePayment(paymentId, kind) { const c = currentClient; const p = c.payment_history.find(x=>x.id===paymentId); if (!p) return; if (kind === 'receipt') buildAndPrintReceipt(c, [p], 'single'); else printBill(); } function printCombinedBill() { showToast('📄 Combined bill PDF — feature ready (mock — opens combined receipt for now)'); printCombinedReceipt(); } function printCombinedReceipt() { const selected = window.__paySelected || new Set(); if (selected.size === 0) { showToast('No payments selected'); return; } const c = currentClient; const payments = c.payment_history.filter(p=>selected.has(p.id)); buildAndPrintReceipt(c, payments, 'combined'); window.__paySelected = new Set(); window.__paySelectMode = false; renderDetail(); } /* ACTIVITY LOG ADD COMMENT */ function addLogComment() { const input = document.getElementById('logInput'); const text = input.value.trim(); if (!text) return; currentClient.activity_log.unshift({when:new Date().toISOString().slice(0,16).replace('T',' '),who:'Maria',type:'comm',text}); input.value = ''; renderDetail(); showToast('💬 Comment added to activity log'); } /* CHAT */ const CHAT_RECP=[{id:'ai',name:'🤖 MakelyOS AI',avatar:'🤖',online:true,unread:0,sub:'always available · 24/7'},{id:'boss',name:'Boss',avatar:'B',online:true,unread:1},{id:'admin',name:'Admin',avatar:'A',online:true,unread:0},{id:'manager',name:'Sarah',avatar:'S',online:true,unread:0,role:'Manager'},{id:'team',name:'Team',avatar:'👥',online:true,unread:2,sub:'4 online'},{id:'joel',name:'Joel',avatar:'J',online:false,unread:0},{id:'aisha',name:'Aisha',avatar:'A',online:true,unread:0}]; const CHAT_HIST={ai:[{who:'🤖 MakelyOS AI',text:'Hi Maria! I can help with: client questions, payment lookups, post drafting, complaint resolution suggestions, upsell scripts, or anything else. What do you need?',time:'now',dir:'in',ai:true}],boss:[{who:'Boss',text:'Maria — push the Bella Vista renewal pitch tomorrow',time:'9:22 AM',dir:'in'},{who:'Maria',text:'On it.',time:'9:24 AM',dir:'out'}],admin:[],manager:[{who:'Sarah',text:'Catering inquiries for Mama Rosa — please follow up',time:'Yesterday',dir:'in'}],team:[{who:'Aisha',text:'Anyone seen the Glow Beauty logo file?',time:'8:14 AM',dir:'in'},{who:'Joel',text:'I uploaded it last night',time:'8:16 AM',dir:'in'},{who:'Maria',text:'Found it, thanks Joel 👌',time:'8:18 AM',dir:'out'}],joel:[],aisha:[],telegram:[{who:'@MakelyOS_bot',text:'Telegram bridge ready',time:'now',dir:'in'}]}; /* v17 — iMessage-style reactions: 1 per emoji per person, track WHO clicked, show avatars */ /* Structure: { msgKey: { '👍': ['maria','joel'], '😊': ['sarah'], '🔥': [] } } */ const REACTIONS = {}; const CURRENT_USER = 'maria'; // logged-in user function getMsgKey(recp, idx) { return `${recp}-${idx}`; } function toggleReact(recp, idx, emoji) { const k = getMsgKey(recp, idx); if (!REACTIONS[k]) REACTIONS[k] = {}; if (!REACTIONS[k][emoji]) REACTIONS[k][emoji] = []; const list = REACTIONS[k][emoji]; const i = list.indexOf(CURRENT_USER); if (i >= 0) { list.splice(i,1); showToast(`Removed ${emoji}`); } else { list.push(CURRENT_USER); showToast(`Added ${emoji}`); } renderChat(); } function whoAvatars(list) { if (!list || list.length === 0) return ''; return `${list.map(u => `${u[0].toUpperCase()}`).join('')}`; } function aiRespond(userText) { const t = userText.toLowerCase(); if (t.match(/payment|invoice|bill|charge|paid|owe/)) return "💳 For payment questions: check the Payment History section on the client's profile. Each row expands to show full method details (card last-4, check #, Zelle confirmation). Use the COMBINE feature to bundle multiple payments into one consolidated PDF."; if (t.match(/renewal|renew|contract/)) return "📅 Renewal playbook: 30 days before renewal date, open the client → Next Best Action card. Pitch one upsell (Auto-Receptionist is the highest-fit). 14 days out, send DocuSign for new contract terms. 7 days out, personal call."; if (t.match(/complaint|unhappy|issue|problem|angry/)) return "⚠️ Complaint resolution: 1) Acknowledge within 1 hour. 2) Move to Complaints & Resolutions section, severity = high. 3) Tag Sarah (Manager) for major issues. 4) Offer one free month or extra service swap. 5) Follow up in 7 days to confirm resolved."; if (t.match(/post|publishing|content/)) return "✎ Post workflow: pick client → Websites section → pick the site → choose 📷 PUSH IMAGE or 📹 PUSH VIDEO. Max 4 posts per site per 24h (anti-spam). Site analytics show which sites perform best — push more to those."; if (t.match(/upsell|sell|pitch/)) return "💰 Upsell scripts available: Auto-Receptionist ($199/mo, fits restaurants + spas with high call volume), Review Booster ($79/mo), More DB88 sites (+$99/mo per 10). Open the client's Services section → click the upsell's 'Pitch' button to log it + send template email."; if (t.match(/credit card|card|stripe|zelle|paypal/)) return "💳 Payment methods supported: Zelle, Stripe, Credit Card (standalone), Card on file, Cash (with split option), Check (with bank/routing/account capture), PayPal. Each payment row in Payment History shows full method details when expanded. Card numbers are blurred until you click REVEAL CARD INFO."; if (t.match(/sales agent|lisa/)) return "👤 Lisa Park is the Sales Agent on all client docs (different from you — Maria, the Worker). Lisa's contact: (407) 555-0900 · lisa@makelyos.com. Both names appear on receipts: yours under 'Agent' on the payment row, Lisa's under 'Your Sales Agent' on the doc header."; if (t.match(/loyalty|tier|gold|platinum|points|reward/)) return "🏆 Client loyalty tiers: Bronze (0-2.5K pts) → Silver (2.5-5K) → Gold (5-10K) → Platinum (10-25K) → Diamond (25K+). Points come from tenure + LTV + on-time payments + referrals. Each tier unlocks better rewards."; if (t.match(/refer|referral|friend/)) return "🎁 Referral program: client refers a friend → both get 1 month FREE when friend signs up. Referral CTAs auto-appear on every bill + receipt PDF. Track per client in the Loyalty section."; if (t.match(/hello|hi|hey|good morning|good afternoon/)) return "👋 Hi Maria! Ready when you are. Ask me anything about clients, payments, posts, complaints, upsells, or workflows."; if (t.match(/thank|thanks/)) return "You got it! 🎯 Anything else?"; return `I hear you — "${userText.slice(0,60)}". Try asking me about: payments, renewals, complaints, posts, upsells, credit cards, sales agent Lisa, loyalty tiers, or referrals. I'm here 24/7.`; } let curRecp='team',curChan='internal'; function renderChat(){ document.getElementById('chatRecipients').innerHTML=CHAT_RECP.map(r=>`
${r.avatar} ${r.name}${r.online?'':''}${r.unread>0?`${r.unread}`:''}
`).join(''); const r=CHAT_RECP.find(x=>x.id===curRecp); document.getElementById('chatTitle').textContent=r?.name||'Chat'; document.getElementById('chatStatus').textContent=r?.sub||((r?.online?'online':'offline')+(r?.role?` · ${r.role}`:'')); const msgs=CHAT_HIST[curRecp]||[]; document.getElementById('chatMessages').innerHTML=msgs.length?msgs.map((m,idx)=>{ const k=getMsgKey(curRecp,idx); const rx=REACTIONS[k]||{}; const u=CURRENT_USER; const has = e => (rx[e]||[]).includes(u); const list = e => rx[e]||[]; const bubbleCls=m.ai?'ai-bubble':''; return `
${m.who}
${m.text}
${m.time}
` }).join(''):'

No messages yet.

'; setTimeout(()=>{const e=document.getElementById('chatMessages');e.scrollTop=e.scrollHeight;},50); } function toggleChat(){const p=document.getElementById('chatPanel');p.classList.toggle('open');if(p.classList.contains('open'))renderChat();} function openChat(id){curRecp=id;document.getElementById('chatPanel').classList.add('open');document.getElementById('helpMenu').classList.remove('open');renderChat();} function switchRecp(id){curRecp=id;renderChat();} function sendMessage(){ const i=document.getElementById('chatText');const t=i.value.trim();if(!t)return; if(!CHAT_HIST[curRecp])CHAT_HIST[curRecp]=[]; CHAT_HIST[curRecp].push({who:'Maria',text:t,time:'now',dir:'out'}); i.value='';renderChat(); showToast(curChan==='telegram'?'Sent via Telegram':'Sent'); // v15: AI agent responds intelligently if (curRecp==='ai') { // Show typing indicator setTimeout(()=>{ const m=document.getElementById('chatMessages'); m.insertAdjacentHTML('beforeend','
🤖 MakelyOS AI typing
'); m.scrollTop=m.scrollHeight; },300); setTimeout(()=>{ const typing=document.getElementById('aiTyping'); if(typing)typing.remove(); CHAT_HIST.ai.push({who:'🤖 MakelyOS AI',text:aiRespond(t),time:'now',dir:'in',ai:true}); renderChat(); }, 1200 + Math.random()*800); } else if (curRecp==='team') { setTimeout(()=>{CHAT_HIST.team.push({who:'Joel',text:'👍',time:'now',dir:'in'});renderChat();},1200); } } function mockAttach(k){if(!CHAT_HIST[curRecp])CHAT_HIST[curRecp]=[];CHAT_HIST[curRecp].push({who:'Maria',text:k==='photo'?'📷 photo.jpg':'📹 clip.mp4',time:'now',dir:'out'});renderChat();showToast(`${k==='photo'?'Photo':'Video'} attached`);} document.querySelectorAll('.chan-btn').forEach(b=>b.addEventListener('click',()=>{document.querySelectorAll('.chan-btn').forEach(x=>x.classList.remove('active'));b.classList.add('active');curChan=b.dataset.chan;})); document.getElementById('helpBtn').addEventListener('click',e=>{e.stopPropagation();document.getElementById('helpMenu').classList.toggle('open');}); document.addEventListener('click',()=>document.getElementById('helpMenu').classList.remove('open')); document.getElementById('searchBox').addEventListener('input',e=>{searchQuery=e.target.value;renderList();}); document.getElementById('sortBy').addEventListener('change',e=>{activeSort=e.target.value;renderList();}); document.getElementById('wsSearch').addEventListener('input',e=>{wsSearch=e.target.value;renderWebsites();}); document.getElementById('wsSort').addEventListener('change',e=>{wsSort=e.target.value;renderWebsites();}); document.getElementById('langPicker').addEventListener('change',e=>{currentLang=e.target.value;localStorage.setItem('mko_lang',currentLang);document.getElementById('greetTitle').textContent=`${t('good_morning')}, Maria`;renderFilterBar();renderList(); // v6 — also trigger Google Translate widget const gtSel=document.querySelector('select.goog-te-combo');if(gtSel){gtSel.value=currentLang;gtSel.dispatchEvent(new Event('change'));}}); document.getElementById('themePicker').addEventListener('change',e=>{document.body.dataset.theme=e.target.value;localStorage.setItem('mko_theme',e.target.value);}); document.getElementById('tronToggle').addEventListener('click',()=>{document.body.classList.toggle('tron-mode');const on=document.body.classList.contains('tron-mode');document.getElementById('tronToggle').textContent=on?'⚡ Tron ON':'⚡ Tron';localStorage.setItem('mko_tron',on);}); document.addEventListener('keydown',e=>{if((e.metaKey||e.ctrlKey)&&e.key==='k'){e.preventDefault();document.getElementById('searchBox').focus();}if(e.key==='Escape'){if(document.getElementById('chatPanel').classList.contains('open'))toggleChat();else if(document.getElementById('qvDrawer').classList.contains('open'))closeQuickView();else if(document.getElementById('view-detail').classList.contains('active'))showList();}}); currentLang=localStorage.getItem('mko_lang')||'en';document.getElementById('langPicker').value=currentLang; const sv=localStorage.getItem('mko_theme')||'makelyos';document.body.dataset.theme=sv;document.getElementById('themePicker').value=sv; if(localStorage.getItem('mko_tron')==='true'){document.body.classList.add('tron-mode');document.getElementById('tronToggle').textContent='⚡ Tron ON';} document.getElementById('greetTitle').textContent=`${t('good_morning')}, Maria`; renderFilterBar();renderList(); const hm=location.hash.match(/^#client\/(.+)/);if(hm)showDetail(hm[1]);
ESC to close
🔔Today's Focus
5
🚨
2 churn-risk clients flagged
Pure Zen Retreat · Serenity Lotus · review wallets
3 posts pending approval
Mindful Wellness · Bella Vista · Ocean Breeze
📅
Bella Vista Spa renews in 5 days
$699 · Premium Growth · auto-renew on
🏆
Lisa closed 22 deals this month
New monthly record · she's #1 on leaderboard
📞
Boss action: send legal pack to Michael B.
From morning briefing checklist · 1 of 5 pending
Press ⌘ K for quick jump
🌐 Lang: