From 6828ecfeb319307e037ad934af402febe79190fc Mon Sep 17 00:00:00 2001 From: wasrusgen Date: Mon, 1 Jun 2026 07:38:32 +0300 Subject: [PATCH] =?UTF-8?q?ui:=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=B9=20=D0=B4=D0=B0=D1=88=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=D0=B4=20=E2=80=94=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B?= =?UTF-8?q?=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=B5=D0=BA,=20=D1=81=D1=82=D0=B5=D0=BF?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=20=D0=B2=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/crm.html | 55 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/docs/crm.html b/docs/crm.html index 89919f4..087be7b 100644 --- a/docs/crm.html +++ b/docs/crm.html @@ -37,12 +37,20 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ .main{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0} .scroll{flex:1;overflow-y:auto;padding:24px 28px} /* Dashboard */ -.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:22px} -.kpi{background:var(--white);border:1.5px solid var(--border);border-radius:14px;padding:20px} -.kpi-v{font-family:'Montserrat';font-weight:800;font-size:30px;color:var(--ink);letter-spacing:-1px} -.kpi-l{font-size:12px;color:var(--muted);margin-top:4px} -.kpi-sub{font-size:11px;color:var(--primary);font-weight:600;margin-top:6px} -.sec-h{font-family:'Montserrat';font-weight:800;font-size:18px;color:var(--ink);margin-bottom:14px} +.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px} +.kpi{background:var(--white);border:1.5px solid var(--border);border-radius:10px;padding:13px 16px} +.kpi-v{font-family:'Montserrat';font-weight:800;font-size:23px;color:var(--ink);letter-spacing:-.5px;line-height:1.1} +.kpi-l{font-size:11px;color:var(--muted);margin-top:3px} +.kpi-sub{font-size:10.5px;color:var(--primary);font-weight:600;margin-top:4px} +.sec-h{font-family:'Montserrat';font-weight:800;font-size:15px;color:var(--ink);margin-bottom:9px;margin-top:6px} +.cl-row{display:flex;align-items:center;gap:12px;cursor:pointer;padding:10px 14px;border-top:1px solid var(--bg)} +.cl-row:first-child{border-top:none} +.cl-row:hover{background:#FAFBFC} +.mini-chip{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap;display:inline-block} +.tbl{background:var(--white);border:1px solid var(--border);border-radius:12px;padding:0;margin-bottom:14px;overflow:hidden} +.tbl-row{display:flex;align-items:center;gap:12px;cursor:pointer;padding:9px 14px;border-top:1px solid var(--bg)} +.tbl-row:first-child{border-top:none} +.tbl-row:hover{background:#FAFBFC} /* Pipeline kanban */ .kanban{display:flex;gap:12px;overflow-x:auto;padding-bottom:8px;align-items:flex-start} .kcol{flex:1;min-width:200px;background:#eef0f3;border-radius:12px;padding:10px} @@ -191,7 +199,7 @@ function renderDashboard(){ ${renderRevenueChart()} ${renderUpcomingTasks()}
Все клиенты · ${total}
- ${projects.map(p=>renderClientRow(p)).join("")||'
Создайте первого клиента
'}`; + ${projects.length?`
${projects.map(p=>renderClientRow(p)).join("")}
`:'
Создайте первого клиента
'}`; } const STAGE_DEFS=[{key:"interview",name:"Интервью"},{key:"methods",name:"Методологии"},{key:"canvas",name:"Стратегия"},{key:"idef0",name:"Функции"},{key:"spec",name:"ТЗ"}]; function clientStages(p){ @@ -216,20 +224,33 @@ function stepper(p){ return `
${dots}
Этап: ${st.label} · ${st.cnt}/5
`; } +function stepperInline(p,st){ + st=st||clientStages(p); + let dots=""; + STAGE_DEFS.forEach((s,i)=>{ + const isDone=st.done[i], isCur=!st.all&&i===st.cur; + const bg=isDone?"#047857":isCur?"#10B981":"#E5E7EB"; + const ring=isCur?"box-shadow:0 0 0 2.5px rgba(16,185,129,.25);":""; + dots+=``; + if(i`;} + }); + const col=st.all?"#047857":"#10B981"; + return `
${dots}Этап: ${st.label} · ${st.cnt}/5
`; +} function renderClientRow(p){ const pc=pipeMap[(p.crm&&p.crm.pipeline)||"lead"]; const billing=(p.crm&&p.crm.billing_type)||"paid"; const bChip=billing==="free" - ?`🎁 Бесплатный` - :`💰 Платный`; - return `
-
${esc((p.client_name||'?')[0])}
+ ?`🎁 Беспл.` + :`💰 Платный`; + return `
+
${esc((p.client_name||'?')[0])}
-
${esc(p.client_name)}${bChip}
-
${esc(p.niche)} · ${p.msg_count} сообщений
- ${stepper(p)} +
${esc(p.client_name)}${bChip}${esc(p.niche)} · ${p.msg_count} сообщ.
+ ${stepperInline(p)}
-
${pc[1]}${money((p.crm&&p.crm.deal_amount)||0)}
+ ${pc[1]} + ${money((p.crm&&p.crm.deal_amount)||0)}
`; } @@ -243,7 +264,7 @@ function renderRevenueChart(){ const lbl=k=>{const[y,m]=k.split("-");return MN[+m-1]+" "+y.slice(2)}; const totalRev=keys.reduce((s,k)=>s+months[k],0); return `
📈 Выручка по месяцам · ${money(totalRev)}
-
${keys.map(k=>`
${(months[k]/1000).toFixed(0)}к
${lbl(k)}
`).join("")}
`; +
${keys.map(k=>`
${(months[k]/1000).toFixed(0)}к
${lbl(k)}
`).join("")}
`; } function renderUpcomingTasks(){ const today=new Date().toISOString().slice(0,10); @@ -252,7 +273,7 @@ function renderUpcomingTasks(){ all.sort((a,b)=>(a.due||"9999")<(b.due||"9999")?-1:1); const top=all.slice(0,6); if(!top.length)return""; - return `
📌 Ближайшие задачи · ${all.length}
${top.map(t=>`
${esc(t.text)}${esc(t.client)}${t.due?`${t.due===today?'сегодня':t.due`:''}
`).join("")}`; + return `
📌 Ближайшие задачи · ${all.length}
${top.map(t=>`
${esc(t.text)}${esc(t.client)}${t.due?`${t.due===today?'сегодня':t.due`:''}
`).join("")}
`; } function renderPipeline(){ document.getElementById("view").innerHTML=`
Воронка продаж
${PIPE.map(([k,name,col])=>{