PageSourceSearch

https://app.engineroommedia.com/assets/DataRoomPage-z2XF8Gnh.js

js engineroommedia.com collected 2026-10-04 06:40:43 UTC 36,423 bytes, 1 lines download raw bytes

1import{_ as Oe,a as qe,c as Ge,m as Ze}from"./ERMForm-BC6KFco6.js";import{u as Je,i as Qe,n as Xe,_ as et}from"./ReconnectModal-Db0qjszL.js";import{i as Se,u as De,j as Ie,y as Ye,z as tt,c as xe,t as O,D as je,e as ne,h as Be,A as at,w as Te,x as st}from"./index-DUF3Nigd.js";import{c as ot}from"./dataGaps-C-ER-kOB.js";import{r as S,s as v,Q as be,af as ze,c as r,f as n,y as e,i as c,C as ge,x as j,H as we,O as E,S as le,N as M,G as nt,D as Z,B as J,F as ee,o as Ee,w as He,z as se,b as We}from"./vue-vendor-Ca2KJKWD.js";import{_ as lt}from"./AccountSelectionModal-M3zkA86Z.js";import"./sentry-CIlHrBXa.js";import"./ag-grid-Dji7NRd5.js";const rt={class:"bg-[#FDFCFC] rounded-lg border border-gray-200 relative overflow-hidden"},it={class:"px-4 py-2"},ct={class:"grid grid-cols-4 gap-4 items-center mb-2"},dt={class:"flex items-center space-x-3"},ut={class:"flex-shrink-0"},mt={class:"text-lg font-hind leading-none font-bold text-gray-900 uppercase tracking-wide"},pt={class:"text-center"},ft={class:"flex items-center justify-center"},yt={key:0,class:"text-[10px] font-bold uppercase tracking-wide text-[#7a4a12] mt-1"},vt={key:1,class:"text-[10px] font-bold uppercase tracking-wide text-yellow-700 mt-1"},ht={class:"text-center"},gt={key:0,class:"text-xs text-gray-500 mt-1"},bt={class:"flex flex-col space-y-2 justify-end"},xt={class:"grid grid-cols-2 gap-4"},_t={class:"flex items-center gap-2"},wt={class:"text-sm text-gray-600"},kt={key:0,class:"flex items-center gap-4 bg-gray-100 px-4 py-4 border-t border-gray-200"},Ct={class:"flex-1 min-w-0"},$t={class:"font-orelega text-lg leading-tight text-gray-900"},St={class:"text-sm text-gray-700 mt-1"},Dt={class:"space-y-4"},Et={class:"bg-gray-50 p-4 rounded-lg"},At={class:"flex items-center space-x-3 mb-2"},Nt={class:"font-bold"},Mt={class:"text-sm text-gray-600"},Pt={key:0,class:"border-t pt-4 mt-2"},Rt={class:"text-sm text-gray-600 mb-2"},Tt={class:"space-y-4"},Ut={class:"bg-gray-50 p-4 rounded-lg"},Ot={class:"flex items-center space-x-3 mb-2"},It={class:"font-bold"},Yt={class:"text-sm text-gray-600"},Ue={__name:"PlatformCard",props:{platform:{type:Object,required:!0,validator:g=>"name"in g&&"status"in g}},emits:["update","settings","delete"],setup(g,{emit:w}){const R=Se(),I=De(),s=g,P=w,A=S(!1),$=S(!1),U=S(!1),b=S(!1),{startReconnect:Y,closeReconnect:k,credentialChannel:C,credentialPlatformKey:L}=Je(),x=v(()=>s.platform.auth_status==="NEEDS_RECONNECT"),H=v(()=>Qe(s.platform)),V=v(()=>!x.value&&Xe(s.platform)),u=v(()=>x.value&&!s.platform.lastDataDate),_=v(()=>!!s.platform.plan_paused_at),h=v(()=>s.platform.status!=="ACTIVE"),p=v(()=>s.platform.method==="upload"),f=v(()=>(s.platform.type||s.platform.icon||s.platform.name||"").toLowerCase()),m=v(()=>{var l;return(((l=te.value)==null?void 0:l.collectionMethods)||[]).find(o=>o.type==="upload")}),d=()=>{b.value=!1,P("update",{platform:s.platform})},T=v(()=>(s.platform.type||s.platform.platform||"").toLowerCase().includes("public")?!1:s.platform.method==="oauth"||s.platform.method==="credentials"),re=v(()=>({id:s.platform.id,channel_name:s.platform.channel_name,platformName:s.platform.platform||s.platform.type||s.platform.icon,channel_url:s.platform.channel_url||"",active:s.platform.status==="ACTIVE",show_id:s.platform.show_id??"",channel_color:ke.value,type:s.platform.type})),ie=()=>A.value=!0,ce=()=>$.value=!0,B=()=>U.value=!0,W=()=>Y(s.platform),de=()=>{$.value=!1,Y(s.platform)},z=async()=>{try{const{post:l}=xe(),o=await l(`/channels/${s.platform.id}/refresh`);if((o==null?void 0:o.status)==="error"){console.error(o.message);return}A.value=!1,O.success("Refresh started. This may take a few minutes."),await I.refreshUser(),P("update",{platform:s.platform})}catch(l){console.error("Failed to refresh platform:",l)}},Ae=async({mode:l,data:o,result:D})=>{var N,ae;$.value=!1;const G=o.show_id!=null&&o.show_id!==""&&Number(o.show_id)!==s.platform.show_id,Q=(ae=(N=I.user)==null?void 0:N.shows)==null?void 0:ae.find(ve=>ve.id===Number(o.show_id));O.success(G&&Q?`Moved to ${Q.name}`:"Platform settings updated"),await I.refreshUser(),P("settings",{platform:s.platform,data:o,result:D})},Ne=async()=>{try{const{del:l}=xe(),o=await l(`/channels/${s.platform.id}`);if((o==null?void 0:o.status)==="error"){console.error(o.message);return}U.value=!1,await I.refreshUser(),P("delete",{platform:s.platform})}catch(l){console.error("Failed to delete platform:",l)}},te=v(()=>Ie(s.platform.icon)),ke=v(()=>Ye(s.platform)),Me=v(()=>
1!!(s.platform.channel_color||s.platform.channel_group_color)),ue=()=>{const l=s.platform.lastDataDate||s.platform.updatedDate;if(!l)return null;try{const o=R(l).toDate();if(Number.isNaN(o.getTime()))return null;const D=Math.max(0,Math.ceil((new Date-o)/(1e3*60*60*24))),G=ot(s.platform.platform||s.platform.type);return Math.max(0,D-G)}catch{return null}},me=v(()=>{if(_.value)return`Your plan covers fewer platforms, so this one stopped collecting on ${R(s.platform.plan_paused_at).format("M/D/YYYY")}. Nothing was disconnected — upgrade and it resumes.`;if(s.platform.auth_status==="NEEDS_RECONNECT")return s.platform.status_message?s.platform.status_message:u.value?"Setup was never finished — sign in to start collecting":"Connection expired — reconnect to resume collection";if(h.value)return"Paused — collection is turned off for this platform";if(V.value)return"Apple ends sign-in sessions after a few hours — authorize again to pull new data";const l=s.platform.lastDataDate||s.platform.updatedDate;if(!l)return"No data collected yet";const o=R(l).format("M/D/YYYY"),D=ue();return D===null?"No data collected yet":D<=2?`Data current through ${o}`:D<=5?`Newest data is ${D} days old (${o})`:`No new data since ${o}`}),_e=async()=>{await I.refreshUser(),P("update",{platform:s.platform})},pe=v(()=>{const l=s.platform.lastDataDate;if(!l)return null;const o=R(l);return o.isValid()?Math.max(0,R().startOf("day").diff(o.startOf("day"),"day")):null}),Pe=v(()=>{const l=pe.value;return l===null?"Never":l===0?"Today":l===1?"Yesterday":`${l} days ago`}),Ce=v(()=>pe.value===null?"No data collected yet":`Newest data: ${R(s.platform.lastDataDate).format("M/D/YYYY")}`),$e=v(()=>{if(!s.platform.updatedDate)return null;const l=R(s.platform.updatedDate);return l.isValid()?l.format("M/D/YYYY h:mm A"):null}),Re=()=>{if(_.value||s.platform.auth_status==="NEEDS_RECONNECT")return"bg-yellow-500";if(V.value)return"bg-gradient-to-b from-[#D98BC0] to-[#B7307D]";if(h.value)return"bg-yellow-500";const l=ue();return l===null||l<=2?"bg-gradient-to-r from-[#6EE84C] to-[#229901]":l<=5?"bg-yellow-500":"bg-red-500"},fe=()=>{if(s.platform.auth_status==="NEEDS_RECONNECT")return"bg-yellow-500";if(V.value)return"bg-[#B7307D]";if(h.value)return"bg-yellow-500";if(s.platform.status!=="ACTIVE")return"bg-red-500";const l=ue();return l===null||l<=2?"bg-gradient-to-r from-[#6EE84C] to-[#229901]":l<=5?"bg-yellow-500":"bg-red-500"},ye=()=>{if(V.value)return"text-[#B7307D]";const l=ue();return l===null?"text-gray-900":l<=2?"bg-gradient-to-r from-[#6EE84C] to-[#229901] bg-clip-text text-transparent":l<=5?"text-yellow-600":"text-error"};return(l,o)=>{const D=be("Icon"),G=be("Modal"),Q=ze("tippy");return n(),r(ee,null,[e("div",rt,[e("div",{class:we(["h-1",fe()])},null,2),e("div",it,[e("div",ct,[e("div",dt,[e("div",ut,[c(D,{name:te.value.icon,size:"40px",class:"text-black"},null,8,["name"])]),e("div",null,[e("h3",mt,E(g.platform.name),1)])]),e("div",pt,[o[7]||(o[7]=e("p",{class:"text-xs font-bold text-gray-600 uppercase mb-1"},"STATUS",-1)),e("div",ft,[le(e("div",{class:we(["w-8 h-8 rounded-full border-2 border-black cursor-help",Re()])},null,2),[[Q,{content:me.value}]])]),_.value?(n(),r("p",yt,"Upgrade to resume")):h.value?(n(),r("p",vt,"Paused")):j("",!0)]),e("div",ht,[o[8]||(o[8]=e("p",{class:"text-xs font-bold text-gray-600 uppercase mb-1"},"LAST DATA",-1)),le((n(),r("p",{class:we(["text-sm font-medium",ye()])},[M(E(Pe.value),1)],2)),[[Q,{content:Ce.value}]]),$e.value?(n(),r("p",gt,E(p.value?"Last import":"Last sync")+": "+E($e.value),1)):j("",!0)]),e("div",bt,[x.value?(n(),r("button",{key:0,onClick:W,class:"btn-primary bg-yellow-500 hover:bg-yellow-600"},[M(E(u.value?"FINISH SETUP":"RECONNECT")+" ",1),c(D,{name:"alert",class:"ml-2",size:"14px"})])):p.value?(n(),r("button",{key:1,onClick:o[0]||(o[0]=N=>b.value=!0),class:"btn-primary"},[o[9]||(o[9]=M(" IMPORT CSV ",-1)),c(D,{name:"refresh",class:"ml-2",size:"14px"})])):H.value?j("",!0):(n(),r("button",{key:2,onClick:ie,class:"btn-primary"},[o[10]||(o[10]=M(" UPDATE ",-1)),c(D,{name:"refresh",class:"ml-2",size:"14px"})])),e("button",{onClick:ce,class:"btn-primary"}," SETTINGS ")])]),e("div",xt,[e("div",_t,[Me.value?le((n(),r("span",{key:0,class:"w-2.5 h-2.5 rounded-full shrink-0 border border-black/10",style:nt({backgroundColor:ke.value})}
1,null,4)),[[Q,{content:g.platform.channel_color?"Display color":`Color from ${g.platform.channel_group_name||"related channels"}`}]]):j("",!0),e("p",wt,E(g.platform.channel_name),1)]),(n(),r("button",{key:0,onClick:B,class:"px-10 py-1 text-red-600 text-sm font-bold hover:text-red-700 underline justify-self-end"}," DELETE "))])]),H.value&&!x.value?(n(),r("div",kt,[c(D,{name:"connect",class:"text-black flex-shrink-0",size:"44px"}),e("div",Ct,[e("p",$t,E(te.value.name)+" needs to be reauthorized each time you use Engine Room",1),e("p",St,"To keep your "+E(te.value.name)+" data up to date, you’ll need to reauthorize your connection each visit.",1)]),e("button",{onClick:W,class:"btn-primary whitespace-nowrap"},[o[11]||(o[11]=M(" AUTHORIZE ",-1)),c(D,{name:"connect",class:"ml-2",size:"14px"})])])):j("",!0)]),c(G,{"is-open":A.value,"onUpdate:isOpen":o[1]||(o[1]=N=>A.value=N),title:`Update ${g.platform.name}`,size:"md","show-actions":"","save-text":"Refresh Data",onSave:z},{default:Z(()=>[e("div",Dt,[o[12]||(o[12]=e("p",{class:"text-gray-600"},"Refresh your platform connection and sync latest data?",-1)),e("div",Et,[e("div",At,[c(D,{name:te.value.icon,size:"24px"},null,8,["name"]),e("span",Nt,E(g.platform.name),1)]),e("p",Mt,E(g.platform.channel_name),1)])])]),_:1},8,["is-open","title"]),c(G,{"is-open":b.value,"onUpdate:isOpen":o[2]||(o[2]=N=>b.value=N),title:`Import ${g.platform.name} stats`,size:"md"},{default:Z(()=>{var N,ae,ve;return[c(tt,{platform:f.value,"platform-name":g.platform.name,description:(N=m.value)==null?void 0:N.description,"method-label":(ae=m.value)==null?void 0:ae.label,upload:(ve=m.value)==null?void 0:ve.upload,"channel-id":g.platform.id,"show-back-button":!1,onSave:d},null,8,["platform","platform-name","description","method-label","upload","channel-id"])]}),_:1},8,["is-open","title"]),c(G,{"is-open":$.value,"onUpdate:isOpen":o[4]||(o[4]=N=>$.value=N),title:`${g.platform.name} Settings`,size:"lg","show-actions":!1},{default:Z(()=>[c(Oe,{schema:J(qe),mode:"edit","record-id":g.platform.id,"initial-data":re.value,onSubmit:Ae,onCancel:o[3]||(o[3]=N=>$.value=!1)},null,8,["schema","record-id","initial-data"]),T.value?(n(),r("div",Pt,[e("p",Rt," Changed your "+E(g.platform.name)+" password or access? Reconnect to keep data syncing. ",1),e("button",{onClick:de,class:"btn-secondary"}," RECONNECT ")])):j("",!0)]),_:1},8,["is-open","title"]),c(G,{"is-open":U.value,"onUpdate:isOpen":o[5]||(o[5]=N=>U.value=N),title:`Delete ${g.platform.name}`,size:"md","show-actions":"","save-text":"Delete",onSave:Ne},{default:Z(()=>[e("div",Tt,[o[13]||(o[13]=e("p",{class:"text-gray-600"},"Are you sure you want to delete this platform? This action cannot be undone.",-1)),e("div",Ut,[e("div",Ot,[c(D,{name:te.value.icon,size:"24px"},null,8,["name"]),e("span",It,E(g.platform.name),1)]),e("p",Yt,E(g.platform.channel_name),1)])])]),_:1},8,["is-open","title"]),J(C)?(n(),ge(et,{key:0,"is-open":!!J(C),"channel-id":J(C).id,platform:J(L)(J(C)),"channel-name":J(C).channel_name,"onUpdate:isOpen":o[6]||(o[6]=N=>!N&&J(k)()),onReconnected:_e},null,8,["is-open","channel-id","platform","channel-name"])):j("",!0)],64)}}},zt={class:"mb-8",id:"categories"},Ft={class:"bg-white rounded-lg p-6 border border-gray-300"},Lt={class:"flex items-center justify-between mb-6"},Vt={class:"flex space-x-2"},Gt=["onClick"],jt=["onClick"],Bt={__name:"CategoryManagementSection",emits:["add-new","edit","refresh"],setup(g,{expose:w,emit:R}){const{get:I,del:s}=xe(),P=R,A=S([]),$=async()=>{try{const k=await I("/categories/all?include_stats=true");A.value=(k==null?void 0:k.categories)||[]}catch(k){console.error("Error fetching categories:",k),A.value=[]}},U=()=>{P("add-new")},b=k=>{P("edit",k)},Y=async k=>{if(confirm(`Are you sure you want to delete the category "${k.name}"?`))try{await s(`/categories/${k.id}`),await $(),P("refresh")}catch(C){console.error("Error deleting category:",C),alert("Failed to delete category. Please try again.")}};return Ee(()=>{$()}),w({fetchCategories:$}),(k,C)=>{const L=be("Icon");return n(),r("section",zt,[e("div",Ft,[e("div",Lt,[C[1]||(C[1]=e("div",null,[e("h2",{class:""},"Category Management"),e("p",{class:"text-sm font-semibold"},"ENGINE ROOM ANALYSIS AND ORGANIZATION OF YOUR CONTENT")],-1)),e("button",{onClick:U,class:"btn-primary larger"},[C[0]||(C[0]=M(" ADD CATEGORY ",-1)),c(L,{name:"add",class:"ml-2",size:"16px"})])]),c(je,{data:A.value,"default-limit":5,columns:J(Ge).display.columns,"action-column-width":280,"row-height":40,"get-item-key":x=>x.id},{"cell-actions":Z(({item:x})=>[e("div",Vt,[e("button",{onClick:H=>b(x),class:"btn-primary"},[C[2]||(C[2]=M(" RENAME ",-1)),c(L,{name:"edit",class:"ml-2",size:"14px"})],8,Gt),e("button",{onClick:H=>Y(x),class:"btn-danger"},[C[3]||(C[3]=M(" REMOVE ",-1)),c(L,{name:"remove",class:"ml-2",size:"14px"})],8,jt)])]),_:1},8,["data","columns","get-item-key"])])])}}},Ht={class:"mb-8",id:"manual-metrics"},Wt={class:"bg-white rounded-lg p-6 border border-gray-300"},Kt={class:"uppercase text-sm"},qt={class:"font-medium"},Zt={class:"flex justify-center"},Jt={class:"flex space-x-2 justify-end"},Qt=["onClick"],Xt=["onClick"],ea={__name:"ManualMetricsSection",emits:["add-new","edit","refresh"],setup(g,{expose:w,emit:R}){const I=Se(),{get:s,del:P}=xe(),A=De(),$=R,U=S([]),b=[{key:"name",label:"NAME",sortable:!0},{key:"type_of",label:"TYPE",sortable:!0},{key:"time_period",label:"TIME PERIOD",sortable:!1},{key:"revenue",label:"REVENUE",sortable:!0},{key:"content_ids",label:"ASSOC. CONTENT",sortable:!1},{key:"actions",label:"",sortable:!1}],Y=async()=>{try{const u=await s("/metric_manual");U.value=(u==null?void 0:u.data)||[]}catch(u){console.error("Error fetching manual metrics:",u),U.value=[]}};v(()=>A.selectedShowId===null?null:A.availableShows.find(u=>u.id===A.selectedShowId));const k=(u,_)=>{if(!u&&!_)return"-";const h=m=>m?I(m).format("MMM D, YY"):"",p=h(u),f=h(_);return p&&f?`${p.toUpperCase()} - ${f.toUpperCase()}`:p?p.toUpperCase():f?f.toUpperCase():"-"},C=u=>u==null?"-":new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0}).format(u),L=u=>{if(!u)return!1;let _=u;if(typeof u=="string")try{_=JSON.parse(u)}catch{return!1}return Array.isArray(_)&&_.length>0},x=()=>{$("add-new")},H=u=>{console.log(u),$("edit",u)},V=async u=>
1{if(confirm(`Are you sure you want to delete "${u.name}"?`))try{await P(`/metrics/manual/${u.id}`),await Y(),$("refresh"),O.success("Manual metric deleted successfully")}catch(_){console.error("Error deleting manual metric:",_),O.error("Failed to delete manual metric. Please try again.")}};return Ee(()=>{Y()}),w({fetchManualMetrics:Y}),(u,_)=>(n(),r("section",Ht,[e("div",Wt,[_[3]||(_[3]=e("div",{class:"mb-6"},[e("h2",{class:""},"Self-Reported Revenue"),e("p",{class:"text-sm text-gray-600 mt-2"}," Want the full picture? Add your own data like brand deals, self-sold ad revenue, affiliate links, merch sales, or side gigs such as speaking or consulting associated with your content. ")],-1)),c(je,{data:U.value,columns:b,"action-column-width":240,"get-item-key":h=>h.id,"show-search":"","search-fields":["name","type_of","description"]},{actions:Z(()=>[e("button",{onClick:x,class:"btn-primary larger"},[_[0]||(_[0]=M(" ADD NEW DATA ",-1)),c(ne,{name:"add",class:"ml-2",size:"16px"})])]),"cell-time_period":Z(({item:h})=>[e("span",Kt,E(k(h.start_date,h.end_date)),1)]),"cell-revenue":Z(({item:h})=>[e("span",qt,E(C(h.amount)),1)]),"cell-content_ids":Z(({item:h})=>[e("div",Zt,[c(ne,{name:L(h.content_ids)?"check-circle":"circle",class:we(L(h.content_ids)?"text-primary":"text-gray-300"),size:"20px"},null,8,["name","class"])])]),"cell-actions":Z(({item:h})=>[e("div",Jt,[e("button",{onClick:p=>H(h),class:"btn-primary"},[_[1]||(_[1]=M(" EDIT ",-1)),c(ne,{name:"edit",class:"ml-2",size:"14px"})],8,Qt),e("button",{onClick:p=>V(h),class:"btn-danger"},[_[2]||(_[2]=M(" REMOVE ",-1)),c(ne,{name:"remove",class:"ml-2",size:"14px"})],8,Xt)])]),_:1},8,["data","get-item-key"])])]))}},ta={class:"mb-8",id:"fill-data-gaps"},aa={class:"bg-white rounded-lg p-6 border border-gray-300"},sa={key:0,class:"text-center py-8"},oa={key:1,class:"overflow-x-auto"},na={class:"w-full text-sm"},la={class:"border-b border-gray-200 text-gray-600 uppercase tracking-wider text-xs"},ra={class:"divide-y divide-gray-200"},ia={class:"py-4 pr-4"},ca={class:"flex items-center space-x-3"},da={class:"font-semibold text-gray-900"},ua={class:"text-xs font-semibold text-gray-500 uppercase tracking-wider"},ma={key:1,class:"inline-block px-2 py-0.5 rounded text-xs font-bold uppercase tracking-wider bg-blue-50 text-blue-600"},pa={key:2,class:"text-gray-300"},fa={key:3,class:"inline-block px-2 py-0.5 rounded text-xs font-bold uppercase tracking-wider bg-red-50 text-red-600"},ya={class:"py-4 pl-4"},va={class:"flex flex-col items-end space-y-1"},ha=["disabled","onClick"],ga={key:0},ba={key:1},xa={__name:"FillDataGapsSection",emits:["refresh"],setup(g,{emit:w}){const R=Se(),{post:I,get:s}=xe(),P=De(),A=Be(),$=[{key:"ad_revenue",label:"Ad Revenue"},{key:"views",label:"Views"},{key:"watch_time",label:"View / Listen Time"},{key:"paid_subscribers",label:"Paid Subscribers"}],U=S({}),b=S(null),Y={status:"missing",days:0,lastDate:null,sources:[]},k=async()=>{try{const p=await s("/metrics/coverage");U.value=(p==null?void 0:p.coverage)||{},b.value=(p==null?void 0:p.range)||null}catch(p){console.error("Failed to load metric coverage:",p)}},C=p=>{const f=U.value[p.id]||{};return $.reduce((m,d)=>(m[d.key]=f[d.key]||Y,m),{})},L=p=>{const f=p.status==="imported"?"Supplied by upload":"Collected",m=p.expectedDays?` — ${p.days} of ${p.expectedDays} days`:"",d=p.lastDate?`, through ${R(p.lastDate).format("MM/DD/YYYY")}`:"";return`${f}${m}${d}`};Ee(k),He(()=>P.selectedShowId,()=>k());const x=v(()=>{var f;return(((f=P.user)==null?void 0:f.channels)||[]).filter(m=>!(m.platform||m.type||"").toLowerCase().endsWith("- public")).map(m=>{const d=Ie(m.platform||m.type);return{id:m.id,platformKey:(m.platform||m.type||"").toLowerCase(),name:d.name||m.platform||"Unknown",channelName:m.channel_name||d.name||"this channel",icon:d.icon,color:Ye(m),lastUpdated:m.last_updated?`LAST UPDATED - ${R(m.last_updated).format("MM/DD/YYYY")}`:"NEVER UPDATED",coverage:C(m)}})}),H=S(null),V=S(null),u=S(null),_=p=>{var f;V.value=p,(f=H.value)==null||f.click()},h=async p=>{var re,ie,ce;const f=p.target,m=(re=f.files)==null?void 0:re[0],d=V.value;if(f.value="",!m||!d)return;const T=new FormData;T.append("file",m),T.append("channel_id",d.id),P.selectedShowId&&T.append("show_id",P.selectedShowId),u.value=d.id;try{const B=await I("/chat/attachments",T),W=$.filter(z=>d.coverage[z.key].status==="missing").map(z=>z.label),de=W.length?` We are missing ${W.join(", ")} for this channel, so map whatever of that the file covers.`:"";A.open(We(at),{initialMessage:`I'm attaching ${m.name} for my ${d.name} channel "${d.channelName}" (channel ID ${d.id}).${de} Stage it so I can review before anything is saved.`,initialAttachments:[B]},"Producer")}catch(B){console.error("CSV upload failed:",B),O.error(((ce=(ie=B==null?void 0:B.response)==null?void 0:ie.data)==null?void 0:ce.error)||`Failed to upload ${m.name}. Please try again.`)}finally{u.value=null,V.value=null}};return(p,f)=>{const m=ze("tippy");return n(),r("section",ta,[e("div",aa,[f[5]||(f[5]=e("div",{class:"mb-6"},[e("h2",{class:""},"Fill Data Gaps"),e("p",{class:"text-sm text-gray-600 mt-2 max-w-3xl"}," Platforms limit the data we can access automatically. You can fill that gap by creating and then uploading a CSV file from each platform with the missing data. ")],-1)),x.value.length===0?(n(),r("div",sa,[...f[0]||(f[0]=[e("p",{class:"text-gray-500"},"Connect a platform to start filling data gaps.",-1)])])):(n(),r("div",oa,[e("table",na,[e("thead",null,[e("tr",la,[f[1]||(f[1]=e("th",{class:"text-left font-medium py-3 pr-4"},"Platform",-1)),(n(),r(ee,null,se($,d=>
1e("th",{key:d.key,class:"text-center font-medium py-3 px-4"},E(d.label),1)),64)),f[2]||(f[2]=e("th",{class:"py-3 pl-4"},null,-1))])]),e("tbody",ra,[(n(!0),r(ee,null,se(x.value,d=>(n(),r("tr",{key:d.id,class:"align-middle"},[e("td",ia,[e("div",ca,[c(ne,{name:d.icon,size:"28px",color:d.color},null,8,["name","color"]),e("div",null,[e("div",da,E(d.name),1),e("div",ua,E(d.lastUpdated),1)])])]),(n(),r(ee,null,se($,T=>e("td",{key:T.key,class:"py-4 px-4 text-center"},[d.coverage[T.key].status==="collected"?le((n(),ge(ne,{key:0,name:"check-on",size:"20px",class:"text-green-600"},null,512)),[[m,{content:L(d.coverage[T.key])}]]):d.coverage[T.key].status==="imported"?le((n(),r("span",ma,[...f[3]||(f[3]=[M(" Supplied ",-1)])])),[[m,{content:L(d.coverage[T.key])}]]):d.coverage[T.key].status==="not_applicable"?le((n(),r("span",pa,[...f[4]||(f[4]=[M(" — ",-1)])])),[[m,{content:`${d.name} does not report ${T.label.toLowerCase()}`}]]):(n(),r("span",fa," Need "))])),64)),e("td",ya,[e("div",va,[e("button",{class:"btn-primary",disabled:u.value===d.id,onClick:T=>_(d)},[u.value===d.id?(n(),r("span",ga,"UPLOADING...")):(n(),r("span",ba,"UPLOAD FILE(S)")),c(ne,{name:"upload",class:"ml-2",size:"14px"})],8,ha)])])]))),128))])])])),e("input",{ref_key:"fileInputRef",ref:H,type:"file",accept:".csv,text/csv,image/png,image/jpeg,image/gif,image/webp",class:"hidden",onChange:h},null,544)])])}}},_a={key:0,class:"bg-danger relative h-[6px]"},wa={class:"pill absolute right-4 top-1/2 -translate-y-1/2 bg-danger text-white text-xs font-bold px-5 pt-3 rounded-full uppercase"},ka={class:"min-h-screen bg-gray-50 py-8"},Ca={class:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"},$a={class:"mb-8",id:"platforms"},Sa={class:"bg-white rounded-lg p-6 border border-gray-300"},Da={class:"flex flex-wrap items-start justify-between gap-4 mb-6"},Ea={class:"flex flex-wrap items-center gap-3"},Aa={key:0,class:"mb-6 max-w-[260px]"},Na={key:1},Ma={class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},Pa={class:"bg-gradient-to-br from-primary/10 to-primary/20 border border-primary/30 rounded-lg p-6 flex flex-col justify-center"},Ra={class:"flex items-start space-x-3"},Ta={key:2,class:"mb-6"},Ua={class:"bg-gradient-to-r from-primary/10 to-primary/20 border border-primary/30 rounded-lg p-6"},Oa={class:"flex items-start space-x-4"},Ia={class:"flex-shrink-0"},Ya={key:3,class:"mb-6 mt-4"},za={class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},Fa={key:4,class:"text-center py-8"},La={key:5,class:"mt-8 pt-6 border-t border-gray-200"},Va={class:"divide-y divide-gray-200"},Ga={class:"flex flex-wrap items-center justify-between gap-3 mb-4"},ja={class:"min-w-[220px]"},Ba={class:"flex items-center gap-2"},Ha=["onClick"],Wa={class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},Ka=["onClick"],qa=["onClick"],Za={class:"space-y-4"},Ja={key:0,class:"max-h-80 overflow-y-auto -mx-1 px-1 space-y-2"},Qa=["onClick"],Xa={class:"flex-grow min-w-0"},es={class:"block text-sm font-bold text-gray-900 truncate"},ts={class:"block text-xs text-gray-500 uppercase tracking-wide"},as={key:1,class:"text-sm text-gray-500 italic"},ms={__name:"DataRoomPage",props:{user:{type:Object,default:null}},setup(g){const w=De(),R=Se(),I=Be(),s=xe(),P=g,A=v(()=>P.user||w.user||{channels:[],username:"User",email:"[email protected]"}),$=S(null),U=S(null);Ee(()=>{o(),V()}),He(()=>w.selectedShowId,()=>V());const b=S({show:!1,schema:null,mode:"create",record:null}),Y=S(!1),k=()=>Y.value=!0,C=v(()=>w.availableShows),L=v({get:()=>w.selectedShowId,set:a=>w.setSelectedShow(a||null)}),x=S([]),H=["#7C3AED","#2563EB","#059669","#DB2777","#EA580C","#0891B2"],V=async()=>{if(!w.selectedShowId){x.value=[];return}try{const a=await s.get("/channel_groups");x.value=((a==null?void 0:a.data)||[]).map(u)}catch(a){console.error("Failed to load channel groups:",a)}},u=a=>({...a,id:Number(a.id)}),_=async()=>{try{const a=await s.post("/channel_groups",{name:`Related Channels ${x.value.length+1}`,color:H[x.value.length%H.length],show_id:w.selectedShowId});a!=null&&a.channel_group&&x.value.push(u(a.channel_group))}catch(a){console.error("Failed to create channel group:",a),O.error("Failed to create related channels group.")}},h=new Map,p=a=>{clearTimeout(h.get(a.id)),h.set(a.id,setTimeout(()=>{h.delete(a.id),d(a),T(a)},500))},f=(a,t)=>{a.name=t,p(a)},m=(a,t)=>{a.color=t,p(a)},d=a=>{var t;for(const y of((t=w.user)==null?void 0:t.channels)||[])y.channel_group_id===a.id&&(y.channel_group_color=a.color,y.channel_group_name=a.name)},T=async a=>{try{await s.put(`/channel_groups/${a.id}`,{name:a.name,color:a.color}),O.success(`Saved ${a.name||"related channels"}.`)}catch(t){console.error("Failed to update channel group:",t),O.error(`Could not save ${a.name||"this group"}. Your change was not kept.`),await V(),await w.refreshUser()}},re=async a=>{try{await s.del(`/channel_groups/${a}`),x.value=x.value.filter(t=>t.id!==a),await w.refreshUser()}catch(t){console.error("Failed to delete channel group:",t),O.error("Failed to remove group.")}},ie=v(()=>new Set(x.value.map(a=>a.id))),ce=a=>Q.value.filter(t=>t.channel_group_id===a.id),B=v(()=>Q.value.filter(a=>!a.channel_group_id||!ie.value.has(a.channel_group_id))),W=S(!1),de=S(null),z=S([]),Ae=a=>{de.value=a,z.value=[],W.value=!0},Ne=a=>{const t=z.value.indexOf(a);t===-1?z.value.push(a):z.value.splice(t,1)},te=(a,t)=>s.put(`/channels/${a}`,{channel_group_id:t}),ke=async()=>{const a=de.value,t=[...z.value];W.value=!1;try{await Promise.all(t.map(y=>te(y,a))),await w.refreshUser()}catch(y){console.error("Failed to add services to group:",y),O.error("Failed to add services to this group.")}},Me=()=>{W.value=!1,k()},ue=async a=>{try{await te(a,null),await w.refreshUser()}catch(t){console.error("Failed to remove service from group:",t),O.error("Failed to move this service back.")}},me=S(!1),_e=S(null),pe=S(null),Pe=(a,t)=>{_e.value=a,pe.value=t,me.value=!0},Ce=()=>{me.value=!1,_e.value=null,pe.value=null},$e=async()=>{Te({status:"success"})||await w.refreshUser(),Ce(),G(),D()},Re=()=>{Ce(),G()},fe=(a,t="create",y=null,F={})=>{const q={category:Ge,metric_manual:Ze}[a];if(F.useSidebar){const oe=q.title||q.name;I.open(We(Oe),{schema:q,mode:t,initialData:y,recordId:y==null?void 0:y.id,onSubmit:he=>{I.close(),Fe(he)},onCancel:()=>I.close()},oe)}else b.value={show:!0,schema:q,mode:t,record:y}},ye=()=>{b.value={show:!1,schema:null,mode:"create",record:null}},l=()=>{w.refreshUser(),Y.value=!1},o=()=>{const a=new URLSearchParams(window.location.search),t=a.get("next"),y=a.get("session"),F=a.get("platform"),K=a.get("oauth");if(t==="select"&&y&&F)G(),Pe(y,F);else if(K==="done"&&!t)Te({status:"success"})||(O.success("Platform connected successfully!"),w.refreshUser()),G(),D();else if(K==="error"){const q=a.get("message")||"Failed to connect platform";Te({status:"error",message:q})||O.error(q),G(),D()}},D=()=>{window.opener&&!window.opener.closed&&window.close()},G=()=>{const a=new URL(window.location.href);a.searchParams.delete("oauth"),a.searchParams.delete("next"),a.searchParams.delete("session"),a.searchParams.delete("platform"),a.searchParams.delete("message"),window.history.replaceState({},"",a.toString())},Q=v(()=>{var a;return(a=A.value)!=null&&a.channels?A.value.channels.map(t=>{var F,K;const y=Ie(t.platform||t.type);return{...t,name:((F=y.name)==null?void 0:F.toUpperCase())||((K=t.platform)==null?void 0:K.toUpperCase())||"UNKNOWN",icon:y.icon,auth_status:t.status,status:t.active?"ACTIVE":"INACTIVE",lastUpdated:t.last_updated?`LAST UPDATED - ${ve(t.last_updated)}`:"NEVER UPDATED",updatedDate:t.last_updated||"",lastDataDate:t.last_data_date||""}}):[]}),N=v(()=>B.value.filter(a=>(a.platform||a.type||"").toLowerCase().endsWith("- public"))),ae=v(()=>B.value.filter(a=>!(a.platform||a.type||"").toLowerCase().endsWith("- public"))),ve=a=>{if(!a)return"";const t=R(a);return R().diff(t,"day")===0?"TODAY":t.format("MM/DD/YYYY h:mm A")},Ke=()=>{if(!b.value.schema)return"";const a=b.value.schema.title,t=b.value.mode;return t==="create"?`Add ${a}`:t==="edit"?`Edit ${a}`:t==="view"?`View ${a}`:a},Fe=async({mode:a})=>{var F,K,q,oe;const t=(F=b.value.schema)==null?void 0:F.name,y=(K=b.value.schema)==null?void 0:K.title;try{t==="metric_manual"?(await((q=U.value)==null?void 0:q.fetchManualMetrics()),O.success(`Self reported data ${a==="create"?"added":"updated"} successfully. It may take a few moments for the data to appear in Engine Room reports.`)):t==="category"?(await((oe=$.value)==null?void 0:oe.fetchCategories()),O.success(`Category ${a==="create"?"added":"updated"} successfully`)):await w.refreshUser(),ye()}catch(he){console.error(`Failed to ${a} ${t}:`,he),O.error(`Failed to ${a} ${y}. Please try again.`),ye()}};return(a,t)=>{var oe,he,Le,Ve;const y=be("Icon"),F=be("FormInput"),K=be("Modal"),q=ze("tippy");return n(),r(ee,null,[(oe=A.value)!=null&&oe.is_super_admin||(Le=(he=A.value)==null?void 0:he.roles)!=null&&Le.includes("admin")?(n(),r("div",_a,[e("span",wa,E((Ve=A.value)!=null&&Ve.is_super_admin?"Super Admin":"Admin"),1)])):j("",!0),e("div",ka,[e("div",Ca,[t[28]||(t[28]=e("div",{class:"flex items-center justify-between mb-8"},[e("h1",{class:""},"Data Room")],-1)),e("section",$a,[e("div",Sa,[e("div",Da,[t[13]||(t[13]=e("div",null,[e("h2",{class:""},"Your Platforms"),e("p",{class:"text-sm font-semibold"},"MANAGE YOUR PLATFORMS & DATA")],-1)),e("div",Ea,[e("button",{onClick:_,class:"btn-primary"},[t[11]||(t[11]=M(" ADD RELATED CHANNELS ",-1)),c(y,{name:"add",class:"ml-2",size:"14px"})]),e("button",{onClick:k,class:"btn-primary larger"},[t[12]||(t[12]=M(" ADD A SERVICE ",-1)),c(y,{name:"add",class:"ml-2",size:"16px"})])])]),C.value.length?(n(),r("div",Aa,[c(F,{modelValue:L.value,"onUpdate:modelValue":t[0]||(t[0]=i=>L.value=i),type:"select",label:"Show Name",options:C.value},null,8,["modelValue","options"])])):j("",!0),ae.value.length>0?(n(),r("div",Na,[t[18]||(t[18]=e("h5",{class:"text-lg font-semibold text-gray-900 mb-4"},"Private Platforms",-1)),e("div",Ma,[(n(!0),r(ee,null,se(ae.value,i=>(n(),ge(Ue,{key:i.id,platform:i},null,8,["platform"]))),128)),e("div",Pa,[e("div",Ra,[c(y,{name:"info",size:"24px",class:"text-primary flex-shrink-0"}),e("div",null,[t[15]||(t[15]=e("h5",{class:"text-base font-bold text-primary mb-1"}
1,"Get Connected",-1)),t[16]||(t[16]=e("p",{class:"text-sm text-primary/80 mb-3"}," Sign in to your account to unlock richer analytics and better insights across your platforms. ",-1)),e("button",{onClick:k,class:"btn-primary"},[t[14]||(t[14]=M(" Get Connected ",-1)),c(y,{name:"arrow-right",class:"ml-2",size:"14px"})])])])]),e("div",{onClick:k,class:"flex items-center justify-center cursor-pointer",style:{"border-radius":"8px",border:"1px dashed #D0D0D0","min-height":"80px"}},[...t[17]||(t[17]=[e("span",{class:"text-sm font-bold text-gray-500 uppercase tracking-wider"},"ADD A SERVICE +",-1)])])])])):(n(),r("div",Ta,[e("div",Ua,[e("div",Oa,[e("div",Ia,[c(y,{name:"info",size:"24px",class:"text-primary"})]),e("div",null,[t[20]||(t[20]=e("h5",{class:"text-lg font-semibold text-primary mb-2"},"Connect Private Platforms for Better Data",-1)),t[21]||(t[21]=e("p",{class:"text-primary/80 mb-4"}," Private platform connections provide significantly more comprehensive data and insights compared to public sources. Get access to detailed analytics, engagement metrics, and real-time updates by connecting your accounts directly. ",-1)),e("button",{onClick:k,class:"btn-primary"},[t[19]||(t[19]=M(" Connect Private Platform ",-1)),c(y,{name:"arrow-right",class:"ml-2",size:"14px"})])])])])])),N.value.length>0?(n(),r("div",Ya,[t[22]||(t[22]=e("h5",{class:"text-lg font-semibold text-gray-900 mb-4"},[M("Public Platforms"),e("span",{class:"font-normal"})],-1)),e("div",za,[(n(!0),r(ee,null,se(N.value,i=>(n(),ge(Ue,{key:i.id,platform:i},null,8,["platform"]))),128))])])):j("",!0),Q.value.length===0?(n(),r("div",Fa,[...t[23]||(t[23]=[e("p",{class:"text-gray-500"},"No platforms connected.",-1)])])):j("",!0),x.value.length?(n(),r("div",La,[t[27]||(t[27]=e("h5",{class:"text-lg font-semibold text-gray-900 mb-4"},"Related Channels",-1)),e("div",Va,[(n(!0),r(ee,null,se(x.value,i=>(n(),r("div",{key:i.id,class:"py-6 first:pt-0 last:pb-0"},[e("div",Ga,[e("div",ja,[c(F,{"model-value":i.name,label:"Related Channels Name","onUpdate:modelValue":X=>f(i,X)},null,8,["model-value","onUpdate:modelValue"])]),e("div",Ba,[c(F,{"model-value":i.color,type:"color","onUpdate:modelValue":X=>m(i,X)},null,8,["model-value","onUpdate:modelValue"]),e("button",{onClick:X=>re(i.id),class:"btn-primary"},[t[24]||(t[24]=M(" REMOVE RELATED CHANNEL ",-1)),c(y,{name:"remove",class:"ml-2",size:"14px"})],8,Ha)])]),e("div",Wa,[(n(!0),r(ee,null,se(ce(i),X=>(n(),r("div",{key:X.id,class:"relative"},[c(Ue,{platform:X},null,8,["platform"]),le((n(),r("button",{onClick:ss=>ue(X.id),class:"absolute top-3 right-3 z-10 w-6 h-6 rounded-full bg-white border border-gray-300 text-gray-500 text-sm font-bold leading-none hover:text-red-600 hover:border-red-300"},[...t[25]||(t[25]=[M(" × ",-1)])],8,Ka)),[[q,{content:"Move back to Your Platforms"}]])]))),128)),e("div",{onClick:X=>Ae(i.id),class:"flex items-center justify-center cursor-pointer",style:{"border-radius":"8px",border:"1px dashed #D0D0D0","min-height":"80px"}},[...t[26]||(t[26]=[e("span",{class:"text-sm font-bold text-gray-500 uppercase tracking-wider"},"ADD A SERVICE +",-1)])],8,qa)])]))),128))])])):j("",!0)])]),c(ea,{ref_key:"manualMetricsSectionRef",ref:U,onAddNew:t[1]||(t[1]=i=>fe("metric_manual","create",null,{useSidebar:!0})),onEdit:t[2]||(t[2]=i=>fe("metric_manual","edit",i,{useSidebar:!0}))},null,512),c(xa,{onRefresh:t[3]||(t[3]=i=>J(w).refreshUser())}),c(Bt,{ref_key:"categoryManagementSectionRef",ref:$,onAddNew:t[4]||(t[4]=i=>fe("category","create")),onEdit:t[5]||(t[5]=i=>fe("category","edit",i))},null,512)]),c(K,{"is-open":W.value,"onUpdate:isOpen":t[6]||(t[6]=i=>W.value=i),title:"Add a Service",size:"md","show-actions":"","save-text":z.value.length>1?`Add ${z.value.length} Services`:"Add Service",onSave:ke,onCancel:t[7]||(t[7]=i=>W.value=!1)},{default:Z(()=>[e("div",Za,[t[29]||(t[29]=e("p",{class:"text-sm text-gray-600"}," Choose which of your connected services belong to this group. Moving a service here removes its card from Your Platforms. ",-1)),B.value.length?(n(),r("div",Ja,[(n(!0),r(ee,null,se(B.value,i=>(n(),r("button",{key:i.id,onClick:X=>Ne(i.id),class:we(["w-full flex items-center gap-3 rounded-lg border px-3 py-2 text-left transition-colors",z.value.includes(i.id)?"border-primary bg-primary/10":"border-gray-200 hover:border-gray-300 hover:bg-gray-50"])},[c(y,{name:i.icon,size:"28px",color:J(Ye)(i)},null,8,["name","color"]),e("span",Xa,[e("span",es,E(i.channel_name||"(unnamed)"),1),e("span",ts,E(i.name),1)]),z.value.includes(i.id)?(n(),ge(y,{key:0,name:"check-on",size:"16px",class:"text-primary"})):j("",!0)],10,Qa))),128))])):(n(),r("p",as," Every connected service is already in a group. ")),e("button",{onClick:Me,class:"text-sm font-bold text-primary hover:underline"}," Connect a new platform instead ")])]),_:1},8,["is-open","save-text"]),c(st,{"is-open":Y.value,"onUpdate:isOpen":t[8]||(t[8]=i=>Y.value=i),onSave:l},null,8,["is-open"]),c(lt,{"is-open":me.value,"onUpdate:isOpen":t[9]||(t[9]=i=>me.value=i),"session-id":_e.value,platform:pe.value,onComplete:$e,onError:Re},null,8,["is-open","session-id","platform"]),c(K,{"is-open":b.value.show,"onUpdate:isOpen":t[10]||(t[10]=i=>b.value.show=i),title:Ke(),size:"md","show-actions":!1,onCancel:ye},{default:Z(()=>{var i;return[b.value.schema?(n(),ge(Oe,{key:0,schema:b.value.schema,mode:b.value.mode,"record-id":(i=b.value.record)==null?void 0:i.id,"initial-data":b.value.record,onSubmit:Fe,onCancel:ye},null,8,["schema","mode","record-id","initial-data"])):j("",!0)]}),_:1},8,["is-open","title"])])],64)}}};export{ms 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.