feat(manager): typed blockers — client/tech/spec with icons and colors

This commit is contained in:
wasrusgen 2026-05-28 15:51:50 +03:00
parent fefa5f07f9
commit e86efb2727

View File

@ -1900,24 +1900,26 @@ function screenHome() {
var idx = all.indexOf(o); var idx = all.indexOf(o);
if (!o.isLead) { if (!o.isLead) {
// Блокер в заказе // Блокер в заказе
var hiTask = (_TASKS[3]||[]).filter(function(t){return !t.done && t.order===o.contract && t.hi;}); var bi = _blockerInfo(o);
var taskLabel = hiTask.length ? hiTask[0].text : o.blocker;
urgentHtml += urgentHtml +=
'<div style="margin:0 16px 10px;background:var(--card);border-radius:16px;overflow:hidden;box-shadow:0 3px 14px rgba(0,0,0,.09)">' '<div style="margin:0 16px 10px;background:var(--card);border-radius:16px;overflow:hidden;box-shadow:0 3px 14px rgba(0,0,0,.09)">'
+'<div style="height:3px;background:var(--warn)"></div>' +'<div style="height:3px;background:'+bi.bar+'"></div>'
+'<div style="padding:13px 14px 10px">' +'<div style="padding:13px 14px 10px">'
+'<div style="display:flex;align-items:center;gap:8px;margin-bottom:5px">' +'<div style="display:flex;align-items:center;gap:8px;margin-bottom:6px">'
+'<span style="font-size:15px;font-weight:700;color:var(--ink)">'+o.client+'</span>' +'<span style="font-size:15px;font-weight:700;color:var(--ink)">'+o.client+'</span>'
+'<span style="font-size:10px;background:#F1F5F9;color:#64748B;padding:2px 8px;border-radius:20px;font-weight:700">'+stN[o.stage||1]+'</span>' +'<span style="font-size:10px;background:#F1F5F9;color:#64748B;padding:2px 8px;border-radius:20px;font-weight:700">'+stN[o.stage||1]+'</span>'
+'</div>' +'</div>'
+'<div style="font-size:13px;font-weight:600;color:#92400E;margin-bottom:'+(o.techNote?'3px':'0')+'">⚠️ '+o.blocker+'</div>' +'<div style="display:inline-flex;align-items:center;gap:5px;background:'+bi.bg+';border-radius:8px;padding:5px 10px">'
+(o.techNote?'<div style="font-size:12px;color:var(--muted)">'+o.techNote+'</div>':'') +'<span style="font-size:14px">'+bi.icon+'</span>'
+'<span style="font-size:12px;font-weight:700;color:'+bi.color+'">'+bi.label+'</span>'
+'</div>'
+(o.techNote?'<div style="font-size:12px;color:var(--muted);margin-top:5px">'+o.techNote+'</div>':'')
+'</div>' +'</div>'
+'<div style="padding:0 14px 13px;display:flex;gap:8px">' +'<div style="padding:0 14px 13px;display:flex;gap:8px">'
+'<a href="tel:'+o.phone+'" onclick="event.stopPropagation()" style="flex:0 0 44px;height:40px;background:#EEF2FF;border-radius:10px;display:flex;align-items:center;justify-content:center;text-decoration:none">' +'<a href="tel:'+o.phone+'" onclick="event.stopPropagation()" style="flex:0 0 44px;height:40px;background:#EEF2FF;border-radius:10px;display:flex;align-items:center;justify-content:center;text-decoration:none">'
+'<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="#4338CA" stroke-width="2.5"><path d="M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07A19.5 19.5 0 013.07 9.81a19.79 19.79 0 01-3.07-8.67A2 2 0 012 1h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L6.09 8.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z"/></svg>' +'<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="#4338CA" stroke-width="2.5"><path d="M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07A19.5 19.5 0 013.07 9.81a19.79 19.79 0 01-3.07-8.67A2 2 0 012 1h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L6.09 8.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z"/></svg>'
+'</a>' +'</a>'
+'<button onclick="_openOrder('+idx+')" style="flex:1;height:40px;background:var(--warn);border:none;border-radius:10px;font-size:13px;font-weight:700;color:#fff;cursor:pointer">Разобрать блокер</button>' +'<button onclick="_openOrder('+idx+')" style="flex:1;height:40px;background:'+bi.bar+';border:none;border-radius:10px;font-size:13px;font-weight:700;color:#fff;cursor:pointer">'+bi.cta+'</button>'
+'</div>' +'</div>'
+'</div>'; +'</div>';
} else { } else {
@ -2157,7 +2159,8 @@ function screenHome() {
+'<span style="font-size:11px;font-weight:700;background:'+ldC2[o.leadStage]+';color:'+ldT2[o.leadStage]+';padding:3px 9px;border-radius:20px;flex-shrink:0">'+ldN2[o.leadStage]+'</span>' +'<span style="font-size:11px;font-weight:700;background:'+ldC2[o.leadStage]+';color:'+ldT2[o.leadStage]+';padding:3px 9px;border-radius:20px;flex-shrink:0">'+ldN2[o.leadStage]+'</span>'
+'</div>'; +'</div>';
} else { } else {
var hasB2 = !!o.blocker; var hasB2 = !!o.blocker || (o.tech && o.tech.some(function(t){return t.status==='waiting_client'||t.status==='client_chosen';}));
var bi2 = hasB2 ? _blockerInfo(o) : null;
allHtml += '<div onclick="_openOrder('+idx+')" style="display:flex;align-items:center;gap:11px;padding:11px 14px;'+(isLast?'':'border-bottom:1px solid rgba(0,0,0,.05)')+';cursor:pointer">' allHtml += '<div onclick="_openOrder('+idx+')" style="display:flex;align-items:center;gap:11px;padding:11px 14px;'+(isLast?'':'border-bottom:1px solid rgba(0,0,0,.05)')+';cursor:pointer">'
+'<div style="width:36px;height:36px;border-radius:10px;background:var(--bg);display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0">'+stIc[o.stage||1]+'</div>' +'<div style="width:36px;height:36px;border-radius:10px;background:var(--bg);display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0">'+stIc[o.stage||1]+'</div>'
+'<div style="flex:1;min-width:0">' +'<div style="flex:1;min-width:0">'
@ -2165,7 +2168,7 @@ function screenHome() {
+'<div style="font-size:11px;color:var(--muted)">'+o.contract+' · '+o.amount.toLocaleString('ru')+' ₽</div>' +'<div style="font-size:11px;color:var(--muted)">'+o.contract+' · '+o.amount.toLocaleString('ru')+' ₽</div>'
+'</div>' +'</div>'
+(hasB2 +(hasB2
? '<span style="font-size:10px;font-weight:700;background:#FFFBEB;color:#92400E;padding:3px 9px;border-radius:20px;flex-shrink:0">⚠ блокер</span>' ? '<span style="font-size:10px;font-weight:700;background:'+bi2.bg+';color:'+bi2.color+';padding:3px 9px;border-radius:20px;flex-shrink:0;white-space:nowrap">'+bi2.icon+' '+bi2.label+'</span>'
: '<span style="font-size:11px;font-weight:700;background:#EEF2FF;color:#4338CA;padding:3px 9px;border-radius:20px;flex-shrink:0">'+stN[o.stage||1]+'</span>') : '<span style="font-size:11px;font-weight:700;background:#EEF2FF;color:#4338CA;padding:3px 9px;border-radius:20px;flex-shrink:0">'+stN[o.stage||1]+'</span>')
+'</div>'; +'</div>';
} }
@ -2188,6 +2191,28 @@ function _homeToggleSched(){
document.getElementById('screen').innerHTML = renderScreen('manager_home'); document.getElementById('screen').innerHTML = renderScreen('manager_home');
document.getElementById('nav').innerHTML = navBar(); document.getElementById('nav').innerHTML = navBar();
} }
// ── Blocker classifier ────────────────────────────────────────────────────────
function _blockerInfo(o){
// Приоритет: реальное состояние техники > текст blocker
if(o.tech && o.tech.length){
var wc=o.tech.filter(function(t){return t.status==='waiting_client';}).length;
var cc=o.tech.filter(function(t){return t.status==='client_chosen';}).length;
if(cc>0) return {icon:'👆',color:'#059669',bg:'#ECFDF5',bar:'#059669',
label:'Клиент выбрал · подтвердить '+cc+' поз.',
cta:'Принять выбор'};
if(wc>0) return {icon:'⏳',color:'#D97706',bg:'#FEF3C7',bar:'#D97706',
label:'Ждём клиента · '+wc+' поз.',
cta:'Напомнить клиенту'};
}
var txt=(o.blocker||'').toLowerCase();
if(txt.indexOf('технолог')>=0) return {icon:'🔧',color:'#2563EB',bg:'#EFF6FF',bar:'#3B82F6',
label:o.blocker, cta:'Открыть заказ'};
if(txt.indexOf('техника')>=0) return {icon:'⚙️',color:'#D97706',bg:'#FFFBEB',bar:'#F59E0B',
label:o.blocker, cta:'Разобрать блокер'};
return {icon:'⚠️',color:'#92400E',bg:'#FFFBEB',bar:'var(--warn)',
label:o.blocker||'Блокер', cta:'Разобрать блокер'};
}
function _openOrder(i){ function _openOrder(i){
window._activeOrder=i; window._activeOrder=i;
var o=window._managerOrders[i]; var o=window._managerOrders[i];