PageSourceSearch

https://hub.avibox.ru/assets/SpendboardPage-DQ8U-4Dd.js

js avibox.ru collected 2026-09-24 15:12:23 UTC 95,001 bytes, 2 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/charts-B-02dpr1.js","assets/vendor-DUoYKxKf.js","assets/vendor-CJjU_8H4.css"])))=>i.map(i=>d[i]);
2import{dI as Ie,dw as h,eH as B,e7 as t,dB as n,dZ as oe,dE as E,em as f,ei as Le,dA as b,ed as $,eE as me,dF as R,er as o,b6 as gt,dy as e,eG as F,eJ as ve,aw as _t,dz as D,a$ as Ct,bF as Jt,aL as ae,ef as ge,d as $t,d0 as mt,ej as De,m as Bt,l as Qt,dY as vt,e3 as bt,o as es,f as ts,aO as Pt,cL as ft,eI as St,d$ as Ft,e5 as ss,T as At,eC as ns,de as ls,R as as,ey as os,aD as is,V as rs,cZ as cs,c_ as It,d1 as xt,bc as us,$ as ds,at as ps,aS as _s,cl as vs,eF as fs,dj as et,bf as hs,cX as gs,c$ as ms,b_ as bs,M as ys,aA as ws}from"./vendor-DUoYKxKf.js";import{s as ks,u as Cs}from"./vue-core-BW8FD41h.js";import{u as $s}from"./useProfileDataGathering-BX8sJpKa.js";import{M as Ae,u as Ps,D as Ss,A as As}from"./MetricCard-CYAsayzu.js";import{u as Mt,E as Is}from"./ErrorBoundary-rAZwpRiP.js";import{D as xs}from"./DataGatheringNotice-C5Fc0r-l.js";import{d as xe,C as Rs,P as at,_ as Ts,g as ke,ab as Ls,e as Ut,T as Es,aj as ot,a3 as yt,ao as Ds,a as zs}from"./index-BcPf-nBI.js";import{u as Gt,i as Ot,b as Ns}from"./profilesStatus-BWXj4f08.js";import{u as Ws}from"./analyticsContext-WDLi36gZ.js";import{N as Bs}from"./NoProfilesPlaceholder-C3zTMGVo.js";import{E as Vt}from"./ErrorState-D7_jXPui.js";import{_ as Rt}from"./EmptyState.vue_vue_type_script_setup_true_lang-DjSaEmUX.js";import{S as Fs}from"./Switch-BnZPS_Tw.js";import{T as Ms}from"./Tabs--mizgJz6.js";import{T as ze}from"./Tooltip-C2AfkjJp.js";import{T as Us}from"./Table-BWHKNJiS.js";import{O as Gs}from"./OpenInAdsPowerButton-BpN0mnzD.js";import{S as Os}from"./StatusAccent-ajQu-1gk.js";import{S as Vs}from"./SkeletonKpiCard-CwlkNH_B.js";import{C as Tt}from"./Card-CNz1-7s7.js";import{T as Ks}from"./TableSkeleton-BwGktCDA.js";import{u as Lt}from"./usePersistentSetting-CkvRMRs-.js";import{r as Kt,l as Ht,c as qt,d as Yt}from"./pdfExport-D9GHhCKl.js";import{u as Hs}from"./useIntroPopup-joFO-7tM.js";import qs from"./DevelopmentWarningPopup-iKdzfGjN.js";import{u as Ys}from"./useToast-DR0vBTf1.js";import"./calls-9oL8K9IS.js";import"./messages-CQYA5HES.js";import"./AiIcon.vue_vue_type_script_setup_true_lang-815rqO-m.js";import"./NoDataMessage-DJLo0zyQ.js";import"./UnreadBadge-DVxpEG74.js";import"./CopyButton.vue_vue_type_script_setup_true_lang-DUqHItUu.js";import"./clipboard-Dw6gfW3R.js";import"./ProfileAvatar-B9TVcWCe.js";import"./avatar-placeholder-MmQ9fg6u.js";import"./adspower-Bxg70lAO.js";import"./useAdspower-B86JrdTI.js";const Xs=["aria-label"],js=Ie({__name:"SignalBadge",props:{signal:{}},setup(P){const v=P,i={A:{tone:"danger",description:"Стоимость обращения (CPL) за последние 7 дней выросла минимум в 1.5 раза по сравнению с уровнем предыдущих 2 недель этого же объявления — лид дорожает, стоит разобраться в причине или скорректировать ставку."},B:{tone:"warning",description:"Конверсия в обращение (CR) за последние 7 дней упала минимум на 40% от уровня предыдущих 2 недель этого же объявления — те же показы стали хуже превращаться в обращения."},C:{tone:"danger",description:"Стоимость обращения (CPL) за последние 7 дней минимум в 2 раза выше медианы похожих объявлений в вашем пространстве (7-дневная медиана) — явный аутсайдер по цене среди своих же."},D:{tone:"warning",description:"Просмотры за последние 7 дней упали минимум вдвое (в среднем за день) от темпа предыдущих 2 недель — похоже, аудитория объявления «выгорела» либо упала позиция в выдаче."},F:{tone:"danger",description:"Обращение обходится дороже 30% цены товара в объявлении — продвигать его в текущем виде невыгодно: цена или ставка того не стоят."},G:{tone:"success",description:"Конверсия в обращение (CR) минимум в 1.5 раза выше медианы похожих объявлений, а показов не больше, чем у медианного объявления в категории — есть куда расти, стоит увеличить бюджет продвижения."}}
2,p=h(()=>i[v.signal]??{tone:"neutral",description:v.signal});return(L,q)=>{const Z=Le("tooltip");return B((t(),n("span",{class:oe(["signal-badge",`signal-badge--${p.value.tone}`]),"aria-label":`Сигнал ${L.signal}: ${p.value.description}`},[E(f(L.signal),1)],10,Xs)),[[Z,{width:300,content:p.value.description}]])}}}),Zs=xe(js,[["__scopeId","data-v-64ef1526"]]),Js=["width","height","viewBox","aria-label"],Qs=["points","stroke"],en=["y1","x2","y2"],tn=Ie({__name:"Sparkline",props:{points:{},metric:{},width:{default:80},height:{default:24}},setup(P){const v=P,i=h(()=>v.points.length?v.metric==="cpl"?v.points.map(r=>r.cpl_rub??0):v.points.map(r=>r.views):[]),p=h(()=>i.value.length<2),L=h(()=>{const r=i.value;if(r.length<2)return"flat";const J=r[0],d=r[r.length-1]-J,z=(J||1)*.05;return Math.abs(d)<z?"flat":d>0?"up":"down"}),q=h(()=>i.value.length<2?"neutral":v.metric==="cpl"?L.value==="up"?"danger":L.value==="down"?"success":"neutral":L.value==="down"?"warning":L.value==="up"?"success":"neutral"),Z=h(()=>{switch(q.value){case"danger":return"var(--color-danger)";case"warning":return"var(--color-warning)";case"success":return"var(--color-success)";default:return"var(--color-text-muted)"}}),Q=h(()=>{const r=i.value;if(r.length<2)return null;const J=Math.min(...r),C=Math.max(...r),d=C-J||1,z=2,N=v.width,G=v.height;return r.map((se,te)=>{const ne=z+te/(r.length-1)*(N-z*2),ie=z+(C-se)/d*(G-z*2);return`${ne.toFixed(1)},${ie.toFixed(1)}`}).join(" ")}),Y=h(()=>{const r=v.metric==="cpl"?"CPL":"Просмотры",J=L.value==="up"?"растёт":L.value==="down"?"падает":"стабильно";return`Спарклайн ${r}: ${J}`});return(r,J)=>(t(),n("svg",{class:oe(["sparkline",`sparkline--${q.value}`]),width:r.width,height:r.height,viewBox:`0 0 ${r.width} ${r.height}`,role:"img","aria-label":Y.value,preserveAspectRatio:"none"},[Q.value?(t(),n("polyline",{key:0,points:Q.value,fill:"none",stroke:Z.value,"stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},null,8,Qs)):b("",!0),p.value?(t(),n("line",{key:1,x1:0,y1:r.height/2,x2:r.width,y2:r.height/2,stroke:"var(--color-border-default)","stroke-width":"1","stroke-dasharray":"3,3"},null,8,en)):b("",!0)],10,Js))}}),Xt=xe(tn,[["__scopeId","data-v-475e4076"]]),sn={key:0,class:"ad-hint",role:"status","aria-live":"polite"},nn={class:"ad-hint__text"},ln={class:"static-th",tabindex:"0"},an={class:"static-th",tabindex:"0"},on={class:"static-th",tabindex:"0"},rn={class:"static-th",tabindex:"0"},cn={class:"ad-cell"},un={class:"ad-cell__title"},dn={class:"spend-cell"},pn={class:"stacked-cell"},_n={key:0,class:"stacked-cell__secondary"},vn={class:"stacked-cell"},fn={class:"stacked-cell__primary"},hn={key:0,class:"stacked-cell__secondary"},gn={class:"signals-cell"},mn={key:0,class:"no-signals"},bn={key:1,class:"sparkline-placeholder"},yn={class:"row-actions"},wn=["href","aria-label"],kn=["aria-label","onClick"],Cn=["aria-label","onClick"],$n={class:"history-popup-title"},Pn={class:"history-popup-body"},Sn={class:"history-chart-wrap"},An={class:"history-popup-links"},In=["href"],Ue="Считается за скользящие последние 7 дней (обновление ~раз в час). Переключатель периода 7/30/90 наверху борда на эту колонку не влияет.",xn=Ie({__name:"AdsTable",props:{ads:{},sparklines:{},hasAdspower:{type:Boolean},currentPage:{},totalPages:{},isLoading:{type:Boolean},sort:{},highlightAdId:{}},emits:["request-sparkline","update:current-page","update:sort"],setup(P,{emit:v}){const i=P,p=v,{goToBoard:L}=Mt(),q=_=>{L("leadboard",{tab:"all",ad_id:String(_)})},Z={width:310,content:"Название объявления. Цветная точка слева — класс по эффективности расхода: красная — сливает бюджет (3+ предупреждающих сигнала, либо обращение дороже 30% цены товара), жёлтая — 2 предупреждающих сигнала, зелёная — перспективное (высокий CR, мало показов). Без точки — расход в норме или данных пока недостаточно для оценки (молодое или малобюджетное объявление). Расшифровка конкретной причины — в столбце «Сигналы» правее (буквы A–G)."},Q={width:300,content:`Расход на это объявление: присутствие (оплата размещения) + продвижение (буст показов), если оно включено. ${Ue} В отличие от CPL правее, здесь полный расход вместе с продвижением — наведите на саму цифру, чтобы увидеть разбивку по частям.`},Y={width:300,content:`Сколько раз показали объявление в выдаче и карточке товара. ${Ue} Стрелка вниз — просмотры заметно просели от обычного уровня этого же объявления (сравнение со средним темпом за предыдущие 2 недели). Это тот же исходный сигнал, что у автоматической классификации объявления (сигнал D в столбце «Сигналы»).`},r={width:300,content:`Обращения — звонки и сообщения от клиентов по этому объявлению, официальный счётчик Авито (тот же, что в кабинете Авито). ${Ue} Сумма по всем объявлениям профиля за тот же вид обращений — метрика «Лиды» в «Сводке профиля» выше, но там окно можно переключить на 30 дней.`},J={width:310,content:`Стоимость одного обращения (CPL) по этому объявлению — во сколько в среднем обходится один контакт клиента. ${Ue} Считается только по оплате размещения, без продвижения — поэтому «Расход 7д» этой строки ÷ «Контакты» вручную не сойдётся. Это CPL одного объявления, а не блендированный CPL всего профиля из «Сводки профиля» выше — тот усредняет весь расход (включая тариф) по всем обращениям сразу.`},C={width:300,content:`Конверсия в обращение (CR) — какая доля показов объявления закончилась обращением (звонком или сообщением). ${Ue} Участвует в сигнале G «перспективное»: CR минимум в 1.5 раза выше медианы категории при показах не больше медианных — таким объявлениям стоит долить бюджет.`},d={width:310,content:`Стоимость одной продажи (CPS) — «Расход 7д» этой строки ÷ число продаж за то же окно. Продажа — эффективный исход: ручной статус сделки, а если менеджер его Ð
2½Ðµ проставил — то, что определил AI-разбор звонка или чата. ${Ue} Без единой продажи за окно — прочерк.`},z={width:300,content:"Автоматические сигналы A–G по этому объявлению: отмечают рост стоимости обращения, падение просмотров или конверсии, а также объявления с потенциалом роста. Пересчитываются раз в час за скользящие последние 7 дней. Три и больше сигнала A–D (либо сигнал F) переводят объявление в класс «сливает бюджет» — красная точка слева от названия."},N={width:300,content:"Мини-график изменения стоимости обращения (CPL) день за днём. Всегда строится на 90 днях истории — не зависит от переключателя периода наверху борда. Кликните по строке объявления, чтобы открыть увеличенный график с историей просмотров и CPL."},G=h(()=>(i.sort??"severity:desc").split(":")[0]),se=h(()=>(i.sort??"severity:desc").split(":")[1]==="asc"?"asc":"desc"),te=_=>G.value!==_?Bt:se.value==="asc"?Qt:$t,ne=_=>{const A=G.value===_&&se.value==="desc"?"asc":"desc";p("update:sort",`${_}:${A}`)},ie=[{header:"Объявление",key:"title",minWidth:"240px",maxWidth:"360px"},{header:"Расход 7д",key:"spend",minWidth:"110px",ariaSortable:!0},{header:"Просмотры",key:"views",minWidth:"100px",ariaSortable:!0},{header:"Контакты",key:"contacts",minWidth:"90px",textAlign:"center",ariaSortable:!0},{header:"CPL ₽",key:"cpl",minWidth:"90px",ariaSortable:!0},{header:"CPS ₽",key:"cps",minWidth:"90px"},{header:"CR %",key:"cr",minWidth:"70px",ariaSortable:!0},{header:"Сигналы",key:"signals",minWidth:"130px"},{header:"90 дней",key:"sparkline",minWidth:"100px"},{header:"",key:"actions",width:"150px",textAlign:"right"}],ue=h(()=>i.ads.map(_=>({..._,id:_.ad_id}))),g=_=>_,ee=$(null),W=$(null);let X=null;const c=_=>_?`${Math.round(_).toLocaleString("ru-RU")} ₽`:"0 ₽",T=_=>{const A=Math.abs(_)%100,j=A%10;return A>10&&A<20?"продаж":j===1?"продажа":j>=2&&j<=4?"продажи":"продаж"},M=_=>_.classification==="wasteful_danger"||_.classification==="wasteful_warning",de=_=>_.views_baseline_self===null?!1:_.views_recent/7<(_.views_baseline_self??1/0)*.8,le=_=>{if(_.cpl_rub==null||!_.cpl_peer_median)return null;const A=_.cpl_rub/_.cpl_peer_median;return A>=1?A.toFixed(1):null};me(()=>i.ads,_=>{for(const A of _)i.sparklines[A.ad_id]||p("request-sparkline",A.ad_id)},{immediate:!0});const S=$(null);let y=null,O=null;function V(){y&&(y.classList.remove("ads-row--target"),y.style.removeProperty("background-color"),y.style.removeProperty("transition"),y=null);const _=i.highlightAdId;if(_==null||!S.value)return;const A=S.value.querySelector(`[data-row-id="${_}"]`);A&&(A.classList.add("ads-row--target"),A.style.transition="background-color var(--duration-slow) var(--ease-standard)",A.style.backgroundColor="color-mix(in srgb, var(--color-primary) 10%, transparent)",y=A,O!==_&&(A.scrollIntoView({block:"center",behavior:"smooth"}),O=_))}me(()=>[i.ads,i.highlightAdId],()=>{vt(V)},{immediate:!0});const we=$(!1);me(()=>[i.ads,i.currentPage],()=>{we.value=!1});const K=h(()=>i.highlightAdId==null||i.isLoading?!1:!i.ads.some(_=>_.ad_id===i.highlightAdId)),pe=h(()=>K.value&&!we.value),ce=()=>{we.value=!0},fe=_=>{ee.value=_};return me(ee,async _=>{if(!_){X==null||X.destroy(),X=null;return}await vt();const A=W.value;if(!A)return;const j=i.sparklines[_.ad_id]??[];if(j.length)try{const{Chart:u,LineController:_e,LineElement:Re,PointElement:be,LinearScale:Ce,CategoryScale:Ge,Legend:$e,Tooltip:Oe,Filler:Se}=await Ts(async()=>{const{Chart:a,LineController:x,LineElement:k,PointElement:re,LinearScale:We,CategoryScale:qe,Legend:Ke,Tooltip:He,Filler:Pe}=await import("./charts-B-02dpr1.js").then(Be=>Be.f);return{Chart:a,LineController:x,LineElement:k,PointElement:re,LinearScale:We,CategoryScale:qe,Legend:Ke,Tooltip:He,Filler:Pe}},__vite__mapDeps([0,1,2]));u.register(_e,Re,be,Ce,Ge,$e,Oe,Se),X==null||X.destroy();const Ee=j.map(a=>a.date.slice(5)),Ne=j.map(a=>a.cpl_rub??null),Ve=j.map(a=>a.views),s=getComputedStyle(document.documentElement),l=s.getPropertyValue("--color-danger").trim()||"#e53e3e",m=s.getPropertyValue("--color-primary").trim()||"#3b82f6";X=new u(A,{type:"line",data:{labels:Ee,datasets:[{label:"CPL ₽",data:Ne,borderColor:l,backgroundColor:"transparent",tension:.3,yAxisID:"yCpl",spanGaps:!0}
2,{label:"Просмотры",data:Ve,borderColor:m,backgroundColor:"transparent",tension:.3,yAxisID:"yViews"}]},options:{responsive:!0,interaction:{mode:"index",intersect:!1},scales:{yCpl:{position:"left",title:{display:!0,text:"CPL ₽"}},yViews:{position:"right",title:{display:!0,text:"Просмотры"},grid:{drawOnChartArea:!1}}},plugins:{legend:{position:"top"}}}})}catch{}}),(_,A)=>{const j=Le("tooltip");return t(),n("div",{class:"ads-table-wrap",ref_key:"wrapRef",ref:S},[pe.value?(t(),n("div",sn,[R(o(gt),{size:16,class:"ad-hint__icon"}),e("span",nn,"Объявление №"+f(_.highlightAdId)+" не на этой странице",1),R(Rs,{class:"ad-hint__dismiss","aria-label":"Скрыть подсказку",onClick:ce})])):b("",!0),R(Us,{columns:ie,data:ue.value,"current-page":_.currentPage,"total-pages":_.totalPages,"is-loading":_.isLoading,"aria-label":"Эффективность объявлений","sort-key":G.value,"sort-dir":se.value,"auto-height":"",onRowClick:fe,"onUpdate:currentPage":A[7]||(A[7]=u=>p("update:current-page",u))},{"header-title":F(({header:u})=>[B((t(),n("span",ln,[E(f(u),1)])),[[j,Z]])]),"header-spend":F(({header:u})=>[B((t(),n("button",{type:"button",class:oe(["sort-th",{"sort-th--active":G.value==="spend"}]),onClick:A[0]||(A[0]=ve(_e=>ne("spend"),["stop"]))},[e("span",null,f(u),1),(t(),D(De(te("spend")),{size:12,class:"sort-th__icon"}))],2)),[[j,Q]])]),"header-views":F(({header:u})=>[B((t(),n("button",{type:"button",class:oe(["sort-th",{"sort-th--active":G.value==="views"}]),onClick:A[1]||(A[1]=ve(_e=>ne("views"),["stop"]))},[e("span",null,f(u),1),(t(),D(De(te("views")),{size:12,class:"sort-th__icon"}))],2)),[[j,Y]])]),"header-contacts":F(({header:u})=>[B((t(),n("button",{type:"button",class:oe(["sort-th",{"sort-th--active":G.value==="contacts"}]),onClick:A[2]||(A[2]=ve(_e=>ne("contacts"),["stop"]))},[e("span",null,f(u),1),(t(),D(De(te("contacts")),{size:12,class:"sort-th__icon"}))],2)),[[j,r]])]),"header-cpl":F(({header:u})=>[B((t(),n("button",{type:"button",class:oe(["sort-th",{"sort-th--active":G.value==="cpl"}]),onClick:A[3]||(A[3]=ve(_e=>ne("cpl"),["stop"]))},[e("span",null,f(u),1),(t(),D(De(te("cpl")),{size:12,class:"sort-th__icon"}))],2)),[[j,J]])]),"header-cr":F(({header:u})=>[B((t(),n("button",{type:"button",class:oe(["sort-th",{"sort-th--active":G.value==="cr"}]),onClick:A[4]||(A[4]=ve(_e=>ne("cr"),["stop"]))},[e("span",null,f(u),1),(t(),D(De(te("cr")),{size:12,class:"sort-th__icon"}))],2)),[[j,C]])]),"header-cps":F(({header:u})=>[B((t(),n("span",an,[E(f(u),1)])),[[j,d]])]),"header-signals":F(({header:u})=>[B((t(),n("span",on,[E(f(u),1)])),[[j,z]])]),"header-sparkline":F(({header:u})=>[B((t(),n("span",rn,[E(f(u),1)])),[[j,N]])]),title:F(({row:u})=>[e("div",cn,[e("span",{class:oe(["cls-dot",`cls-dot--${g(u).classification}`])},null,2),B((t(),n("span",un,[E(f(g(u).title),1)])),[[j,g(u).title]]),g(u).is_in_monitoring_alert?B((t(),D(o(mt),{key:0,size:14,class:"ad-cell__alert","aria-label":"В алерте мониторинга «Дорогие лиды»"},null,512)),[[j,{width:300,content:"Профиль сейчас в активном алерте проверки «Дорогие лиды»: как минимум одно активное объявление старше 7 дней стоит по CPL заметно выше нормы (порог — обычно медиана категории ×2.5). Подробности — в разделе проверок профиля."}]]):b("",!0)])]),spend:F(({row:u})=>[e("div",dn,[e("span",null,f(c(g(u).spend_recent_rub)),1),g(u).spend_presence_rub||g(u).spend_promo_rub?(t(),D(ze,{key:0,width:240},{default:F(()=>[E(" Присутствие (оплата размещения): "+f(c(g(u).spend_presence_rub)),1),A[9]||(A[9]=e("br",null,null,-1)),E(" Продвижение (буст показов): "+f(c(g(u).spend_promo_rub)),1)]),_:2},1024)):b("",!0)])]),views:F(({row:u})=>[e("span",{class:oe(["views-val",{"views-val--falling":de(g(u))}])},[E(f(g(u).views_recent.toLocaleString("ru-RU"))+" ",1),de(g(u))?(t(),D(o($t),{key:0,size:13,class:"views-arrow"})):b("",!0)],2)]),contacts:F(({row:u})=>
2[E(f(g(u).contacts_recent),1)]),cpl:F(({row:u})=>[e("div",pn,[e("span",{class:oe(["stacked-cell__primary","cpl-val",{"cpl-val--red":M(g(u))}])},f(g(u).cpl_rub!==null?c(g(u).cpl_rub):"—"),3),le(g(u))?B((t(),n("span",_n,[E("×"+f(le(g(u)))+" медианы",1)])),[[j,{width:300,content:"Во сколько раз CPL этого объявления выше медианы похожих объявлений в категории — фиксированная 7-дневная медиана вашего пространства (сигнал C от ×2), переключатель периода на неё не влияет. Не путать с 30-дневной платформенной медианой в «Сводке профиля» выше — это разные величины, разное окно и разный состав."}]]):b("",!0)])]),cr:F(({row:u})=>[E(f(g(u).cr!==null?`${(g(u).cr*100).toFixed(2)}%`:"—"),1)]),cps:F(({row:u})=>[e("div",vn,[e("span",fn,f(g(u).cps_rub!==null?c(g(u).cps_rub):"—"),1),g(u).sales_count>0?(t(),n("span",hn,f(g(u).sales_count)+" "+f(T(g(u).sales_count)),1)):b("",!0)])]),signals:F(({row:u})=>[e("div",gn,[(t(!0),n(ae,null,ge(g(u).signals,_e=>(t(),D(Zs,{key:_e,signal:_e},null,8,["signal"]))),128)),g(u).signals.length?b("",!0):(t(),n("span",mn,"—"))])]),sparkline:F(({row:u})=>[_.sparklines[g(u).ad_id]?(t(),D(Xt,{key:0,points:_.sparklines[g(u).ad_id],metric:"cpl"},null,8,["points"])):(t(),n("span",bn))]),actions:F(({row:u})=>[e("div",yn,[g(u).avito_url?(t(),n("a",{key:0,href:g(u).avito_url,target:"_blank",rel:"noopener noreferrer",class:"row-action","aria-label":`Открыть «${g(u).title}» на Авито`,onClick:A[5]||(A[5]=ve(()=>{},["stop"]))},[R(o(_t),{size:14})],8,wn)):b("",!0),_.hasAdspower&&g(u).adspower_profile_id?(t(),D(Gs,{key:1,"adspower-profile-id":g(u).adspower_profile_id,tooltip:"Открыть в AdsPower",onClick:A[6]||(A[6]=ve(()=>{},["stop"]))},null,8,["adspower-profile-id"])):b("",!0),B((t(),n("button",{class:"row-action",type:"button","aria-label":`История метрик «${g(u).title}»`,onClick:ve(_e=>fe(u),["stop"])},[R(o(Ct),{size:14})],8,kn)),[[j,"История метрик за 90 дней"]]),B((t(),n("button",{class:"row-action",type:"button","aria-label":`Лиды по «${g(u).title}» на Лидборде`,onClick:ve(_e=>q(g(u).ad_id),["stop"])},[R(o(Jt),{size:14})],8,Cn)),[[j,"Лиды по этому объявлению → Лидборд"]])])]),_:1},8,["data","current-page","total-pages","is-loading","sort-key","sort-dir"]),ee.value?(t(),D(at,{key:1,"max-width":"720px",onClPopup:A[8]||(A[8]=u=>ee.value=null)},{title:F(()=>[e("div",$n,[R(o(Ct),{size:20}),e("span",null,"История метрик — "+f(ee.value.title),1)])]),default:F(()=>[e("div",Pn,[e("div",Sn,[e("canvas",{ref_key:"historyChartRef",ref:W,height:"220"},null,512)]),e("div",An,[ee.value.avito_url?(t(),n("a",{key:0,href:ee.value.avito_url,target:"_blank",rel:"noopener noreferrer",class:"history-link"},[R(o(_t),{size:14}),A[10]||(A[10]=E(" Открыть на Авито "))],8,In)):b("",!0)])])]),_:1})):b("",!0)],512)}}}),Rn=xe(xn,[["__scopeId","data-v-03b3ce41"]]),Tn={class:"action-card__head"},Ln={class:"action-card__title"},En={class:"action-card__spark"},Dn={key:1,class:"action-card__spark-ph"},zn={class:"action-card__metric"},Nn={class:"action-card__metric-main"},Wn={key:0,class:"action-card__metric-sub action-card__metric-sub--good"},Bn={class:"action-card__metric-main"},Fn={key:0,class:"action-card__metric-sub action-card__metric-sub--bad"},Mn={class:"action-card__impact"},Un=["href"],Gn=Ie({__name:"ActionCard",props:{ad:{},variant:{},points:{}},emits:["request-sparkline"],setup(P,{emit:v}){const i=P,p=v,L=C=>`${Math.round(C).toLocaleString("ru-RU")} ₽`,q=h(()=>i.ad.cpl_rub!=null?L(i.ad.cpl_rub):"—"),Z=h(()=>L(i.ad.potential_saving_rub)),Q=h(()=>i.ad.cr!=null?`${(i.ad.cr*100).toFixed(1)}%`:"—"),Y=h(()=>{const{cpl_rub:C,cpl_peer_median:d}=i.ad;return C==null||!d?null:(C/d).toFixed(1)}),r=h(()=>{const{cr:C,cr_peer_median:d}=i.ad;return C==null||!d?null:(C/d).toFixed(1)}),J=h(()=>({width:300,content:i.variant==="winner"?"В подборке «Требуют внимания»: топ объявлений с высокой конверсией в обращение (CR) — минимум в 1.5 раза выше медианы категории, но с показами Ð
2½Ðµ больше медианных. Считается за скользящие последние 7 дней; переключатель периода наверху борда на эту подборку не влияет.":"В подборке «Требуют внимания»: топ объявлений с самой высокой стоимостью обращения (CPL) относительно нормы — деньги тратятся, а результат не окупается. Считается за скользящие последние 7 дней; переключатель периода наверху борда на эту подборку не влияет."}));return bt(()=>{(!i.points||!i.points.length)&&p("request-sparkline",i.ad.ad_id)}),(C,d)=>{const z=Le("tooltip");return t(),n("div",{class:oe(["action-card",`action-card--${C.variant}`])},[R(Os,{tone:C.variant==="winner"?"success":"danger"},null,8,["tone"]),e("div",Tn,[B((t(),n("span",Ln,[E(f(C.ad.title),1)])),[[z,C.ad.title]]),B(R(o(gt),{size:13,class:"action-card__info","aria-label":"Откуда взялась эта рекомендация"},null,512),[[z,J.value]]),C.ad.is_in_monitoring_alert?B((t(),D(o(mt),{key:0,size:13,class:"action-card__alert"},null,512)),[[z,{width:300,content:"Профиль сейчас в активном алерте проверки «Дорогие лиды»: как минимум одно активное объявление старше 7 дней стоит по CPL заметно выше нормы (порог — обычно медиана категории ×2.5). Подробности — в разделе проверок профиля."}]]):b("",!0)]),e("div",En,[C.points&&C.points.length?(t(),D(Xt,{key:0,points:C.points,metric:C.variant==="winner"?"views":"cpl"},null,8,["points","metric"])):(t(),n("span",Dn))]),e("div",zn,[C.variant==="winner"?(t(),n(ae,{key:0},[e("span",Nn,"CR "+f(Q.value),1),r.value?B((t(),n("span",Wn,[E("×"+f(r.value)+" медианы",1)])),[[z,{width:300,content:"Во сколько раз конверсия (CR) этого объявления выше медианы похожих объявлений в категории — фиксированная 7-дневная медиана вашего пространства (сигнал G), переключатель периода на неё не влияет. Не путать с 30-дневной платформенной медианой в «Сводке профиля»."}]]):b("",!0)],64)):(t(),n(ae,{key:1},[e("span",Bn,"CPL "+f(q.value),1),Y.value?B((t(),n("span",Fn,[E("×"+f(Y.value)+" медианы",1)])),[[z,{width:300,content:"Во сколько раз CPL этого объявления выше медианы похожих объявлений в категории — фиксированная 7-дневная медиана вашего пространства (сигнал C от ×2), переключатель периода на неё не влияет. Не путать с 30-дневной платформенной медианой в «Сводке профиля» — это разные величины."}]]):b("",!0)],64))]),e("div",Mn,[C.variant==="winner"?(t(),n(ae,{key:0},[R(o(es),{size:14}),d[0]||(d[0]=e("span",null,"Недобор показов — стоит долить бюджет",-1))],64)):(t(),n(ae,{key:1},[R(o(ts),{size:14}),e("span",null,[d[1]||(d[1]=E("Экономия ")),e("strong",null,f(Z.value),1),d[2]||(d[2]=E(" при перебалансе"))])],64))]),C.ad.avito_url?(t(),n("a",{key:0,href:C.ad.avito_url,target:"_blank",rel:"noopener noreferrer",class:oe(["action-card__btn",`action-card__btn--${C.variant}`])},[E(f(C.variant==="winner"?"Долить бюджет":"Снизить ставку")+" ",1),R(o(_t),{size:13})],10,Un)):b("",!0)],2)}}}),Et=xe(Gn,[["__scopeId","data-v-6f015645"]]),On={key:0,class:"sps","aria-hidden":"true"},Vn={class:"sps__header"},Kn={class:"sps-grid"}
2,Hn={key:2,class:"sps","aria-label":"Сводка профиля"},qn={class:"sps__header"},Yn={class:"sps__window"},Xn={class:"sps-grid"},jn={class:"sps-cell"},Zn={class:"sps-cell"},Jn={class:"sps-cell"},Qn={class:"sps-cell"},el={class:"sps-cell"},Dt="Стоимость одной продажи: расход профиля за период ÷ число продаж. Продажа — эффективный исход: ручной статус сделки, а если менеджер его не проставил — то, что определил AI-разбор звонка или чата. Без единой продажи за период — прочерк.",zt="Какая доля расхода профиля уходит на объявления, которые сливают бюджет — деньги тратятся, а обращений нет или они выходят намного дороже нормы. Доля считается по деньгам: расход сливающих объявлений ÷ весь расход по объявлениям за выбранный период (без учёта тарифа аккаунта).",tl=Ie({__name:"SpendboardProfileSummary",props:{profileId:{},period:{}},setup(P){const v=P,i=$(!1),p=$(null),L=$(null),q=Gt(),Z={width:300,content:"«Медиана» делит похожих продавцов пополам: половина в категории тратит на обращение меньше этой суммы, половина — больше. Считается по всем профилям платформы в вашей категории за последние 30 дней — независимо от периода, выбранного на борде. Это другая медиана, чем в таблице объявлений ниже: там — по объявлениям вашего пространства за 7 дней, здесь — по профилям всей платформы за 30 дней."},Q=h(()=>v.period===90?30:v.period);async function Y(){const{signal:c}=q.next(),T=v.profileId;if(!T){p.value=null,L.value=null;return}i.value=!0,L.value=null;try{const{data:M}=await ke.get("/spendboard/profile-summary",{profile_id:T,period:Q.value},{signal:c});p.value=M}
2catch(M){if(Ot(M))return;p.value=null,L.value="Данные профиля временно недоступны. Попробуйте ещё раз."}finally{c.aborted||(i.value=!1)}}me(()=>[v.profileId,Q.value],()=>{Y()},{immediate:!0});const r=h(()=>{var c;return((c=p.value)==null?void 0:c.period_days)??Q.value});function J(c){const T=Math.abs(c)%100,M=T%10;return T>10&&T<20?"дней":M===1?"день":M>=2&&M<=4?"дня":"дней"}const C=h(()=>`за последние ${r.value} ${J(r.value)}`);function d(c){return c==null?"—":`${Math.round(c).toLocaleString("ru-RU")} ₽`}function z(c){return c==null?"—":c.toLocaleString("ru-RU")}function N(c){return c==null?"—":Number.isInteger(c)?`${c}%`:`${c.toFixed(1)}%`}function G(c,T){return c===null||T===null||c===T?"neutral":c<T?"good":"bad"}function se(c,T){var le;const M=(le=p.value)==null?void 0:le.peer;return!M||c==null?null:`${M.is_platform_fallback?"медиана платформы":`медиана категории «${M.category_name??"—"}»`}: ${T(c)}`}const te=h(()=>{var c,T,M;return G(((c=p.value)==null?void 0:c.blended_cpl_rub)??null,((M=(T=p.value)==null?void 0:T.peer)==null?void 0:M.blended_cpl_p50)??null)}),ne=h(()=>{var c,T;return se(((T=(c=p.value)==null?void 0:c.peer)==null?void 0:T.blended_cpl_p50)??null,d)}),ie=h(()=>{if(te.value==="good")return"success";if(te.value==="bad")return"danger"}),ue=h(()=>{var c,T,M;return G(((c=p.value)==null?void 0:c.wasteful_spend_share_pct)??null,((M=(T=p.value)==null?void 0:T.peer)==null?void 0:M.waste_share_p50)??null)}),g=h(()=>{var T;const c=(T=p.value)==null?void 0:T.peer;return c&&c.waste_share_p50===0?c.is_platform_fallback?"большинство профилей платформы не сливает бюджет (медиана 0%)":"большинство профилей категории не сливает бюджет (медиана 0%)":se((c==null?void 0:c.waste_share_p50)??null,N)}),ee=h(()=>{if(ue.value==="good")return"success";if(ue.value==="bad")return"danger"}),W=h(()=>{var M;const c=(M=p.value)==null?void 0:M.roi_pct;if(c==null)return Dt;const T=c>0?"+":"";return`${Dt} ROI за тот же период: ${T}${c.toFixed(1)}% — считается как (продажи × средний чек ÷ расход) × 100% − 100%.`}),X=h(()=>Q.value===30?`${zt} Список «сливающих» объявлений всегда определяется по сигналу за скользящие 7 дней — здесь он лишь применён к 30-дневному расходу.`:zt);return(c,T)=>{const M=Le("tooltip");return i.value?(t(),n("section",On,[e("div",Vn,[R(o(Pt),{size:18,class:"sps__header-icon"}),T[0]||(T[0]=e("span",{class:"sps__title"},"Сводка профиля",-1))]),e("div",Kn,[(t(),n(ae,null,ge(5,de=>R(Vs,{key:de})),64))])])):L.value?(t(),D(Vt,{key:1,class:"sps",title:"Не удалось загрузить сводку профиля",description:L.value,onRetry:Y},null,8,["description"])):p.value?(t(),n("section",Hn,[e("div",qn,[R(o(Pt),{size:18,class:"sps__header-icon"}),T[2]||(T[2]=e("span",{class:"sps__title"},"Сводка профиля",-1)),R(ze,{class:"sps__title-help",width:300},{default:F(()=>T[1]||(T[1]=[E("Денежные итоги профиля: сколько потратили, сколько получили обращений, во что обходится одно обращение (CPL) и как это соотносится с похожими профилями в категории (медиана). Окно — выбранный период борда (7 или 30 дней; 90 автоматически считается как 30 — часовых 90-дневных агрегатов пока нет).")])),_:1}),e("span",Yn,f(C.value),1)]),e("div",Xn,[e("div",jn,[R(Ae,{title:"Расход профиля",value:d(p.value.total_spend_rub),icon:"Wallet",tooltip:"Всё, что Авито списало с кошелька аккаунта за выбранный период (по вчерашний день включительно — сегодняшние траты Авито ещё не досчитал). Включает тариф, комиссии, размещение и продвижение объявлений — весь расход аккаунта целиком. Обычно больше, чем «Расход 7д» в KPI-карточках наверху и чем сумма по объявлениям в таблице ниже: там нет тарифа и комиссий."},null,8,["value"])]),e("div",Zn,[R(Ae,{title:"Лиды (контакты Авито)",value:z(p.value.total_leads),icon:"Users",tooltip:"Обращения клиентов (звонки и сообщения) по официальной статистике Авито — тот же счётчик, что в личном кабинете Авито. Сумма по всем объявлениям профиля за период, независимо от статуса объявления (активное, снятое, в архиве). Может не совпадать с «Обращениями» на Лидборде: там считаются наши чаты и звонки из базы AviBOX HUB, здесь — счётчик площадки."},null,8,["value"])]),e("div",Jn,[R(Ae,{title:"Blended CPL",value:d(p.value.blended_cpl_rub),icon:"Coins",status:ie.value,tooltip:"Средняя стоимость одного обращения по всему профилю: весь расход аккаунта за период ÷ все обращения Авито за тот же период. «Blended» — значит усреднено по всем объявлениям сразу, а не для одного объявления. Считает полный расход (включая тариф и продвижение), поэтому число обычно выше, чем CPL отдельного объявления в таблице ниже — там всегда 7 дней и только оплата размещения."},null,8,["value","status"]),ne.value?B((t(),n("p",{key:0,class:oe(["sps-peer",`sps-peer--${te.value}`])},[E(f(ne.value),1)],2)),[[M,Z]]):b("",!0)]),e("div",Qn,[R(Ae,{title:"CPS",value:d(p.value.cps_rub),icon:"CheckCircle",tooltip:W.value},null,8,["value","tooltip"])]),e("div",el,[R(Ae,{title:"% бюджета на неэффективных",value:N(p.value.wasteful_spend_share_pct),icon:"Percent",status:ee.value,tooltip:X.value},null,8,["value","status","tooltip"]),g.value?B((t(),n("p",{key:0,class:oe(["sps-peer",`sps-peer--${ue.value}`])},[E(f(g.value),1)],2)),[[M,Z]]):b("",!0)])])])):b("",!0)}}}),sl=xe(tl,[["__scopeId","data-v-87c2e2c7"]]),nl={key:0,class:"scb","aria-hidden":"true"},ll={class:"scb__header"},al={key:1,class:"scb","aria-label":"Расход по категориям"},ol={class:"scb__header"},il={class:"scb__window"},rl={class:"scb__table-wrap"},cl={class:"scb-table"},ul={class:"scb-table__name",tabindex:"0"},dl={class:"scb-table__num",tabindex:"0"},pl={class:"scb-table__num",tabindex:"0"},_l={class:"scb-table__num",tabindex:"0"},vl={class:"scb-table__num",tabindex:"0"},fl={class:"scb-table__num",tabindex:"0"},hl={class:"scb-table__num",tabindex:"0"},gl={class:"scb-table__num",tabindex:"0"},ml={class:"scb-table__num",tabindex:"0"},bl=["tabindex","aria-label","onClick","onKeydown"],yl={class:"scb-table__name"},wl={class:"scb-table__num"},kl={class:"scb-table__num"},Cl={class:"scb-share"},$l={class:"scb-share__pct"},Pl={class:"scb-share__bar"},Sl={class:"scb-table__num"},Al={class:"scb-table__num"},Il={class:"scb-table__num"},xl={class:"scb-table__num"},Rl={class:"scb-table__num"},Tl=Ie({__name:"SpendboardCategoryBreakdown",props:{profileId:{},period:{},selectedCategoryId:{}},emits:["select-category"],setup(P,{emit:v}){const i=P,p=v,L=$(!1),q=$(null),Z=Gt(),Q={width:300,content:"«Медиана» делит похожих продавцов пополам: половина в категории тратит на обращение меньше этой суммы, половина — больше. Считается по всем профилям платформы в вашей категории за последние 30 дней — независимо от периода, выбранного на борде. Другая медиана, чем в таблице объявлений на этой же странице: там — по объявлениям вашего пространства за 7 дней, здесь — по профилям всей платформы за 30 дней."},Y={width:300,content:"Категория объявлений по классификатору Авито (например, «Недвижимость», «Транспорт») — верхнеуровневая, не подкатегория. Показаны только категории, где был расход за выбранный период."},r={width:300,content:"Расход на объявления этой категории (присутствие + продвижение) за выбранный период. Без учёта тарифа и комиссий аккаунта — сумма всех строк таблицы обычно меньше, чем «Расход профиля» в сводке выше."},J={width:300,content:"Какую часть расхода по объявлениям (без тарифа) за период составляет эта категория. Считается от суммы всех категорий в этой таблице — 100% в сумме по всем строкам."},C={width:300,content:"Число обращений (звонков и сообщений) по объявлениям этой категории за выбранный период — официальный счётчик Авито, тот же, что и в «Сводке профиля» выше, только разбитый по категориям."},d={width:310,content:"Стоимость одного обращения (CPL) в этой категории: расход категории ÷ обращения категории за выбранный период. Отдельный blended-CPL для категории — не совпадает ни с CPL конкретного объявления в таблице ниже (там всегда 7 дней и только оплата размещения), ни с общим Blended CPL профиля в сводке выше."},z={width:300,content:"Какая доля расхода категории (за выбранный период) приходится на объявления, которые сливают бюджет. Список сливающих объявлений всегда определяется по сигналу за скользящие 7 дней — здесь эта классификация лишь применена к расходу категории за выбранный период."},N={width:300,content:"Доля обращений категории, которые закрылись продажей — эффективный исход: ручной статус сделки, а если менеджер его Ð
2½Ðµ проставил — то, что определил AI-разбор звонка или чата. Прочерк — если разборов за период меньше минимальной выборки (число слишком мало, чтобы доверять проценту)."},G={width:300,content:"Стоимость одной продажи в этой категории: расход категории ÷ число продаж (тот же эффективный исход, что и в колонке «Закрытие») за выбранный период. Без единой продажи — прочерк."},se=h(()=>i.period===90?30:i.period);async function te(){var O;const{signal:S}=Z.next(),y=i.profileId;if(!y){q.value=null;return}L.value=!0;try{const{data:V}=await ke.get("/spendboard/category-breakdown",{profile_id:y,period:se.value},{signal:S});q.value=V}catch(V){if(Ot(V))return;q.value=null,(O=V==null?void 0:V.response)==null||O.status}finally{S.aborted||(L.value=!1)}}me(()=>[i.profileId,se.value],()=>{te()},{immediate:!0});const ne=h(()=>{var S;return((S=q.value)==null?void 0:S.categories)??[]}),ie=h(()=>ne.value.length>=2),ue=h(()=>{var S;return((S=q.value)==null?void 0:S.period_days)??se.value});function g(S){const y=Math.abs(S)%100,O=y%10;return y>10&&y<20?"дней":O===1?"день":O>=2&&O<=4?"дня":"дней"}const ee=h(()=>`за последние ${ue.value} ${g(ue.value)}`);function W(S){return S==null?"—":`${Math.round(S).toLocaleString("ru-RU")} ₽`}function X(S){return S==null?"—":S.toLocaleString("ru-RU")}function c(S){return S==null?"—":Number.isInteger(S)?`${S}%`:`${S.toFixed(1)}%`}function T(S){return S==null?0:Math.min(100,Math.max(0,S))}function M(S){return S.category_id==null?S.category_name||"Без категории":S.category_name}function de(S){const{cpl_rub:y,peer_cpl_p50_rub:O}=S;return y==null||O==null||y===O?"neutral":y<O?"good":"bad"}function le(S){if(S.category_id!=null){if(i.selectedCategoryId===S.category_id){p("select-category",null);return}p("select-category",{id:S.category_id,name:S.category_name})}}return(S,y)=>{const O=Le("tooltip");return L.value?(t(),n("section",nl,[R(Tt,null,{default:F(()=>[e("div",ll,[R(o(ft),{size:18,class:"scb__header-icon"}),y[1]||(y[1]=e("span",{class:"scb__title"},"По категориям",-1)),R(ze,{class:"scb__title-help",width:300},{default:F(()=>y[0]||(y[0]=[E("Расход и стоимость обращения по категориям объявлений профиля за выбранный период (7 или 30 дней; 90 считается как 30). Показывается только если расход был минимум в двух категориях — для одной сравнивать не с чем.")])),_:1})]),R(Ks,{rows:4,columns:9,avatar:!1})]),_:1})])):ie.value?(t(),n("section",al,[R(Tt,null,{default:F(()=>[e("div",ol,[R(o(ft),{size:18,class:"scb__header-icon"}),y[3]||(y[3]=e("span",{class:"scb__title"},"По категориям",-1)),R(ze,{class:"scb__title-help",width:300},{default:F(()=>y[2]||(y[2]=[E("Расход и стоимость обращения по категориям объявлений профиля за выбранный период (7 или 30 дней; 90 считается как 30). Показывается только если расход был минимум в двух категориях — для одной сравнивать не с чем.")])),_:1}),e("span",il,f(ee.value),1)]),y[13]||(y[13]=e("p",{class:"scb__honest"}," Расход по объявлениям; расход аккаунта (тариф, комиссии) не распределяется по категориям ",-1)),e("div",rl,[e("table",cl,[e("thead",null,[e("tr",null,[B((t(),n("th",ul,y[4]||(y[4]=[E("Категория")]))),[[O,Y]]),B((t(),n("th",dl,y[5]||(y[5]=[E("Расход")]))),[[O,r]]),B((t(),n("th",pl,y[6]||(y[6]=[E("Доля")]))),[[O,J]]),B((t(),n("th",_l,y[7]||(y[7]=[E("Лиды")]))),[[O,C]]),B((t(),n("th",vl,y[8]||(y[8]=[E("CPL")]))),[[O,d]]),B((t(),n("th",fl,y[9]||(y[9]=[E("% слито")]))),[[O,z]]),B((t(),n("th",hl,y[10]||(y[10]=[E(" Медиана CPL категории ")]))),[[O,Q]]),B((t(),n("th",gl,y[11]||(y[11]=[E("Закрытие")]))),[[O,N]]),B((t(),n("th",ml,y[12]||(y[12]=[E("CPS")]))),[[O,G]])])]),e("tbody",null,[(t(!0),n(ae,null,ge(ne.value,V=>(t(),n("tr",{key:V.category_id??"none",class:oe(["scb-row",{"scb-row--clickable":V.category_id!=null,"scb-row--active":V.category_id!=null&&V.category_id===S.selectedCategoryId}]),tabindex:V.category_id!=null?0:void 0,"aria-label":V.category_id!=null?`Отфильтровать объявления по категории «${M(V)}»`:void 0,onClick:we=>le(V),onKeydown:[St(ve(we=>le(V),["prevent"]),["enter"]),St(ve(we=>le(V),["prevent"]),["space"])]},[e("td",yl,f(M(V)),1),e("td",wl,f(W(V.spend_rub)),1),e("td",kl,[e("div",Cl,[e("span",$l,f(c(V.spend_share_pct)),1
2),e("div",Pl,[e("div",{class:"scb-share__fill",style:Ft({width:T(V.spend_share_pct)+"%"})},null,4)])])]),e("td",Sl,f(X(V.leads)),1),e("td",{class:oe(["scb-table__num","scb-cpl",`scb-cpl--${de(V)}`])},f(W(V.cpl_rub)),3),e("td",Al,f(c(V.wasteful_spend_share_pct)),1),e("td",Il,f(W(V.peer_cpl_p50_rub)),1),e("td",xl,f(c(V.close_rate_pct)),1),e("td",Rl,f(W(V.cps_rub)),1)],42,bl))),128))])])])]),_:1})])):b("",!0)}}}),Ll=xe(Tl,[["__scopeId","data-v-6ba5a6c7"]]),pt=50;function El(P,v,i,p=$(null)){const L=$(!1),q=$(null),Z=$(!1),Q=$(!1),Y=$(!1),r=$(null),J=$(null),C=$(null),d=h(()=>r.value??J.value??C.value),z=Lt("spendboard","tab","wasteful"),N=Lt("spendboard","sort","severity:desc"),G=$([]),se=$({page:1,size:pt,total:0,pages:1}),te=$(1),ne=$([]),ie=$([]),ue=$([]),g=h(()=>v.value==null?null:ne.value.find(K=>K.id===v.value)??null),ee=h(()=>{var K;return((K=g.value)==null?void 0:K.wasteful_count)??0}),W=h(()=>{var K;return((K=g.value)==null?void 0:K.winner_count)??0}),X=h(()=>{var K;return((K=g.value)==null?void 0:K.total_ads)??0}),c=h(()=>{var K;return((K=g.value)==null?void 0:K.spend_7d_rub)??0}),T=h(()=>{var K;return((K=g.value)==null?void 0:K.potential_saving_rub)??0});let M=null,de=0;const le=()=>{M&&(M.abort(),M=null)},S=async(K=1)=>{const pe=P.value,ce=v.value;if(!pe||ce==null){G.value=[],se.value={page:1,size:pt,total:0,pages:1},Z.value=!1,r.value=null;return}le(),M=new AbortController,L.value=!0,r.value=null;try{const fe={space_id:pe,profile_id:ce,filter:z.value,period:i.value,page:K,size:pt,sort:N.value};p.value&&(fe.category=p.value);const{data:_}=await ke.get("/spendboard/ads",fe,{signal:M.signal});G.value=_.ads,se.value=_.meta,te.value=K,q.value=new Date,Z.value=!0}catch(fe){const _=fe.name;_!=="CanceledError"&&_!=="AbortError"&&(r.value="Не удалось загрузить объявления. Попробуйте ещё раз.")}finally{L.value=!1}},y=async()=>{const K=P.value,pe=v.value,ce=++de;if(!K){ne.value=[],Q.value=!1,Y.value=!1,J.value=null;return}Q.value=!0,Y.value=!1,J.value=null;try{const{data:fe}=await ke.get("/spendboard/profiles",{space_id:K,page:1,size:100,sort:"worst_first"});if(ce!==de)return;const _=fe.profiles??[],A=pe==null?null:_.find(j=>j.id===pe)??null;if(pe!=null&&!A&&(await ke.get("/spendboard/profile-summary",{profile_id:pe,period:7}),ce!==de)||ce!==de)return;ne.value=_,Y.value=!0}catch{if(ce!==de)return;J.value="Не удалось загрузить сводку профиля. Попробуйте ещё раз."}finally{ce===de&&(Q.value=!1)}},O=async()=>{const K=P.value,pe=v.value;if(!K||pe==null){ie.value=[],ue.value=[],C.value=null;return}C.value=null;try{const ce={space_id:K,profile_id:pe,period:i.value,page:1},[fe,_]=await Promise.all([ke.get("/spendboard/ads",{...ce,filter:"wasteful",size:3}),ke.get("/spendboard/ads",{...ce,filter:"winners",size:2})]);ie.value=fe.data.ads??[],ue.value=_.data.ads??[]}catch{C.value="Не удалось загрузить рекомендации. Попробуйте ещё раз."}},V=async(K,pe=90)=>{try{const{data:ce}=await ke.get(`/spendboard/ads/${K}/sparkline`,{days:pe});return ce}catch{return null}},we=()=>{y(),O(),S(1)};return me([z,i,v,N,p],()=>{te.value=1,S(1)},{immediate:!0}),me([P,v],()=>{y()},{immediate:!0}),me([v,i],()=>{O()},{immediate:!0}),{isLoading:L,lastUpdatedAt:q,adsLoaded:Z,profilesLoading:Q,profileSummaryLoaded:Y,loadError:d,ads:G,adsMeta:se,profiles:ne,currentSummary:g,worstAds:ie,bestAds:ue,currentPage:te,activeTab:z,sort:N,wastefulCount:ee,winnersCount:W,totalAds:X,totalSpend7d:c,totalPotentialSaving:T,fetchAds:S,fetchProfiles:y,fetchActionCards:O,fetchSparkline:V,refetch:we}}const Dl={wasteful:"Сливают бюджет",winners:"Перспективные",all:"Все объявления"},zl={wasteful_danger:"Сливает (критич.)",wasteful_warning:"Сливает",winner:"Перспективное",normal:"Норма",insufficient_data:"Мало данных"},Nl=[249,115,22],Wl=[253,232,232],Bl=[254,243,224],Fl=[228,248,233],tt=P=>typeof P=="number"?`${new Intl.NumberFormat("ru-RU").format(Math.round(P))} ₽`:"—",Ml=P=>P!=null?`${(P*100).toFixed(2)}%`:"—",Nt=(P,v)=>P.length>v?`${P.slice(0,v-1)}…`:P;async function Ul({spaceId:P,profile:v,summary:i,filter:p,period:L}){var ee;const q=[];for(let W=1;W<=10;W++){const{data:X}=await ke.get("/spendboard/ads",{space_id:P,profile_id:v.id,filter:p,period:L,page:W,size:100}),c=X.ads??[];
2if(q.push(...c),!c.length||W>=(((ee=X.meta)==null?void 0:ee.pages)??1))break}const[Q,Y,{doc:r,autoTable:J}]=await Promise.all([Kt(),v.avatar_url?Ht(v.avatar_url):Promise.resolve(null),qt({orientation:"landscape",format:"a4"})]),C=r.internal.pageSize.getWidth(),d=14,z=14;let N=Yt(r,Q,{title:`Спендборд — ${Dl[p]}`,period:`Анализ за ${L} дн.`,marginLeft:d,marginRight:z})+1;const G=10;Y&&r.addImage(Y,"PNG",d,N-1,G,G);const se=d+(Y?G+3:0);r.setFont("Inter","bold"),r.setFontSize(11),r.setTextColor(36,38,41);const te=[v.title,v.name].filter(Boolean).join(" ")||`Профиль #${v.id}`;r.text(te,se,N+3),N+=G+4;const ne=[["Сливают бюджет",String((i==null?void 0:i.wasteful_count)??0),"Перспективные",String((i==null?void 0:i.winner_count)??0)],["Всего объявлений",String((i==null?void 0:i.total_ads)??0),"Расход за 7 дней",tt(i==null?void 0:i.spend_7d_rub)],["Потенциал экономии",tt(i==null?void 0:i.potential_saving_rub),"",""]];J(r,{startY:N,body:ne,theme:"plain",styles:{font:"Inter",fontSize:8,cellPadding:{top:1.5,bottom:1.5,left:3,right:3}},columnStyles:{0:{fontStyle:"bold",textColor:[120,120,120],cellWidth:45},1:{fontStyle:"bold",textColor:[36,38,41],cellWidth:45},2:{fontStyle:"bold",textColor:[120,120,120],cellWidth:45},3:{fontStyle:"bold",textColor:[36,38,41],cellWidth:45}},margin:{left:d,right:z},tableWidth:180}),N=r.lastAutoTable.finalY+4;const ie=[["Объявление","Категория","Расход 7д","Показы","Контакты","CPL","CR","Сигналы","Статус"]],ue=q.map(W=>[Nt(W.title,46),W.category?Nt(W.category,22):"—",tt(W.spend_recent_rub),W.views_recent.toLocaleString("ru-RU"),String(W.contacts_recent),W.cpl_rub!=null?tt(W.cpl_rub):"—",Ml(W.cr),W.signals.length?W.signals.join(" "):"—",zl[W.classification]??W.classification]);J(r,{startY:N,head:ie,body:ue,theme:"striped",styles:{font:"Inter",fontSize:7.5,cellPadding:2,overflow:"linebreak",valign:"middle"},headStyles:{fillColor:Nl,textColor:255,fontStyle:"bold",font:"Inter",fontSize:7.5},columnStyles:{0:{cellWidth:70,halign:"left"},1:{cellWidth:34},2:{cellWidth:26,halign:"right"},3:{cellWidth:22,halign:"right"},4:{cellWidth:22,halign:"right"},5:{cellWidth:24,halign:"right"},6:{cellWidth:18,halign:"right"},7:{cellWidth:26,halign:"center"},8:{halign:"center"}},margin:{left:d,right:z},didParseCell:W=>{var c;if(W.section!=="body")return;const X=(c=q[W.row.index])==null?void 0:c.classification;X==="wasteful_danger"?W.cell.styles.fillColor=Wl:X==="wasteful_warning"?W.cell.styles.fillColor=Bl:X==="winner"&&(W.cell.styles.fillColor=Fl)}}),q.length||(r.setFont("Inter","italic"),r.setFontSize(9),r.setTextColor(150,150,150),r.text("Ð
2ÐµÑ‚ объявлений по выбранному фильтру.",C/2,N+10,{align:"center"}));const g=te.replace(/[^a-zA-Zа-яА-Я0-9]/g,"_");r.save(`spendboard_${g}_${p}_${L}d.pdf`)}const Gl={class:"compare__header"},Ol={class:"compare"},Vl={class:"compare__chips"},Kl=["src"],Hl={key:1,class:"compare__chip-title"},ql={class:"compare__chip-name"},Yl=["onClick"],Xl={class:"compare__controls"},jl={key:0,class:"compare__dropdown"},Zl={class:"compare__dropdown-search"},Jl={class:"compare__dropdown-list"},Ql=["onClick"],ea={class:"g-multiselect-check"},ta=["src"],sa={key:1,class:"compare__dropdown-title"},na={class:"compare__dropdown-name"},la={key:1,class:"g-multiselect-empty"},aa={key:0,class:"compare__dropdown-footer"},oa={key:0,class:"compare__toggle"},ia={key:0,class:"compare__toggle-label"},ra={key:0},ca={key:1,class:"compare__table-wrap"},ua={class:"compare__table"},da={class:"compare__th-content"},pa=["src"],_a={class:"compare__th-text"},va={key:0,class:"compare__th-title"},fa={class:"compare__th-name"},ha={class:"compare__group-row"},ga={class:"compare__row compare__row--total"},ma={class:"compare__total-place"},ba={class:"compare__total-score"},ya=["onClick"],wa={class:"compare__group-label compare__group-label--sticky"},ka={class:"compare__group-inner"},Ca=["onClick"],$a={class:"compare__td compare__td--metric"},Pa={class:"compare__metric-inner"},Sa={key:0,class:"compare__info-wrap"},Aa={class:"compare__cell-inner"},Ia={class:"compare__val"},xa={key:2,class:"compare__empty"},Ra=Ie({__name:"SpendboardComparePopup",props:{spaceId:{},period:{},currentProfileId:{}},emits:["close"],setup(P){const{toast:v,showError:i}=Ys(),p=P,{isMobile:L}=Ls(),q={spend_7d_rub:{width:300,content:"Суммарный расход на присутствие и продвижение по всем объявлениям профиля — фиксированные скользящие последние 7 дней, не связано с выбранным периодом самого Спендборда."},wasteful_count:{width:300,content:"Сколько объявлений профиля сливают бюджет — деньги тратятся, а обращений нет или они выходят намного дороже нормы. Пересчитывается раз в час за последние 7 дней."},winner_count:{width:300,content:"Сколько объявлений профиля показывают высокую конверсию (CR) при недоборе показов — стоит увеличить бюджет продвижения. Те же скользящие 7 дней, что и «Сливают бюджет»."},total_ads:{width:300,content:"Общее число объявлений профиля, учтённых воркером эффективности расхода — не только сливающие или перспективные, а вообще все объявления, прошедшие в анализ Спендборда."},potential_saving_rub:{width:300,content:"Оценка экономии, если стоимость обращения по сливающим объявлениям профиля снизится до медианы похожих объявлений в категории — не гарантия, а потенциал за последние 7 дней."}},Z=[{key:"spend_7d_rub",label:"Расход 7д",inverted:!0},{key:"wasteful_count",label:"Сливают бюджет",inverted:!0},{key:"winner_count",label:"Перспективные"},{key:"total_ads",label:"Всего объявлений"},{key:"potential_saving_rub",label:"Потенциал экономии",inverted:!0}],Q=[{label:"Расходы и эффективность",metrics:Z}],Y=new Set(["spend_7d_rub","potential_saving_rub"]),r=$([]),J=$(!1),C=$([]),d=$(null),z=$(!0),N=$(!1),G=$(new Set),se=s=>s.name??`Профиль #${s.id}`,te=s=>[...s].sort((l,m)=>{const a=l.title,x=m.title;if(!a&&x)return 1;if(a&&!x)return-1;if(!a||!x)return 0;const k=parseFloat(a),re=parseFloat(x);return!isNaN(k)&&!isNaN(re)?k-re:isNaN(k)?isNaN(re)?a.localeCompare(x,"ru",{numeric:!0}):1:-1}),ne=s=>{const l={};for(const m of Z)l[m.key]=s[m.key];return l},ie=h(()=>new Set(r.value.map(s=>s.profile.id))),ue=h(()=>C.value.filter(s=>!ie.value.has(s.id))),g=$(!1),ee=$(null),W=$(null),X=$(""),c=$(new Map),T=h(()=>{const s=X.value.trim().toLowerCase();return s?ue.value.filter(l=>{var m;return se(l).toLowerCase().includes(s)||(((m=l.title)==null?void 0:m.toLowerCase().includes(s))??!1)}):ue.value}),M=()=>{g.value=!g.value,g.value&&(c.value=new Map,X.value="",vt(()=>{var s;return(s=W.value)==null?void 0:s.focus()}))},de=s=>{const l=new Map(c.value);l.has(s.id)?l.delete(s.id):l.set(s.id,s),c.value=l},le=s=>{g.value&&ee.value&&!ee.value.contains(s.target)&&(g.value=!1)},S=()=>{const s=new Map;for(const l of ue.value)s.set(l.id,l);c.value=s,y()},y=()=>{const s=[...c.value.values()];if(g.value=!1,c.value=new Map,!s.length)return;const l=s.map(m=>({profile:m,data:ne(m)}));r.value=[...r.value,...l]},O=s=>{ie.value.has(s.id)||(r.value=[...r.value,{profile:s,data:ne(s)}])},V=s=>{r.value=r.value.filter((l,m)=>m!==s)},we=()=>{r.value=[],c.value=new Map},K=async()=>
2{if(!p.spaceId){C.value=[];return}try{const{data:s}=await ke.get("/spendboard/profiles",{space_id:p.spaceId,page:1,size:100,sort:"worst_first"}),l=[...s.profiles];for(let m=2;m<=s.meta.pages;m+=1){const{data:a}=await ke.get("/spendboard/profiles",{space_id:p.spaceId,page:m,size:100,sort:"worst_first"});l.push(...a.profiles)}C.value=te(l)}catch{C.value=[]}},pe=h(()=>{const s=new Map;for(const l of Z){const m=r.value.map(a=>a.data[l.key]).filter(a=>a!=null);s.set(l.key,new Set(m).size)}return s}),ce=s=>(pe.value.get(s)??0)>=2,fe=s=>{const l=new Set(G.value);l.has(s)?l.delete(s):l.add(s),G.value=l},_=s=>N.value?s.metrics.filter(l=>ce(l.key)):s.metrics,A=h(()=>{const s=new Map;for(const l of Z){const m=r.value.map(k=>({id:k.profile.id,val:k.data[l.key]})).filter(k=>k.val!=null);m.sort((k,re)=>l.inverted?k.val-re.val:re.val-k.val);const a=new Map;let x=1;for(let k=0;k<m.length;k++)k>0&&m[k].val!==m[k-1].val&&(x=k+1),a.set(m[k].id,x);for(const k of r.value)a.has(k.profile.id)||a.set(k.profile.id,m.length+1);s.set(l.key,a)}return s}),j=(s,l)=>{var m;return((m=A.value.get(s.key))==null?void 0:m.get(l.profile.id))??r.value.length},u=s=>s===1?"compare__rank--gold":s===2?"compare__rank--silver":s===3?"compare__rank--bronze":"",_e=h(()=>{const s=new Map;for(const l of r.value){let m=0;for(const a of Z)m+=j(a,l);s.set(l.profile.id,m)}return s}),Re=s=>_e.value.get(s.profile.id)??0,be=h(()=>{const s=[..._e.value.entries()].sort((a,x)=>a[1]-x[1]),l=new Map;let m=1;for(let a=0;a<s.length;a++)a>0&&s[a][1]!==s[a-1][1]&&(m=a+1),l.set(s[a][0],m);return l}),Ce=s=>be.value.get(s.profile.id)??r.value.length,Ge=s=>{const l=Ce(s);if(l===1)return"compare__td--best";const m=Math.max(...be.value.values());return l===m&&m>1?"compare__td--worst":""},$e=h(()=>{if(!d.value)return r.value;const s=d.value,l=Z.find(m=>m.key===s);return[...r.value].sort((m,a)=>{const x=m.data[s],k=a.data[s];if(x==null&&k==null)return 0;if(x==null)return 1;if(k==null)return-1;const re=z.value?-1:1,We=l!=null&&l.inverted?-1:1;return(x-k)*re*We})}),Oe=s=>{d.value===s?z.value?z.value=!1:(d.value=null,z.value=!0):(d.value=s,z.value=!0)},Se=(s,l)=>{const m=l[s];if(m==null||m===0)return{width:"0%"};const a=r.value.map(re=>re.data[s]).filter(re=>re!=null&&re!==0);if(a.length===0)return{width:"0%"};const x=Math.max(...a.map(Math.abs));return{width:`${x>0?Math.round(Math.abs(m)/x*100):0}%`}},Ee=(s,l)=>{if(r.value.length<2)return"";const m=l[s.key];if(m==null||!ce(s.key))return"";const a=r.value.map(re=>re.data[s.key]).filter(re=>re!=null);if(a.length<2)return"";const x=s.inverted?Math.min(...a):Math.max(...a),k=s.inverted?Math.max(...a):Math.min(...a);return m===x?"compare__td--best":m===k?"compare__td--worst":""},Ne=(s,l)=>s==null?"—":Y.has(l)?new Intl.NumberFormat("ru-RU",{style:"currency",currency:"RUB",maximumFractionDigits:0}).format(s):new Intl.NumberFormat("ru-RU").format(s),Ve=async()=>{try{const s=$e.value,l=s.map(H=>H.profile.title?`${H.profile.title} ${se(H.profile)}`:se(H.profile)),m=s.map(H=>H.profile.avatar_url?Ht(H.profile.avatar_url):Promise.resolve(null)),[a,x,{doc:k,autoTable:re}]=await Promise.all([Promise.all(m),Kt(),qt()]),Ke=Yt(k,x,{title:"Спендборд · Сравнение профилей",period:"Анализ за 7 дн.",marginLeft:14,marginRight:14}),He=[["Метрика",...l]],Pe=[];for(const H of Q){Pe.push([`▸ ${H.label}`,...l.map(()=>"")]);for(const w of H.metrics){const I=[w.label];for(const he of s)I.push(Ne(he.data[w.key],w.key));Pe.push(I)}}Pe.push(["▸ Итог",...l.map(()=>"")]);const Be=["Эффективность профиля"];for(const H of s)Be.push(`#${Ce(H)} (${Re(H)} очков)`);Pe.push(Be);const Te=s.length,ye=Te>4?5:6,Ye=1.5,Xe=Te>3,je=Te>6?5.5:Te>4?6:7;re(k,{startY:Ke,head:He,body:Pe,theme:"grid",styles:{font:"Inter",fontSize:7,cellPadding:2,overflow:"linebreak",halign:"center"},headStyles:{fillColor:[249,115,22],textColor:255,fontStyle:"bold",font:"Inter",minCellHeight:Xe?ye+8:ye+4,valign:"middle"},columnStyles:{0:{fontStyle:"bold",cellWidth:40,halign:"left"}},didParseCell:H=>{if(H.section==="head"&&H.column.index===0&&(H.cell.styles.cellPadding={top:2,right:2,bottom:2,left:2}),H.section==="head"&&H.column.index>0&&(H.cell.text=[]),H.section==="body"){const w=Pe[H.row.index];typeof(w==null?void 0:w[0])=="string"&&w[0].startsWith("▸")&&(H.cell.styles.fillColor=[245,245,245],H.cell.styles.fontStyle="bold")}},didDrawCell:H=>{if(H.section==="head"&&H.column.index>0){const w=H.column.index-1,I=a[w],he=l[w],U=!!I;k.setFont("Inter","bold"),k.setFontSize(je),k.setTextColor(255,255,255);const Fe=H.cell.x,Me=H.cell.width,it=H.cell.y,Zt=H.cell.height,rt=Fe+Me/2,Ze=1.5;if(Xe){if(U){const Qe=rt-ye/2,dt=it+Ze;k.addImage(I,"PNG",Qe,dt,ye,ye)}const ct=it+(U?ye+Ze+1.5:Ze+1),ut=Me-Ze*2,Je=k.splitTextToSize(he,ut);
2k.text(Je,rt,ct,{align:"center",baseline:"top"})}else{const ct=k.getTextWidth(he),ut=(U?ye+Ye:0)+ct,Je=rt-ut/2,Qe=it+Zt/2;U&&k.addImage(I,"PNG",Je,Qe-ye/2,ye,ye);const dt=Je+(U?ye+Ye:0);k.text(he,dt,Qe,{baseline:"middle"})}}}}),k.save("spendboard_compare_7d.pdf")}catch(s){i(s,"Ошибка экспорта PDF")}};return bt(async()=>{window.addEventListener("click",le),J.value=!0;try{if(await K(),p.currentProfileId!=null){const s=C.value.find(l=>l.id===p.currentProfileId);s&&O(s)}}finally{J.value=!1}}),ss(()=>{window.removeEventListener("click",le)}),(s,l)=>{const m=Le("tooltip");return t(),n(ae,null,[R(at,{size:"full",onClPopup:l[5]||(l[5]=a=>s.$emit("close"))},{title:F(()=>[e("div",Gl,[l[8]||(l[8]=e("span",null,"Спендборд · Сравнение профилей",-1)),R(ze,{class:"compare__title-help",width:300},{default:F(()=>l[7]||(l[7]=[E(" Сравнивайте расходные показатели нескольких профилей бок о бок: расход за 7 дней, сливающие бюджет и перспективные объявления, потенциал экономии. Профили автоматически ранжируются по каждой метрике и получают итоговую оценку эффективности."),e("br",null,null,-1),e("br",null,null,-1),E("Кликните по строке метрики, чтобы отсортировать, включите «Только различия», чтобы скрыть совпадающие значения, и выгрузите готовое сравнение в PDF. ")])),_:1})])]),titleTrailing:F(()=>[r.value.length>0?B((t(),n("button",{key:0,type:"button",class:"compare__clear-all",onClick:we},[R(o(cs),{size:15}),l[9]||(l[9]=e("span",{class:"compare__clear-all-label"},"Очистить все",-1))])),[[m,"Убрать все профили из сравнения"]]):b("",!0)]),default:F(()=>[e("div",Ol,[e("div",Vl,[(t(!0),n(ae,null,ge(r.value,(a,x)=>(t(),n("div",{key:a.profile.id,class:"compare__chip"},[a.profile.avatar_url?(t(),n("img",{key:0,src:a.profile.avatar_url,alt:"",class:"compare__chip-avatar"},null,8,Kl)):b("",!0),a.profile.title?(t(),n("span",Hl,f(a.profile.title),1)):b("",!0),e("span",ql,f(se(a.profile)),1),B((t(),n("button",{class:"compare__chip-remove",onClick:k=>V(x)},l[10]||(l[10]=[E("×")]),8,Yl)),[[m,"Убрать"]])]))),128))]),e("div",Xl,[e("div",{ref_key:"multiSelectRef",ref:ee,class:"compare__add"},[e("div",{class:"compare__add-trigger",onClick:M},[l[11]||(l[11]=e("span",{class:"compare__add-label"},"+ Добавить профиль",-1)),R(o(At),{size:14,class:oe(["compare__add-arrow",{"compare__add-arrow--open":g.value}])},null,8,["class"])]),g.value?(t(),n("div",jl,[e("div",Zl,[B(e("input",{ref_key:"multiSearchRef",ref:W,"onUpdate:modelValue":l[0]||(l[0]=a=>X.value=a),class:"compare__dropdown-search-input",placeholder:"Поиск профиля...",onKeydown:l[1]||(l[1]=ve(()=>{},["stop"])),onClick:l[2]||(l[2]=ve(()=>{},["stop"]))},null,544),[[ns,X.value]]),X.value?(t(),n("button",{key:0,class:"compare__dropdown-search-clear",type:"button",onClick:l[3]||(l[3]=ve(a=>X.value="",["stop"]))},"×")):b("",!0)]),e("div",Jl,[ue.value.length>0&&!X.value?(t(),n("div",{key:0,class:"compare__dropdown-item compare__dropdown-item--all",onClick:ve(S,["stop"])},[R(o(ls),{size:14,class:"compare__dropdown-all-icon"}),l[12]||(l[12]=e("span",null,"Все профили",-1))])):b("",!0),(t(!0),n(ae,null,ge(T.value,a=>(t(),n("div",{key:a.id,class:oe(["g-multiselect-item",{"g-multiselect-item--checked":c.value.has(a.id)}]),onClick:ve(x=>de(a),["stop"])},[e("span",ea,[c.value.has(a.id)?(t(),D(o(as),{key:0,size:12})):b("",!0)]),a.avatar_url?(t(),n("img",{key:0,src:a.avatar_url,alt:"",class:"compare__dropdown-avatar"},null,8,ta)):b("",!0),a.title?(t(),n("span",sa,f(a.title),1)):b("",!0),e("span",na,f(se(a)),1)],10,Ql))),128)),T.value.length?b("",!0):(t(),n("div",la,f(X.value?"Совпадений нет":"Нет доступных профилей"),1))]),c.value.size>0?(t(),n("div",aa,[e("button",{class:"g-multiselect-action-btn",onClick:ve(y,["stop"])}," Добавить выбранные ("+f(c.value.size)+") ",1)])):b("",!0)])):b("",!0)],512),r.value.length>=2?(t(),n("label",oa,[B(e("input",{"onUpdate:modelValue":l[4]||(l[4]=a=>N.value=a),type:"checkbox",class:"compare__toggle-input"},null,512),[[os,N.value]]),l[13]||(l[13]=e("span",{class:"compare__toggle-track"},null,-1)),o(L)?b("",!0):(t(),n("span",ia,"Только различия"))])):b("",!0),r.value.length>=2?B((t(),n("button",{key:1,class:"compare__export",onClick:Ve},[R(o(is),{size:16}),o(L)?b("",!0):(t(),n("span",ra,"Скачать PDF"))])),[[m,"Скачать PDF"]]):b("",!0)]),J.value?(t(),D(Ut,{key:0})):r.value.length>=2?(t(),n("div",ca,[e("table",ua,[e("thead",null,[e("tr",null,[l[14]||(l[14]=e("th",{class:"compare__th compare__th--metric"},"МЕТРИКА",-1)),(t(!0),n(ae,null,ge($e.value,a=>(t(),n("th",{key:a.profile.id,class:"compare__th"},[e("div",da,[a.profile.avatar_url?(t(),n("img",{key:0,src:a.profile.avatar_url,alt:"",class:"compare__th-avatar"},null,8,pa)):b("",!0),e("div",_a,[a.profile.title?(t(),n("span",va,f(a.profile.title),
21)):b("",!0),e("span",fa,f(se(a.profile)),1)])])]))),128))])]),e("tbody",null,[e("tr",ha,[l[15]||(l[15]=e("td",{class:"compare__group-label compare__group-label--sticky"},"Итог",-1)),(t(!0),n(ae,null,ge($e.value,a=>(t(),n("td",{key:a.profile.id,class:"compare__group-spacer"}))),128))]),e("tr",ga,[l[16]||(l[16]=e("td",{class:"compare__td compare__td--metric compare__td--total-label"},"Эффективность профиля",-1)),(t(!0),n(ae,null,ge($e.value,a=>(t(),n("td",{key:a.profile.id,class:oe(["compare__td compare__td--total",Ge(a)])},[e("span",ma,"#"+f(Ce(a)),1),e("span",ba,f(Re(a))+" очков",1)],2))),128))]),(t(),n(ae,null,ge(Q,a=>(t(),n(ae,{key:a.label},[_(a).length>0?(t(),n("tr",{key:0,class:"compare__group-row",onClick:x=>fe(a.label)},[e("td",wa,[e("div",ka,[G.value.has(a.label)?(t(),D(o(rs),{key:0,size:14,class:"compare__group-chevron"})):(t(),D(o(At),{key:1,size:14,class:"compare__group-chevron"})),e("span",null,f(a.label),1)])]),(t(!0),n(ae,null,ge($e.value,x=>(t(),n("td",{key:x.profile.id,class:"compare__group-spacer"}))),128))],8,ya)):b("",!0),G.value.has(a.label)?b("",!0):(t(!0),n(ae,{key:1},ge(_(a),x=>B((t(),n("tr",{key:x.key,class:oe(["compare__row",{"compare__row--sort-active":d.value===x.key}]),onClick:k=>Oe(x.key)},[e("td",$a,[e("div",Pa,[e("span",null,f(x.label),1),q[x.key]?B((t(),n("span",Sa,[R(o(gt),{size:12})])),[[m,q[x.key]]]):b("",!0),R(o(Bt),{size:11,class:"compare__sort-icon"})])]),(t(!0),n(ae,null,ge($e.value,k=>(t(),n("td",{key:k.profile.id,class:oe(["compare__td",Ee(x,k.data)])},[e("div",Aa,[e("div",{class:"compare__bar",style:Ft(Se(x.key,k.data))},null,4),e("span",Ia,f(Ne(k.data[x.key],x.key)),1),ce(x.key)?(t(),n("span",{key:0,class:oe(["compare__rank",u(j(x,k))])}," #"+f(j(x,k)),3)):b("",!0)])],2))),128))],10,Ca)),[[m,"Клик — сортировать профили по этой метрике"]])),128))],64))),64))])])])):(t(),n("div",xa," Добавьте минимум 2 профиля для сравнения "))])]),_:1}),R(Es,{visible:o(v).visible,"onUpdate:visible":l[6]||(l[6]=a=>o(v).visible=a),text:o(v).text,severity:o(v).severity,duration:3500},null,8,["visible","text","severity"])],64)}}}),Ta=xe(Ra,[["__scopeId","data-v-c3201872"]]),nt="spendboard",lt="uxSettings",wt="spendboard_ux_settings",jt=["wasteful","winners","spend7d","saving"],La={wasteful:"Сливают бюджет",winners:"Перспективные",spend7d:"Расход 7д",saving:"Потенциал экономии"};function Ea(){return{hiddenKpi:[],showActionCards:!0,showInsight:!0,showProfileSummary:!0,showCategoryBreakdown:!0}}function Da(P){return Array.isArray(P)?P.filter(v=>jt.includes(v)):[]}function ht(P){const v=Ea();if(!P||typeof P!="object")return v;const i=P;return{hiddenKpi:Da(i.hiddenKpi),showActionCards:typeof i.showActionCards=="boolean"?i.showActionCards:v.showActionCards,showInsight:typeof i.showInsight=="boolean"?i.showInsight:v.showInsight,showProfileSummary:typeof i.showProfileSummary=="boolean"?i.showProfileSummary:v.showProfileSummary,showCategoryBreakdown:typeof i.showCategoryBreakdown=="boolean"?i.showCategoryBreakdown:v.showCategoryBreakdown}}function Wt(){const P=ot();if(P.loaded){const v=P.getValue(nt,lt);if(v!==void 0)return ht(v)}return ht(yt.get(wt,null))}function za(P){yt.set(wt,P),ot().setValue(nt,lt,P)}function Na(){const P=ot();if(!P.loaded||P.getValue(nt,lt)!==void 0)return;const v=yt.get(wt,null);v!=null&&P.setValue(nt,lt,v)}const Wa={class:"ux-settings"},Ba={class:"ux-settings__block"},Fa={class:"check-row"},Ma=["checked","onChange"],Ua={class:"ux-settings__block"},Ga={class:"check-row"},Oa={class:"check-row__item"},Va=["checked"],Ka={class:"check-row__item"},Ha=["checked"],qa={class:"check-row__item"},Ya=["checked"],Xa={class:"check-row__item"},ja=["checked"],Za=Ie({__name:"SpendboardSettingsPopup",props:{initialSettings:{}},emits:["close","apply"],setup(P,{emit:v}){const i=P,p=v,L=$(new Set(i.initialSettings.hiddenKpi)),q=$(i.initialSettings.showActionCards),Z=$(i.initialSettings.showInsight),Q=$(i.initialSettings.showProfileSummary),Y=$(i.initialSettings.showCategoryBreakdown);function r(C,d){const z=new Set(L.value);d?z.delete(C):z.add(C),L.value=z}function J(){return ht({hiddenKpi:[...L.value],showActionCards:q.value,showInsight:Z.value,showProfileSummary:Q.value,showCategoryBreakdown:Y.value})}return me([L,q,Z,Q,Y],()=>p("apply",J()),{deep:!0}),(C,d)=>{const z=Le("tooltip");
2return t(),D(at,{size:"md",onClPopup:d[4]||(d[4]=N=>C.$emit("close"))},{title:F(()=>d[5]||(d[5]=[E("Настройки")])),default:F(()=>[e("div",Wa,[e("section",Ba,[d[6]||(d[6]=e("div",{class:"ux-settings__section-title"},"Ключевые показатели",-1)),e("div",Fa,[(t(!0),n(ae,null,ge(o(jt),N=>(t(),n("label",{key:N,class:"check-row__item"},[e("input",{type:"checkbox",checked:!L.value.has(N),onChange:G=>r(N,G.target.checked)},null,40,Ma),e("span",null,f(o(La)[N]),1)]))),128))])]),e("section",Ua,[d[11]||(d[11]=e("div",{class:"ux-settings__section-title"},"Блоки борда",-1)),e("div",Ga,[e("label",Oa,[e("input",{type:"checkbox",checked:Q.value,onChange:d[0]||(d[0]=N=>Q.value=N.target.checked)},null,40,Va),d[7]||(d[7]=e("span",null,"Сводка профиля",-1))]),e("label",Ka,[e("input",{type:"checkbox",checked:Y.value,onChange:d[1]||(d[1]=N=>Y.value=N.target.checked)},null,40,Ha),d[8]||(d[8]=e("span",null,"По категориям",-1))]),e("label",qa,[e("input",{type:"checkbox",checked:Z.value,onChange:d[2]||(d[2]=N=>Z.value=N.target.checked)},null,40,Ya),B((t(),n("span",null,d[9]||(d[9]=[E("Инсайт-подсказка")]))),[[z,{width:300,content:"Короткая фраза-вывод вверху борда: сколько объявлений сливают бюджет или перспективны за последние 7 дней, и сколько можно сэкономить при перебалансе к медиане категории."}]])]),e("label",Xa,[e("input",{type:"checkbox",checked:q.value,onChange:d[3]||(d[3]=N=>q.value=N.target.checked)},null,40,ja),B((t(),n("span",null,d[10]||(d[10]=[E("Карточки «Требуют внимания»")]))),[[z,{width:300,content:"Карточки-рекомендации под инсайтом: до 3 объявлений, которые сильнее всего сливают бюджет, и до 2 перспективных, которым стоит добавить бюджет — по данным за последние 7 дней."}]])])])])])]),_:1})}}}),Ja=xe(Za,[["__scopeId","data-v-cd828fae"]]),Qa={key:0,class:"sb-loading"},eo={class:"sb-header"},to={class:"sb-header__row"},so={class:"sb-header__period"},no=["onClick"],lo={key:0,class:"sb-body"},ao={key:1,class:"sb-kpi","aria-label":"Ключевые показатели"},oo={class:"sb-insight__text"},io={key:6,class:"sb-section"},ro={class:"sb-section__header"},co={class:"sb-action-cards","aria-labelledby":"sb-action-cards-heading"},uo={key:7,class:"sb-cat-filter"},po={class:"sb-cat-filter__chip"},_o={class:"sb-cat-filter__label"},vo=["id"],fo={class:"intro-popup-title"},ho={class:"intro-popup-body"},go={class:"intro-features"},mo={class:"feature-title"},bo={class:"feature-desc"},yo={class:"intro-popup-footer"},wo="Переключает окно только для двух блоков ниже — «Сводка профиля» и «По категориям»: можно смотреть за 7 или 30 дней (90 округляется до 30 — часовых 90-дневных агрегатов пока нет). На KPI-карточки наверху и на таблицу объявлений этот переключатель не влияет вообще: там всегда фиксированные скользящие последние 7 дней, независимо от выбора здесь.",st="Фиксированное окно 7 дней — переключатель периода наверху на эту карточку не влияет.",ko="Витрина конкретных объявлений, требующих действия прямо сейчас: до 3 самых сильных нарушителей (сильнее всего сливают бюджет) и до 2 самых перспективных (высокая конверсия, но не хватает показов). Отбор — по скользящим последним 7 дням, переключатель периода наверху борда на эту подборку не влияет. Тот же сигнал, что и в счётчиках KPI-карточек выше, только здесь top-объявления с деталями, а не общее число.",Co=Ie({__name:"SpendboardPage",setup(P){const v=Ns(),{currentSpaceId:i}=ks(Ds()),p=Ws(),L=Cs(),{showAiOnboarding:q}=Ps(),{goToBoard:Z}=Mt();function Q(){Z("teamboard",{open_ai_settings:"1"})}const Y=h(()=>p.profile),r=h(()=>p.profileId),J=h(()=>p.spendPeriod),C=$(null),d=$(null),z=w=>{C.value=(w==null?void 0:w.id)??null,d.value=(w==null?void 0:w.name)??null},N=()=>{C.value=null,d.value=null};me(r,()=>N());const G=$(null),se=$(null);me(r,w=>{G.value!=null&&w!==se.value&&(G.value=null)});const{isLoading:te,adsLoaded:ne,ads:ie,adsMeta:ue,profiles:g,currentSummary:ee,profilesLoading:W,profileSummaryLoaded:X,loadError:c,worstAds:T,bestAds:M,currentPage:de,activeTab:le,sort:S,wastefulCount:y,winnersCount:O,totalAds:V,totalSpend7d:we,totalPotentialSaving:K,fetchAds:pe,fetchSparkline:ce,refetch:fe}=El(i,r,J,d),_=h(()=>!te.value&&!ie.value.length),{isGathering:A}=$s(Y,{activeWhen:_,onPoll:()=>{fe()}}),j=h(()=>A.value&&_.value),u=$(!1),_e=$(!1),Re=$(!1),be=$(Wt()),Ce=h(()=>new Set(be.value.hiddenKpi)),Ge=w=>{be.value=w,za(w)},$e=ot();me(()=>$e.loaded,w=>{w&&(Na(),be.value=Wt())},{immediate:!0});const Oe=h(()=>ie.value.some(w=>!!w.adspower_profile_id)),Se=$({}),Ee=async w=>{if(Se.value[w])return;const I=await ce(w,90);I&&(Se.value[w]=I.points)},Ne=[{value:7,label:"7д"},{value:30,label:"30д"},{value:90,label:"90д"}],Ve=h(()=>[{id:"wasteful",label:"Сливают",icon:It,count:y.value},{id:"winners",label:"Перспективные",icon:xt,count:O.value},{id:"all",label:"Все",icon:us,count:V.value}]),s=`Объявления, где деньги тратятся, а обращений нет или они обходятся намного дороже нормы. Пересчитывается автоматически раз в час: обычно это минимум 2 совпавших предупреждающих сигнала сразу (рост CPL, дороже конкурентов в категории, падение конверсии или просмотров) — а если обращение стоит дороже 30% цены товара, хватает и этого сигнала одного. ${st} Учитываются только объявления с расходом от 300 â
2‚½ и от 30 показов за неделю — младшим или совсем малобюджетным объявлениям данных пока недостаточно. Конкретные объявления с разбором — ниже, в карточках «Требуют внимания» и в таблице.`,l=`Объявления с высокой конверсией в обращение (CR), которым не хватает показов — есть смысл увеличить бюджет продвижения, чтобы масштабировать результат. Срабатывает, когда CR минимум в 1.5 раза выше медианы похожих объявлений в категории, а показов не больше, чем у медианного объявления той же категории. ${st} Учитываются только объявления минимум с 3 обращениями за неделю — на меньшем числе конверсия ненадёжна. Те же объявления — ниже, в карточках «Требуют внимания» и в таблице (сигнал G).`,m=`Сколько всего потратили на размещение и продвижение по всем объявлениям профиля. ${st} Не включает тариф и комиссии аккаунта Авито — это отдельная часть расхода. Ниже, в «Сводке профиля», карточка «Расход профиля» — сумма обычно крупнее: там весь расход аккаунта целиком, включая тариф.`,a=`Сколько денег можно освободить, если стоимость обращения по сливающим бюджет объявлениям снизится до медианы похожих объявлений в категории — уровня «как у большинства продавцов». Считается по каждому такому объявлению: (его CPL − медиана категории) × число его обращений, дальше суммируется по всем объявлениям. ${st} Это оценка потенциала, а не гарантия — объявления без сравнимой группы похожих в расчёт не попадают.`,x=w=>w?w>=1e6?`${(w/1e6).toFixed(1)} млн ₽`:w>=1e3?`${(w/1e3).toFixed(0)} тыс ₽`:`${Math.round(w).toLocaleString("ru-RU")} ₽`:"0 ₽",k=(w,I,he,U)=>{const Fe=w%10,Me=w%100;return Fe===1&&Me!==11?I:Fe>=2&&Fe<=4&&(Me<10||Me>=20)?he:U},re=h(()=>y.value>0?"danger":O.value>0?"success":"ok"),We=h(()=>y.value>0?mt:O.value>0?xt:ds),qe=h(()=>{const w=y.value,I=O.value;if(w>0){const he=k(w,"объявление сливает","объявления сливают","объявлений сливают"),U=K.value>0?` Перебаланс к медиане категории сэкономит ~${x(K.value)}.`:"";return`${w} ${he} бюджет.${U}`}if(I>0){const he=k(I,"перспективное объявление","перспективных объявления","перспективных объявлений");return`${I} ${he} — высокий CR при недоборе показов, стоит долить бюджет.`}return"Профиль расходует бюджет эффективно — критичных трат не обнаружено."}),Ke=h(()=>le.value==="wasteful"?"Нет объявлений, сливающих бюджет":le.value==="winners"?"Нет перспективных объявлений":"Недостаточно данных по профилю"),He=h(()=>le.value==="all"?"Объявления младше 7 дней или с малым числом показов/расхода исключаются из анализа.":"Переключите вкладку или период анализа."),Pe=h(()=>[{key:"export",label:"Скачать отчёт",icon:ps,disabled:te.value||u.value||!ie.value.length,ariaLabel:"Скачать PDF-отчёт по расходам профиля"},{key:"compare",label:"Сравнить",icon:_s,ariaLabel:"Сравнить расходы и эффективность нескольких профилей"},{key:"settings",label:"Настройки",icon:vs,ariaLabel:"Настройки видимости KPI и блоков борда"}]),Be=async w=>{if(w==="compare"){_e.value=!0;return}if(w==="settings"){Re.value=!0;return}if(w!=="export")return;const I=Y.value;if(!(!I||!i.value)){u.value=!0;try{await Ul({spaceId:i.value,profile:{id:I.id,name:I.name??null,title:I.title??null,avatar_url:I.avatar_url??null},summary:ee.value,filter:le.value,period:p.spendPeriod})}catch{}finally{u.value=!1}}};fs(()=>{p.profileId?p.setHeaderActions(Pe.value,Be):p.clearHeaderActions()}),me([g,ee],()=>{const w=p.profile;w&&!w.title&&!w.name&&ee.value&&p.setProfile({id:w.id,name:ee.value.name??"",title:ee.value.title??"",avatar_url:ee.value.avatar_url??null})}),bt(()=>{const w=L.query.ad_id;if(typeof w=="string"){const I=Number(w);if(Number.isFinite(I)){G.value=I;const he=L.query.profile_id,U=typeof he=="string"?Number(he):NaN;se.value=Number.isFinite(U)?U:p.profileId,le.value!=="all"&&(le.value="all")}}});const Te=$(Ss.spendboard),ye=()=>{Te.value=!1},{showIntro:Ye,dontShowAgain:Xe,closeIntro:je,onDontShowToggle:kt}=Hs("spendboard","intro_spendboard_hidden"),H=[{key:"sb-wasteful",icon:It,t
2itle:"Сливают бюджет",desc:"Объявления с аномально высокой стоимостью лида выше медианы категории"},{key:"sb-winners",icon:ms,title:"Лидеры",desc:"Объявления с самой низкой стоимостью лида — масштабируйте бюджет на них"},{key:"sb-savings",icon:bs,title:"Экономия",desc:"Сколько можно сэкономить, отключив неэффективные объявления"},{key:"sb-signals",icon:ft,title:"Сигналы",desc:"Классификация каждого объявления от A до G по эффективности расхода"},{key:"sb-history",icon:ys,title:"История метрик",desc:"График стоимости лида и просмотров по объявлению за 90 дней"},{key:"sb-pdf",icon:ws,title:"Отчёт PDF",desc:"Выгрузка аналитики расходов в PDF для себя или заказчика"}];return(w,I)=>{const he=Le("tooltip");return o(v).isReady?o(v).hasProfiles?(t(),n(ae,{key:2},[e("header",eo,[e("div",to,[Y.value?(t(),n(ae,{key:0},[e("div",so,[(t(),n(ae,null,ge(Ne,U=>e("button",{key:U.value,type:"button",class:oe(["period-btn",{active:o(p).spendPeriod===U.value}]),onClick:Fe=>o(p).setSpendPeriod(U.value)},f(U.label),11,no)),64))]),R(ze,{width:310},{default:F(()=>[E(f(wo))]),_:1}),R(Ms,{class:"sb-header__tabs","model-value":o(le),tabs:Ve.value,variant:"pill",size:"sm","aria-label":"Фильтр объявлений","onUpdate:modelValue":I[0]||(I[0]=U=>le.value=U)},null,8,["model-value","tabs"])],64)):b("",!0)])]),Y.value?(t(),n("div",lo,[o(q)?(t(),D(As,{key:0,onConfigure:Q})):b("",!0),o(ee)?(t(),n("section",ao,[Ce.value.has("wasteful")?b("",!0):(t(),D(Ae,{key:0,title:"Сливают бюджет",value:o(y),icon:"XCircle",status:o(y)>0?"danger":"success",tooltip:s},null,8,["value","status"])),Ce.value.has("winners")?b("",!0):(t(),D(Ae,{key:1,title:"Перспективные",value:o(O),icon:"CheckCircle",status:o(O)>0?"success":void 0,tooltip:l},null,8,["value","status"])),Ce.value.has("spend7d")?b("",!0):(t(),D(Ae,{key:2,title:"Расход 7д",value:x(o(we)),icon:"Zap",tooltip:m},null,8,["value"])),Ce.value.has("saving")?b("",!0):(t(),D(Ae,{key:3,title:"Потенциал экономии",value:x(o(K)),icon:"Star",status:o(K)>0?"warning":void 0,tooltip:a},null,8,["value","status"]))])):b("",!0),o(ee)&&be.value.showInsight?(t(),n("div",{key:2,class:oe(["sb-insight",`sb-insight--${re.value}`])},[(t(),D(De(We.value),{size:18,class:"sb-insight__icon"})),e("span",oo,f(qe.value),1)],2)):!o(ee)&&o(X)&&!o(W)?(t(),D(Rt,{key:3,title:"Нет данных по профилю",description:"Для выбранного профиля пока нет сводных данных по расходам.",icon:o(et)},null,8,["icon"])):b("",!0),be.value.showProfileSummary?(t(),D(sl,{key:4,"profile-id":o(p).profileId,period:o(p).spendPeriod},null,8,["profile-id","period"])):b("",!0),be.value.showCategoryBreakdown?(t(),D(Ll,{key:5,"profile-id":o(p).profileId,period:o(p).spendPeriod,"selected-category-id":C.value,onSelectCategory:z},null,8,["profile-id","period","selected-category-id"])):b("",!0),be.value.showActionCards&&(o(T).length||o(M).length)?(t(),n("div",io,[e("div",ro,[R(o(hs),{size:18,class:"sb-section__header-icon"}),I[5]||(I[5]=e("span",{id:"sb-action-cards-heading",class:"sb-section__title"},"Требуют внимания",-1)),R(ze,{class:"sb-section__title-help",width:310},{default:F(()=>[E(f(ko))]),_:1})]),e("section",co,[(t(!0),n(ae,null,ge(o(T),U=>(t(),D(Et,{key:`w-${U.ad_id}`,ad:U,variant:"wasteful",points:Se.value[U.ad_id],onRequestSparkline:Ee},null,8,["ad","points"]))),128)),(t(!0),n(ae,null,ge(o(M),U=>(t(),D(Et,{key:`b-${U.ad_id}`,ad:U,variant:"winner",points:Se.value[U.ad_id],onRequestSparkline:Ee},null,8,["ad","points"]))),128))])])):b("",!0),d.value?(t(),n("div",uo,[e("span",po,[e("span",_o,"Категория: "+f(d.value),1),B((t(),n("button",{type:"button",class:"sb-cat-filter__remove","aria-label":"Сбросить фильтр по категории",onClick:N},I[6]||(I[6]=[E("×")]))),[[he,"Сбросить фильтр"]])])])):b("",!0),R(gs,{name:"fade",mode:"out-in"},{default:F(()=>[(t(),D(Is,{key:o(le),"inline-fallback":""},{default:F(()=>[e("section",{id:`spendboard-panel-${o(le)}`,class:"sb-content",role:"tabpanel"},[o(c)?(t(),D(Vt,{key:0,title:"Не удалось загрузить данные Спендборда",description:o(c),retrying:o(te),onRetry:o(fe)},null,8,["description","retrying","onRetry"])):b("",!0),!o(c)&&j.value?(t(),D(xs,{key:1})):!o(c)&&o(ne)&&!o(te)&&!o(ie).length&&!j.value?(t(),D(Rt,{key:2,title:Ke.value,description:He.value,icon:o(et)},null,8,["title","description","icon"])):o(te)||o(ie).length?(t(),D(Rn,{key:3,ads:o(ie),sparklines:Se.value,"has-adspower":Oe.value,"current-page":o(de),"total-pages":o(ue).pages,"is-loading":o(te),sort:o(S),"highlight-ad-id":G.value,onRequestSparkline:Ee,"onUpdate:currentPage":o(pe),"onUpdate:sort":I[1]||(I[
21]=U=>S.value=U)},null,8,["ads","sparklines","has-adspower","current-page","total-pages","is-loading","sort","highlight-ad-id","onUpdate:currentPage"])):b("",!0)],8,vo)]),_:1}))]),_:1})])):b("",!0),Re.value?(t(),D(Ja,{key:1,"initial-settings":be.value,onClose:I[2]||(I[2]=U=>Re.value=!1),onApply:Ge},null,8,["initial-settings"])):b("",!0),_e.value?(t(),D(Ta,{key:2,"space-id":o(i)??"",period:o(p).spendPeriod,"current-profile-id":o(p).profileId,onClose:I[3]||(I[3]=U=>_e.value=!1)},null,8,["space-id","period","current-profile-id"])):b("",!0),Te.value?(t(),D(qs,{key:3,onClose:ye})):b("",!0),o(Ye)&&!Te.value?(t(),D(at,{key:4,"max-width":"820px",onClPopup:o(je)},{title:F(()=>[e("div",fo,[R(o(et),{size:28}),I[7]||(I[7]=e("span",null,"Спендборд",-1))])]),default:F(()=>[e("div",ho,[I[10]||(I[10]=e("p",{class:"intro-popup-subtitle"}," Аналитика расходов на продвижение — находите объявления, которые сливают бюджет, и те, что приносят дешёвые лиды ",-1)),e("div",go,[(t(),n(ae,null,ge(H,U=>e("div",{key:U.key,class:"intro-feature-card"},[e("div",{class:oe(["feature-icon",`feature-icon--${U.key}`])},[(t(),D(De(U.icon)))],2),e("h3",mo,f(U.title),1),e("p",bo,f(U.desc),1)])),64))]),e("div",yo,[e("label",{class:"dont-show-label",onClick:I[4]||(I[4]=ve(()=>{},["stop"]))},[R(Fs,{"model-value":o(Xe),size:"sm","aria-label":"Не показывать обзор Спендборда снова","onUpdate:modelValue":o(kt)},null,8,["model-value","onUpdate:modelValue"]),I[8]||(I[8]=e("span",null,"Не показывать снова",-1))]),R(zs,{onClick:o(je)},{text:F(()=>I[9]||(I[9]=[E(" Понятно ")])),_:1},8,["onClick"])])])]),_:1},8,["onClPopup"])):b("",!0)],64)):(t(),D(Bs,{key:1,icon:o(et),title:"Спендборд недоступен",description:"Добавьте профиль Авито, чтобы анализировать эффективность расходов на продвижение объявлений."},null,8,["icon"])):(t(),n("div",Qa,[R(Ut)]))}}}),ii=xe(Co,[["__scopeId","data-v-716c8a43"]]);export{ii as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.