PageSourceSearch

https://8080.ai/static/js/4415.a63f27b8.chunk.js

js 8080.ai collected 2026-10-01 23:50:37 UTC 9,640 bytes, 2 lines download raw bytes

1"use strict";(globalThis.webpackChunkfrontend||=[]).push([[4415],{4415(e,a,t){t.d(a,{TeamAnalyticsPage:()=>C});var s=t(65043),l=t(53217),n=t(59550),r=t(39245),c=t(94851);var i=t(70579);const o=new Intl.NumberFormat,d=e=>o.format(e||0),h=e=>null===e||void 0===e?"-":e.toFixed(1),m=e=>(e.name||e.email||"User").split(/\s+/).filter(Boolean).slice(0,2).map(e=>{var a;return null===(a=e[0])||void 0===a?void 0:a.toUpperCase()}).join("")||"U",j=e=>"all"===e?"All members":"reports"===e?"My reports":"My usage",u=e=>{let{label:a,value:t,tone:s="primary"}=e;return(0,i.jsxs)("div",{className:`team-analytics-metric team-analytics-metric--${s}`,children:[(0,i.jsx)("span",{children:a}),(0,i.jsx)("strong",{children:d(t)})]})},x=e=>{let{label:a,value:t}=e;return(0,i.jsxs)("div",{className:"team-analytics-metric team-analytics-metric--score",children:[(0,i.jsx)("span",{children:a}),(0,i.jsx)("strong",{children:h(t)})]})},p=e=>{let{value:a}=e;return(0,i.jsx)("span",{className:"team-analytics-score-pill",children:h(a)})},y=e=>{let{row:a}=e;const[t,l]=(0,s.useState)(null),n=a.avatar_url;return n&&t!==n?(0,i.jsx)("img",{className:"team-analytics-avatar",src:n,alt:"",referrerPolicy:"no-referrer",onError:()=>l(n)}):(0,i.jsx)("div",{className:"team-analytics-avatar team-analytics-avatar--fallback",children:m(a)})},_=e=>{let{row:a,showProject:t}=e;return(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:(0,i.jsxs)("div",{className:"team-analytics-user",children:[(0,i.jsx)(y,{row:a}),(0,i.jsxs)("div",{children:[(0,i.jsx)("div",{className:"team-analytics-user__name",children:a.name||a.email}),(0,i.jsx)("div",{className:"team-analytics-user__email",children:a.email})]})]})}),t&&(0,i.jsx)("td",{className:"team-analytics-project-cell",children:a.project_title}),(0,i.jsx)("td",{children:(0,i.jsxs)("div",{className:"team-analytics-badges",children:[(0,i.jsx)("span",{children:c.y$[a.role]||a.role}),(0,i.jsx)("span",{children:c.Nl[a.team_role]||a.team_role})]})}),(0,i.jsx)("td",{className:"team-analytics-muted",children:a.manager_name||"-"}),(0,i.jsx)("td",{className:"team-analytics-number",children:d(a.session_count)}),(0,i.jsx)("td",{className:"team-analytics-number team-analytics-number--input",children:d(a.input_tokens)}),(0,i.jsx)("td",{className:"team-analytics-number team-analytics-number--output",children:d(a.output_tokens)}),(0,i.jsx)("td",{className:"team-analytics-number team-analytics-number--total",children:d(a.total_tokens)}),(0,i.jsx)("td",{className:"team-analytics-number",children:d(a.feedback_count)}),(0,i.jsx)("td",{children:(0,i.jsx)(p,{value:a.avg_user_effort_score})}),(0,i.jsx)("td",{children:(0,i.jsx)(p,{value:a.avg_technical_depth_score})})]})},v=()=>(0,i.jsxs)("div",{className:"team-analytics-empty",children:[(0,i.jsx)("strong",{children:"No visible usage yet"}),(0,i.jsx)("span",{children:"Token totals will appear here once sessions in your reporting scope start using models."})]}),g=e=>{let{data:a}=e;const t=!a.selected_project_id;return 0===a.rows.length?(0,i.jsx)(v,{}):(0,i.jsx)("div",{className:"team-analytics-table-wrap",children:(0,i.jsxs)("table",{className:"team-analytics-table",children:[(0,i.jsx)("thead",{children:(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:"User"}),t&&(0,i.jsx)("th",{children:"Project"}),(0,i.jsx)("th",{children:"Role"}),(0,i.jsx)("th",{children:"Reports to"}),(0,i.jsx)("th",{children:"Sessions"}),(0,i.jsx)("th",{children:"Input"}),(0,i.jsx)("th",{children:"Output"}),(0,i.jsx)("th",{children:"Total"}),(0,i.jsx)("th",{children:"Feedback"}),(0,i.jsx)("th",{children:"Effort"}),(0,i.jsx)("th",{children:"Tech depth"})]})}),(0,i.jsx)("tbody",{children:a.rows.map(e=>(0,i.jsx)(_,{row:e,showProject:t},`${e.project_id}:${e.user_id}`))})]})})},b=e=>{let{data:a,loading:t,onProjectChange:s,selectedProjectId:l}=e;return(0,i.jsxs)("label",{className:"team-analytics-filter",children:[(0,i.jsx)("span",{children:"Project"}),(0,i.jsxs)("select",{value:l||"",onChange:e=>s(e.target.value),disabled:t||!(null!==a&&void 0!==a&&a.projects.length),children:[(0,i.jsx)("option",{value:"",children:"All visible projects"}),((null===a||void 0===a?void 0:a.projects)||[]).map(e=>(0,i.jsxs)("option",{value:e.id,children:[e.title," (",j(e.analytics_scope),")"]},e.id))]})]})},N=e=>{let{data:a,loading:t,onBack:l,onFeedback:n,onProjectChange:r,selectedProjectId:c}=e;const o=(0,s.useMemo)(()=>(null===a||void 0===a?void 0:a.projects.find(e=>e.id===c))||null,[null===a||void 0===a?void 0:a.projects,c]);return(0,i.jsxs)("header",{className:"team-analytics-header",children:[(0,i.jsxs)("div",{className:"team-analytics-header__left",children:[(0,i.jsx)("button",{className:"team-analytics-back",onClick:l,children:"Back"}),(0,i.jsxs)("div",{children:[(0,i.jsx)("h1",{children:"Team Token Analytics"}),(0,i.jsx)("p",{children:o?`${o.title} - ${j(o.analytics_scope)}`:"Token usage by project, user, and reporting scope"})]})]}),(0,i.jsxs)("div",{className:"team-analytics-header__right",children:[(0,i.jsx)("button",{className:"team-analytics-feedback-link",onClick:n,children:"Growth feedback"}),(0,i.jsx)(b,{data:a,loading:t,onProjectChange:r,selectedProjectId:c})]})]})},k=e=>{let{data:a}=e;return(0,i.jsxs)("section",{className:"team-analytics-metrics",children:[(0,i.jsx)(u,{label:"Projects",value:a.totals.project_count}),(0,i.jsx)(u,{label:"Users",value:a.totals.user_count}),(0,i.jsx)(u,{label:"Sessions",value:a.totals.session_count}),(0,i.jsx)(u,{label:"Input tokens",value:a.totals.input_tokens,tone:"input"}),(0,i.jsx)(u,{label:"Output tokens",value:a.totals.output_tokens,tone:"output"}),(0,i.jsx)(u,{label:"Total tokens",value:a.totals.total_tokens}),(0,i.jsx)(u,{label:"Feedback",value:a.totals.feedback_count}),(0,i.jsx)(x,{label:"Effort score",value:a.totals.avg_user_effort_score}),(0,i.jsx)(x,{label:"Tech depth",value:a.totals.avg_technical_depth_
1score})]})},f=(e,a)=>e.map((e,t)=>{var s;return{x:t,y:null!==(s=e[a])&&void 0!==s?s:null}}).filter(e=>null!==e.y),w=(e,a,t)=>{if(!e.length)return"";const s=Math.max(...e.map(e=>e.x),1);return e.map((e,l)=>{const n=e.x/s*a,r=t-(e.y-1)/9*t;return`${0===l?"M":"L"} ${n.toFixed(2)} ${r.toFixed(2)}`}).join(" ")},$=e=>{let{history:a}=e;const t=520,s=170,l=w(f(a,"avg_user_effort_score"),t,s),n=w(f(a,"avg_technical_depth_score"),t,s);return(0,i.jsxs)("section",{className:"team-analytics-chart",children:[(0,i.jsxs)("div",{className:"team-analytics-chart__header",children:[(0,i.jsx)("h2",{children:"Growth scores"}),(0,i.jsx)("span",{children:"1-10, generated every 20 session messages"})]}),(0,i.jsxs)("svg",{viewBox:"0 0 520 170",role:"img","aria-label":"Growth score history",children:[(0,i.jsx)("path",{className:"team-analytics-chart__grid",d:"M 0 85 L 520 85"}),l&&(0,i.jsx)("path",{className:"team-analytics-chart__line team-analytics-chart__line--effort",d:l}),n&&(0,i.jsx)("path",{className:"team-analytics-chart__line team-analytics-chart__line--depth",d:n})]}),(0,i.jsxs)("div",{className:"team-analytics-chart__legend",children:[(0,i.jsx)("span",{className:"team-analytics-chart__legend-effort",children:"User effort"}),(0,i.jsx)("span",{className:"team-analytics-chart__legend-depth",children:"Technical depth"})]})]})},P=e=>{let{history:a}=e;const t=Math.max(...a.map(e=>e.total_tokens),1);return(0,i.jsxs)("section",{className:"team-analytics-chart",children:[(0,i.jsxs)("div",{className:"team-analytics-chart__header",children:[(0,i.jsx)("h2",{children:"Token usage history"}),(0,i.jsx)("span",{children:"Daily input/output totals"})]}),(0,i.jsx)("div",{className:"team-analytics-token-bars",children:a.slice(-30).map(e=>(0,i.jsxs)("div",{className:"team-analytics-token-bar",title:`${e.date}: ${d(e.total_tokens)} tokens`,children:[(0,i.jsx)("span",{className:"team-analytics-token-bar__input",style:{height:`${Math.max(4,e.input_tokens/t*100)}%`}}),(0,i.jsx)("span",{className:"team-analytics-token-bar__output",style:{height:`${Math.max(4,e.output_tokens/t*100)}%`}})]},e.date))})]})},I=e=>{let{data:a}=e;return a.history.length?(0,i.jsxs)("div",{className:"team-analytics-charts",children:[(0,i.jsx)($,{history:a.history}),(0,i.jsx)(P,{history:a.history})]}):null},T=e=>{let{data:a,error:t,loading:s}=e;return s?(0,i.jsx)("div",{className:"team-analytics-state",children:"Loading analytics..."}):t?(0,i.jsx)("div",{className:"team-analytics-state team-analytics-state--error",children:t}):a?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(k,{data:a}),(0,i.jsx)(I,{data:a}),(0,i.jsx)(g,{data:a})]}):null},C=e=>{let{embedded:a,projectId:t,onNavigate:o}=e;const d=(0,l.Zp)(),h=null!==o&&void 0!==o?o:d,[m,j]=(0,l.ok)(),u=a?null!==t&&void 0!==t?t:null:m.get("project")||m.get("project_id"),{data:x,loading:p,error:y}=(e=>{const[a,t]=(0,s.useState)({data:null,error:null});(0,s.useEffect)(()=>{let a=!1;return c.Nb.getTokenAnalytics(e||void 0).then(s=>{a||t({projectId:e,data:s,error:null})}).catch(s=>{a||t({projectId:e,data:null,error:(0,r.gJ)(s,"We couldn\u2019t load team analytics. Refresh and try again.")})}),()=>{a=!0}},[e]);const l=a.projectId!==e;return{data:l?null:a.data,loading:l,error:l?null:a.error}})(u);return(0,i.jsxs)("div",{className:"team-analytics-shell"+(a?" team-analytics-shell--embedded":""),children:[!a&&(0,i.jsx)(n.F,{}),(0,i.jsxs)("main",{className:"team-analytics-page",children:[(0,i.jsx)(N,{data:x,loading:p,onBack:()=>h("/team"),onFeedback:()=>{const e=u?`?project=${encodeURIComponent(u)}`:"";h(`/growth-feedback${e}`)},onProjectChange:e=>{a?null===o||void 0===o||o("/team/analytics"+(e?`?project=${encodeURIComponent(e)}`:"")):j(e?{project:e}:{})},selectedProjectId:u}),(0,i.jsx)(T,{data:x,error:y,loading:p})]})]})}}}]);
2//# sourceMappingURL=4415.a63f27b8.chunk.js.map

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.