chordia-ui 3.9.0 → 3.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/DataTable2.cjs.js +1 -1
  2. package/dist/DataTable2.cjs.js.map +1 -1
  3. package/dist/DataTable2.es.js +611 -604
  4. package/dist/DataTable2.es.js.map +1 -1
  5. package/dist/PerformancePanel.cjs.js +1 -1
  6. package/dist/PerformancePanel.cjs.js.map +1 -1
  7. package/dist/PerformancePanel.es.js +1068 -816
  8. package/dist/PerformancePanel.es.js.map +1 -1
  9. package/dist/SupervisorSelect.cjs.js +2 -0
  10. package/dist/SupervisorSelect.cjs.js.map +1 -0
  11. package/dist/SupervisorSelect.es.js +352 -0
  12. package/dist/SupervisorSelect.es.js.map +1 -0
  13. package/dist/components/Signals.cjs.js +1 -1
  14. package/dist/components/Signals.cjs.js.map +1 -1
  15. package/dist/components/Signals.es.js +273 -318
  16. package/dist/components/Signals.es.js.map +1 -1
  17. package/dist/components/UpdatedInteractionDetails.cjs.js +3 -3
  18. package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
  19. package/dist/components/UpdatedInteractionDetails.es.js +98 -92
  20. package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
  21. package/dist/components/performance.cjs.js +1 -1
  22. package/dist/components/performance.cjs.js.map +1 -1
  23. package/dist/components/performance.es.js +116 -349
  24. package/dist/components/performance.es.js.map +1 -1
  25. package/dist/components/reports.cjs.js +2 -2
  26. package/dist/components/reports.cjs.js.map +1 -1
  27. package/dist/components/reports.es.js +122 -141
  28. package/dist/components/reports.es.js.map +1 -1
  29. package/dist/index.cjs.js +1 -1
  30. package/dist/index.es.js +1 -1
  31. package/dist/pages/interactionDetails.cjs.js +2 -2
  32. package/dist/pages/interactionDetails.cjs.js.map +1 -1
  33. package/dist/pages/interactionDetails.es.js +130 -124
  34. package/dist/pages/interactionDetails.es.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/components/Signals/SignalDetailsPage.jsx +2 -29
  37. package/src/components/Signals/SignalsListPage.jsx +2 -24
  38. package/src/components/UpdatedInteractionDetails/UpdatedCoachingSynthesisCard.jsx +8 -1
  39. package/src/components/data/DataTable2.jsx +19 -5
  40. package/src/components/pages/interactionDetails/CoachingSynthesisCard.jsx +8 -1
  41. package/src/components/performance/PerformanceDetailsPage.jsx +230 -75
  42. package/src/components/performance/PerformancePanel.jsx +42 -45
  43. package/src/components/performance/index.js +27 -0
  44. package/src/components/performance/performanceApiMap.js +133 -0
  45. package/src/components/performance/performanceMetrics.js +63 -0
  46. package/src/components/performance/performanceRangeFormat.js +92 -0
  47. package/src/components/performance/performanceSparkline.js +52 -0
  48. package/src/components/reports/ReportsList.jsx +2 -25
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("../PerformancePanel.cjs.js"),e=require("react/jsx-runtime"),h=require("react"),z=require("lucide-react");require("react-dom");require("../DataTable2.cjs.js");require("../sortable.esm.cjs.js");require("../CustomFilterChips.cjs.js");require("motion/react");require("recharts");require("../AgentLiftAnalysisCard.cjs.js");require("../TourGuideTooltip.cjs.js");const n={white:"#FFFFFF",black:"#0B0B0B",borderSubtle:"#E6E6E6",border:"#D9D9D9",searchBg:"#D8D8D8",rowSelected:"#F2F2F0",textMuted:"#989898",textMid:"#676767",textDark:"#323232",applyBg:"#2E3236",scrollbar:"#D5D9E2"},s="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)";function _({checked:l,mutedFill:i=!1}){return e.jsx("span",{style:{width:20,height:20,borderRadius:4,background:l?n.black:i?n.rowSelected:n.white,border:`1px solid ${l?n.black:n.textDark}`,display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0,boxSizing:"border-box"},children:l&&e.jsx(z.Check,{size:14,color:n.white,strokeWidth:3})})}function F({supervisor:l,checked:i,muted:r=!1,onToggle:g}){return e.jsxs("button",{type:"button",onClick:g,style:{display:"flex",alignItems:"center",gap:6,height:32,padding:"0 16px 0 8px",borderRadius:10,border:"none",background:i?n.rowSelected:"transparent",cursor:"pointer",width:"100%",textAlign:"left",fontFamily:s,flexShrink:0},children:[e.jsxs("span",{style:{display:"flex",alignItems:"center",gap:12,flex:1,minWidth:0},children:[e.jsx(_,{checked:i,mutedFill:r}),e.jsx("span",{style:{fontSize:14,lineHeight:"20px",fontWeight:400,color:!i&&r?n.textMid:n.black,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:l.name})]}),e.jsxs("span",{style:{fontSize:12,fontWeight:500,lineHeight:1,color:!i&&r?n.textMid:n.black,whiteSpace:"nowrap",padding:"4px 8px"},children:[l.agentCount," agents"]})]})}function P({left:l,right:i}){return e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",height:14,fontSize:12,lineHeight:1.5,fontFamily:s,flexShrink:0},children:[l,i]})}function c({children:l,onClick:i,faded:r=!1}){return e.jsx("button",{type:"button",onClick:i,style:{background:"transparent",border:"none",padding:0,cursor:i?"pointer":"default",fontFamily:s,fontSize:12,fontWeight:500,color:r?n.textMuted:n.textDark,whiteSpace:"nowrap"},children:l})}function B({supervisors:l=[],value:i=[],onApply:r,onClose:g,totalLabel:L,className:N="",style:O}){const D=h.useRef(i),[x,u]=h.useState(i),[d,C]=h.useState("");h.useEffect(()=>{D.current=i,u(i)},[i]);const S=h.useMemo(()=>new Set(x),[x]),o=d.trim().length>0,a=h.useMemo(()=>{const t=d.trim().toLowerCase();return t?l.filter(p=>p.name.toLowerCase().includes(t)):l},[l,d]),M=l.length>0&&x.length===l.length,R=x.length===0,T=!M&&!R,j=t=>{u(p=>p.includes(t)?p.filter(U=>U!==t):[...p,t])},m=()=>u(l.map(t=>t.id)),q=()=>u([]),A=()=>u(D.current),W=()=>C(""),v=()=>{r==null||r(x),g==null||g()},I=o?`${a.length} Result${a.length===1?"":"s"}`:L||`${l.length} Supervisors`;let f;o?f=a.length>0?e.jsx(c,{onClick:m,children:"Select all"}):null:M?f=e.jsx(c,{onClick:q,children:"Deselect all"}):R?f=e.jsx(c,{onClick:m,children:"Select all"}):f=e.jsxs("span",{style:{display:"inline-flex",gap:12},children:[e.jsx(c,{onClick:m,children:"Select all"}),e.jsx(c,{onClick:q,children:"Deselect all"})]});const b=!o&&T,E=o?a:b?[]:l,k=b?l.filter(t=>S.has(t.id)):[],w=b?l.filter(t=>!S.has(t.id)):[];return e.jsxs("div",{className:N,style:{width:262,background:n.white,border:`1px solid ${n.borderSubtle}`,borderRadius:10,padding:12,boxSizing:"border-box",display:"flex",flexDirection:"column",gap:6,fontFamily:s,boxShadow:"0 8px 24px rgba(11, 11, 11, 0.08)",...O},children:[e.jsx("div",{style:{background:n.searchBg,height:32,borderRadius:10,padding:1,display:"flex",alignItems:"center"},children:e.jsxs("div",{style:{background:n.white,flex:1,height:30,borderRadius:10,display:"flex",alignItems:"center",gap:8,padding:"0 8px"},children:[e.jsx(z.Search,{size:16,color:n.textMuted,strokeWidth:2}),e.jsx("input",{type:"text",value:d,onChange:t=>C(t.target.value),placeholder:"Search supervisors...",style:{flex:1,border:"none",outline:"none",background:"transparent",fontFamily:s,fontSize:14,color:n.black,minWidth:0}})]})}),e.jsx(P,{left:e.jsx("span",{style:{color:n.textMuted,fontWeight:400},children:I}),right:f}),E.length>0&&e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:E.map(t=>e.jsx(F,{supervisor:t,checked:S.has(t.id),muted:!1,onToggle:()=>j(t.id)},t.id))}),b&&e.jsxs(e.Fragment,{children:[k.length>0&&e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:k.map(t=>e.jsx(F,{supervisor:t,checked:!0,onToggle:()=>j(t.id)},t.id))}),k.length>0&&w.length>0&&e.jsx("div",{style:{height:1,background:n.border,margin:"4px 0"}}),w.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(P,{left:e.jsx("span",{style:{color:n.textMuted,fontWeight:400},children:"Others"}),right:null}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:w.map(t=>e.jsx(F,{supervisor:t,checked:!1,muted:!0,onToggle:()=>j(t.id)},t.id))})]})]}),o&&a.length===0&&e.jsxs("div",{style:{padding:"16px 8px",textAlign:"center",fontSize:14,color:n.textMid,fontFamily:s},children:["No results for “",d,"”"]}),o&&a.length>0&&l.length>a.length&&e.jsxs("div",{style:{padding:"10px 8px",textAlign:"center",fontSize:14,color:n.textMid,fontFamily:s},children:["No other results for “",d,"”"]}),e.jsx("div",{style:{height:1,background:n.border,margin:"2px 0"}}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",height:30},children:[o?e.jsx(c,{onClick:W,children:"Clear search"}):e.jsx(c,{onClick:A,children:"Reset"}),e.jsx("button",{type:"button",onClick:v,style:{background:n.applyBg,color:n.white,border:"none",borderRadius:10,height:28,padding:"0 14px",fontFamily:s,fontSize:14,fontWeight:600,cursor:"pointer"},children:"Apply"})]})]})}exports.DEFAULT_AGENT_COLUMNS=y.DEFAULT_AGENT_COLUMNS;exports.DEFAULT_SESSION_COLUMNS=y.DEFAULT_SESSION_COLUMNS;exports.PerformanceDetailsPage=y.PerformanceDetailsPage;exports.PerformancePanel=y.PerformancePanel;exports.SupervisorSelect=B;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../PerformancePanel.cjs.js"),M=require("../SupervisorSelect.cjs.js");require("react/jsx-runtime");require("react");require("react-dom");require("lucide-react");require("../DataTable2.cjs.js");require("../sortable.esm.cjs.js");require("../CustomFilterChips.cjs.js");require("motion/react");require("recharts");require("../AgentLiftAnalysisCard.cjs.js");require("../TourGuideTooltip.cjs.js");const m="";function a(e){return e==null||typeof e=="number"&&Number.isNaN(e)}function l(e){return a(e)||e===0||e>0?"up":"down"}function c(e,{suffix:o="",decimals:n=1}={}){if(a(e))return null;const t=Number(e);return Number.isFinite(t)?`${t>0?"+":(t<0,"")}${t.toFixed(n)}${o}`:null}function s(e,o,{includeZero:n=!0}={}){return Array.isArray(e)?e.map(t=>t==null?void 0:t[o]).filter(t=>{if(t==null)return!1;const u=Number(t);return Number.isFinite(u)?n||u!==0:!1}).map(Number):[]}function p(e,o=1){return a(e)?m:`${(Number(e)*100).toFixed(o)}%`}function T(e,o=1){if(a(e))return m;const n=Number(e)*100;return`${n>0?"+":""}${n.toFixed(o)}pp`}function F(e){return a(e)?m:Number(e).toLocaleString("en-US")}function h(e,o=2){return a(e)?m:Number(e).toFixed(o)}function f(e,o,n){const t=n(o);return t?`${e} (${t})`:e}function C(e){const o=(e==null?void 0:e.current)??{},n=(e==null?void 0:e.deltas)??{},t=(e==null?void 0:e.trend)??[],u=s(t,"count",{includeZero:!0}),E=s(t,"csat"),_=s(t,"baseline").map(i=>i*100),L=s(t,"agent_lift").map(i=>i*100),D=s(t,"score").map(i=>i*100),d={value:F(o.call_count),label:"Volume",trend:l(n.call_count),points:u},S={value:h(o.avg_csat),label:f("Compass Score",n.csat,i=>c(i,{decimals:2})),trend:l(n.csat),points:E},b={value:p(o.avg_baseline),label:f("Baseline",n.baseline,i=>c(Number(i)*100,{suffix:"",decimals:1})),trend:l(n.baseline),points:_},g={value:T(o.avg_agent_lift),label:f("Agent Lift",n.agent_lift,i=>c(Number(i)*100,{suffix:"pp",decimals:1})),trend:l(n.agent_lift),points:L},P={value:p(o.avg_score),label:f("Score",n.score,i=>c(Number(i)*100,{suffix:"",decimals:1})),trend:l(n.score),points:D};for(const i of[d,S,b,g,P]){const N=r.trendFromPoints(i.points);N&&(i.trend=N)}return{volumeStat:d,compassStat:S,baselineSubStat:b,agentLiftSubStat:g,scoreSubStat:P}}exports.DEFAULT_AGENT_COLUMNS=r.DEFAULT_AGENT_COLUMNS;exports.DEFAULT_SESSION_COLUMNS=r.DEFAULT_SESSION_COLUMNS;exports.METRIC_PLACEHOLDER=r.METRIC_PLACEHOLDER;exports.PerformanceDetailsPage=r.PerformanceDetailsPage;exports.PerformancePanel=r.PerformancePanel;exports.RANGE_TO_MS=r.RANGE_TO_MS;exports.buildSparkPaths=r.buildSparkPaths;exports.computeWindowLabel=r.computeWindowLabel;exports.formatEightHourRangeEndpoints=r.formatEightHourRangeEndpoints;exports.formatEightHourWindowLabel=r.formatEightHourWindowLabel;exports.formatLocalDate=r.formatLocalDate;exports.formatMetricDisplay=r.formatMetricDisplay;exports.getPresetWindowDates=r.getPresetWindowDates;exports.hasChartData=r.hasChartData;exports.hasMeaningfulMetric=r.hasMeaningfulMetric;exports.isNullishMetric=r.isNullishMetric;exports.normalizeSparkPoints=r.normalizeSparkPoints;exports.resolveKpiTrend=r.resolveKpiTrend;exports.resolveTrend=r.resolveTrend;exports.trendFromPoints=r.trendFromPoints;exports.trendFromSignedValue=r.trendFromSignedValue;exports.SupervisorSelect=M.SupervisorSelect;exports.extractTrendSeries=s;exports.mapPerformanceKpiStats=C;
2
2
  //# sourceMappingURL=performance.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"performance.cjs.js","sources":["../../src/components/performance/SupervisorSelect.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { Search, Check } from \"lucide-react\";\n\nconst C = {\n white: \"#FFFFFF\",\n black: \"#0B0B0B\",\n borderSubtle: \"#E6E6E6\",\n border: \"#D9D9D9\",\n searchBg: \"#D8D8D8\",\n rowSelected: \"#F2F2F0\",\n textMuted: \"#989898\",\n textMid: \"#676767\",\n textDark: \"#323232\",\n applyBg: \"#2E3236\",\n scrollbar: \"#D5D9E2\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nfunction Checkbox({ checked, mutedFill = false }) {\n return (\n <span\n style={{\n width: 20,\n height: 20,\n borderRadius: 4,\n background: checked ? C.black : mutedFill ? C.rowSelected : C.white,\n border: `1px solid ${checked ? C.black : C.textDark}`,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n boxSizing: \"border-box\",\n }}\n >\n {checked && <Check size={14} color={C.white} strokeWidth={3} />}\n </span>\n );\n}\n\nfunction Row({ supervisor, checked, muted = false, onToggle }) {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n height: 32,\n padding: \"0 16px 0 8px\",\n borderRadius: 10,\n border: \"none\",\n background: checked ? C.rowSelected : \"transparent\",\n cursor: \"pointer\",\n width: \"100%\",\n textAlign: \"left\",\n fontFamily: FONT,\n flexShrink: 0,\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 12, flex: 1, minWidth: 0 }}>\n <Checkbox checked={checked} mutedFill={muted} />\n <span\n style={{\n fontSize: 14,\n lineHeight: \"20px\",\n fontWeight: 400,\n color: !checked && muted ? C.textMid : C.black,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {supervisor.name}\n </span>\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1,\n color: !checked && muted ? C.textMid : C.black,\n whiteSpace: \"nowrap\",\n padding: \"4px 8px\",\n }}\n >\n {supervisor.agentCount} agents\n </span>\n </button>\n );\n}\n\nfunction MetaRow({ left, right }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: 14,\n fontSize: 12,\n lineHeight: 1.5,\n fontFamily: FONT,\n flexShrink: 0,\n }}\n >\n {left}\n {right}\n </div>\n );\n}\n\nfunction ActionLink({ children, onClick, faded = false }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n background: \"transparent\",\n border: \"none\",\n padding: 0,\n cursor: onClick ? \"pointer\" : \"default\",\n fontFamily: FONT,\n fontSize: 12,\n fontWeight: 500,\n color: faded ? C.textMuted : C.textDark,\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </button>\n );\n}\n\nexport default function SupervisorSelect({\n supervisors = [],\n value = [],\n onApply,\n onClose,\n totalLabel,\n className = \"\",\n style,\n}) {\n const initialValueRef = React.useRef(value);\n const [staged, setStaged] = React.useState(value);\n const [query, setQuery] = React.useState(\"\");\n\n React.useEffect(() => {\n initialValueRef.current = value;\n setStaged(value);\n }, [value]);\n\n const stagedSet = React.useMemo(() => new Set(staged), [staged]);\n\n const isSearching = query.trim().length > 0;\n\n const filtered = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return supervisors;\n return supervisors.filter((s) => s.name.toLowerCase().includes(q));\n }, [supervisors, query]);\n\n const allSelected = supervisors.length > 0 && staged.length === supervisors.length;\n const noneSelected = staged.length === 0;\n const isPartial = !allSelected && !noneSelected;\n\n const toggle = (id) => {\n setStaged((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\n };\n const selectAll = () => setStaged(supervisors.map((s) => s.id));\n const deselectAll = () => setStaged([]);\n const reset = () => setStaged(initialValueRef.current);\n const clearSearch = () => setQuery(\"\");\n const apply = () => {\n onApply?.(staged);\n onClose?.();\n };\n\n const headerCount = isSearching\n ? `${filtered.length} Result${filtered.length === 1 ? \"\" : \"s\"}`\n : totalLabel || `${supervisors.length} Supervisors`;\n\n let headerRight;\n if (isSearching) {\n headerRight = filtered.length > 0 ? <ActionLink onClick={selectAll}>Select all</ActionLink> : null;\n } else if (allSelected) {\n headerRight = <ActionLink onClick={deselectAll}>Deselect all</ActionLink>;\n } else if (noneSelected) {\n headerRight = <ActionLink onClick={selectAll}>Select all</ActionLink>;\n } else {\n headerRight = (\n <span style={{ display: \"inline-flex\", gap: 12 }}>\n <ActionLink onClick={selectAll}>Select all</ActionLink>\n <ActionLink onClick={deselectAll}>Deselect all</ActionLink>\n </span>\n );\n }\n\n // Decide which sections to render\n const renderPartial = !isSearching && isPartial;\n const flatList = isSearching ? filtered : renderPartial ? [] : supervisors;\n const partialSelected = renderPartial ? supervisors.filter((s) => stagedSet.has(s.id)) : [];\n const partialOthers = renderPartial ? supervisors.filter((s) => !stagedSet.has(s.id)) : [];\n\n return (\n <div\n className={className}\n style={{\n width: 262,\n background: C.white,\n border: `1px solid ${C.borderSubtle}`,\n borderRadius: 10,\n padding: 12,\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n fontFamily: FONT,\n boxShadow: \"0 8px 24px rgba(11, 11, 11, 0.08)\",\n ...style,\n }}\n >\n <div\n style={{\n background: C.searchBg,\n height: 32,\n borderRadius: 10,\n padding: 1,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n background: C.white,\n flex: 1,\n height: 30,\n borderRadius: 10,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"0 8px\",\n }}\n >\n <Search size={16} color={C.textMuted} strokeWidth={2} />\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search supervisors...\"\n style={{\n flex: 1,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontFamily: FONT,\n fontSize: 14,\n color: C.black,\n minWidth: 0,\n }}\n />\n </div>\n </div>\n\n <MetaRow\n left={\n <span style={{ color: C.textMuted, fontWeight: 400 }}>{headerCount}</span>\n }\n right={headerRight}\n />\n\n {flatList.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {flatList.map((s) => (\n <Row\n key={s.id}\n supervisor={s}\n checked={stagedSet.has(s.id)}\n muted={false}\n onToggle={() => toggle(s.id)}\n />\n ))}\n </div>\n )}\n\n {renderPartial && (\n <>\n {partialSelected.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {partialSelected.map((s) => (\n <Row key={s.id} supervisor={s} checked onToggle={() => toggle(s.id)} />\n ))}\n </div>\n )}\n {partialSelected.length > 0 && partialOthers.length > 0 && (\n <div style={{ height: 1, background: C.border, margin: \"4px 0\" }} />\n )}\n {partialOthers.length > 0 && (\n <>\n <MetaRow\n left={<span style={{ color: C.textMuted, fontWeight: 400 }}>Others</span>}\n right={null}\n />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {partialOthers.map((s) => (\n <Row\n key={s.id}\n supervisor={s}\n checked={false}\n muted\n onToggle={() => toggle(s.id)}\n />\n ))}\n </div>\n </>\n )}\n </>\n )}\n\n {isSearching && filtered.length === 0 && (\n <div\n style={{\n padding: \"16px 8px\",\n textAlign: \"center\",\n fontSize: 14,\n color: C.textMid,\n fontFamily: FONT,\n }}\n >\n No results for &ldquo;{query}&rdquo;\n </div>\n )}\n {isSearching && filtered.length > 0 && supervisors.length > filtered.length && (\n <div\n style={{\n padding: \"10px 8px\",\n textAlign: \"center\",\n fontSize: 14,\n color: C.textMid,\n fontFamily: FONT,\n }}\n >\n No other results for &ldquo;{query}&rdquo;\n </div>\n )}\n\n <div style={{ height: 1, background: C.border, margin: \"2px 0\" }} />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: 30,\n }}\n >\n {isSearching ? (\n <ActionLink onClick={clearSearch}>Clear search</ActionLink>\n ) : (\n <ActionLink onClick={reset}>Reset</ActionLink>\n )}\n <button\n type=\"button\"\n onClick={apply}\n style={{\n background: C.applyBg,\n color: C.white,\n border: \"none\",\n borderRadius: 10,\n height: 28,\n padding: \"0 14px\",\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n Apply\n </button>\n </div>\n </div>\n );\n}\n"],"names":["C","FONT","Checkbox","checked","mutedFill","jsx","Check","Row","supervisor","muted","onToggle","jsxs","MetaRow","left","right","ActionLink","children","onClick","faded","SupervisorSelect","supervisors","value","onApply","onClose","totalLabel","className","style","initialValueRef","React","staged","setStaged","query","setQuery","stagedSet","isSearching","filtered","q","s","allSelected","noneSelected","isPartial","toggle","id","prev","x","selectAll","deselectAll","reset","clearSearch","apply","headerCount","headerRight","renderPartial","flatList","partialSelected","partialOthers","Search","e","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"performance.cjs.js","sources":["../../src/components/performance/performanceApiMap.js"],"sourcesContent":["import { trendFromPoints } from \"./performanceSparkline\";\n\nconst METRIC_PLACEHOLDER = \"—\";\n\nfunction isNullish(value) {\n return value == null || (typeof value === \"number\" && Number.isNaN(value));\n}\n\nfunction trendFromDelta(delta) {\n if (isNullish(delta) || delta === 0) return \"up\";\n return delta > 0 ? \"up\" : \"down\";\n}\n\nfunction formatSignedDelta(delta, { suffix = \"\", decimals = 1 } = {}) {\n if (isNullish(delta)) return null;\n const n = Number(delta);\n if (!Number.isFinite(n)) return null;\n const sign = n > 0 ? \"+\" : n < 0 ? \"\" : \"\";\n return `${sign}${n.toFixed(decimals)}${suffix}`;\n}\n\n/** Pull a numeric time series from API `trend[]` buckets (skips nulls). */\nexport function extractTrendSeries(trend, key, { includeZero = true } = {}) {\n if (!Array.isArray(trend)) return [];\n return trend\n .map((bucket) => bucket?.[key])\n .filter((v) => {\n if (v == null) return false;\n const n = Number(v);\n if (!Number.isFinite(n)) return false;\n return includeZero || n !== 0;\n })\n .map(Number);\n}\n\nfunction formatPercent(value, decimals = 1) {\n if (isNullish(value)) return METRIC_PLACEHOLDER;\n return `${(Number(value) * 100).toFixed(decimals)}%`;\n}\n\nfunction formatPp(value, decimals = 1) {\n if (isNullish(value)) return METRIC_PLACEHOLDER;\n const n = Number(value) * 100;\n const sign = n > 0 ? \"+\" : \"\";\n return `${sign}${n.toFixed(decimals)}pp`;\n}\n\nfunction formatCount(value) {\n if (isNullish(value)) return METRIC_PLACEHOLDER;\n return Number(value).toLocaleString(\"en-US\");\n}\n\nfunction formatCsat(value, decimals = 2) {\n if (isNullish(value)) return METRIC_PLACEHOLDER;\n return Number(value).toFixed(decimals);\n}\n\nfunction statLabel(base, delta, formatter) {\n const deltaStr = formatter(delta);\n return deltaStr ? `${base} (${deltaStr})` : base;\n}\n\n/**\n * Map `/performance/agents/{projectId}/v2/__all__` (or agent-specific) payload\n * to PerformancePanel KPI stat props. Pass each stat's `points` into the panel\n * for real sparklines instead of the decorative fallback curve.\n */\nexport function mapPerformanceKpiStats(api) {\n const current = api?.current ?? {};\n const deltas = api?.deltas ?? {};\n const trend = api?.trend ?? [];\n\n const volumePoints = extractTrendSeries(trend, \"count\", { includeZero: true });\n const csatPoints = extractTrendSeries(trend, \"csat\");\n const baselinePoints = extractTrendSeries(trend, \"baseline\").map((v) => v * 100);\n const liftPoints = extractTrendSeries(trend, \"agent_lift\").map((v) => v * 100);\n const scorePoints = extractTrendSeries(trend, \"score\").map((v) => v * 100);\n\n const volumeStat = {\n value: formatCount(current.call_count),\n label: \"Volume\",\n trend: trendFromDelta(deltas.call_count),\n points: volumePoints,\n };\n\n const compassStat = {\n value: formatCsat(current.avg_csat),\n label: statLabel(\"Compass Score\", deltas.csat, (d) => formatSignedDelta(d, { decimals: 2 })),\n trend: trendFromDelta(deltas.csat),\n points: csatPoints,\n };\n\n const baselineSubStat = {\n value: formatPercent(current.avg_baseline),\n label: statLabel(\"Baseline\", deltas.baseline, (d) =>\n formatSignedDelta(Number(d) * 100, { suffix: \"\", decimals: 1 }),\n ),\n trend: trendFromDelta(deltas.baseline),\n points: baselinePoints,\n };\n\n const agentLiftSubStat = {\n value: formatPp(current.avg_agent_lift),\n label: statLabel(\"Agent Lift\", deltas.agent_lift, (d) =>\n formatSignedDelta(Number(d) * 100, { suffix: \"pp\", decimals: 1 }),\n ),\n trend: trendFromDelta(deltas.agent_lift),\n points: liftPoints,\n };\n\n const scoreSubStat = {\n value: formatPercent(current.avg_score),\n label: statLabel(\"Score\", deltas.score, (d) =>\n formatSignedDelta(Number(d) * 100, { suffix: \"\", decimals: 1 }),\n ),\n trend: trendFromDelta(deltas.score),\n points: scorePoints,\n };\n\n // When points exist, prefer shape-derived direction for sparkline consistency.\n for (const stat of [volumeStat, compassStat, baselineSubStat, agentLiftSubStat, scoreSubStat]) {\n const derived = trendFromPoints(stat.points);\n if (derived) stat.trend = derived;\n }\n\n return {\n volumeStat,\n compassStat,\n baselineSubStat,\n agentLiftSubStat,\n scoreSubStat,\n };\n}\n"],"names":["METRIC_PLACEHOLDER","isNullish","value","trendFromDelta","delta","formatSignedDelta","suffix","decimals","n","extractTrendSeries","trend","key","includeZero","bucket","v","formatPercent","formatPp","formatCount","formatCsat","statLabel","base","formatter","deltaStr","mapPerformanceKpiStats","api","current","deltas","volumePoints","csatPoints","baselinePoints","liftPoints","scorePoints","volumeStat","compassStat","d","baselineSubStat","agentLiftSubStat","scoreSubStat","stat","derived","trendFromPoints"],"mappings":"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"}
@@ -1,8 +1,10 @@
1
- import { D as re, b as oe, a as ae, P as de } from "../PerformancePanel.es.js";
2
- import { jsx as e, jsxs as r, Fragment as I } from "react/jsx-runtime";
3
- import g from "react";
4
- import { Search as $, Check as U } from "lucide-react";
1
+ import { t as D } from "../PerformancePanel.es.js";
2
+ import { D as K, b as V, M as j, a as z, P as B, R as Z, h as q, c as J, d as Q, f as X, e as Y, i as k, g as tt, j as et, k as rt, l as nt, n as ot, r as st, m as at, o as it } from "../PerformancePanel.es.js";
3
+ import { S as ct } from "../SupervisorSelect.es.js";
4
+ import "react/jsx-runtime";
5
+ import "react";
5
6
  import "react-dom";
7
+ import "lucide-react";
6
8
  import "../DataTable2.es.js";
7
9
  import "../sortable.esm.es.js";
8
10
  import "../CustomFilterChips.es.js";
@@ -10,356 +12,121 @@ import "motion/react";
10
12
  import "recharts";
11
13
  import "../AgentLiftAnalysisCard.es.js";
12
14
  import "../TourGuideTooltip.es.js";
13
- const n = {
14
- white: "#FFFFFF",
15
- black: "#0B0B0B",
16
- borderSubtle: "#E6E6E6",
17
- border: "#D9D9D9",
18
- searchBg: "#D8D8D8",
19
- rowSelected: "#F2F2F0",
20
- textMuted: "#989898",
21
- textMid: "#676767",
22
- textDark: "#323232",
23
- applyBg: "#2E3236",
24
- scrollbar: "#D5D9E2"
25
- }, a = "var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)";
26
- function H({ checked: l, mutedFill: i = !1 }) {
27
- return /* @__PURE__ */ e(
28
- "span",
29
- {
30
- style: {
31
- width: 20,
32
- height: 20,
33
- borderRadius: 4,
34
- background: l ? n.black : i ? n.rowSelected : n.white,
35
- border: `1px solid ${l ? n.black : n.textDark}`,
36
- display: "inline-flex",
37
- alignItems: "center",
38
- justifyContent: "center",
39
- flexShrink: 0,
40
- boxSizing: "border-box"
41
- },
42
- children: l && /* @__PURE__ */ e(U, { size: 14, color: n.white, strokeWidth: 3 })
43
- }
44
- );
15
+ const m = "—";
16
+ function s(t) {
17
+ return t == null || typeof t == "number" && Number.isNaN(t);
45
18
  }
46
- function D({ supervisor: l, checked: i, muted: o = !1, onToggle: f }) {
47
- return /* @__PURE__ */ r(
48
- "button",
49
- {
50
- type: "button",
51
- onClick: f,
52
- style: {
53
- display: "flex",
54
- alignItems: "center",
55
- gap: 6,
56
- height: 32,
57
- padding: "0 16px 0 8px",
58
- borderRadius: 10,
59
- border: "none",
60
- background: i ? n.rowSelected : "transparent",
61
- cursor: "pointer",
62
- width: "100%",
63
- textAlign: "left",
64
- fontFamily: a,
65
- flexShrink: 0
66
- },
67
- children: [
68
- /* @__PURE__ */ r("span", { style: { display: "flex", alignItems: "center", gap: 12, flex: 1, minWidth: 0 }, children: [
69
- /* @__PURE__ */ e(H, { checked: i, mutedFill: o }),
70
- /* @__PURE__ */ e(
71
- "span",
72
- {
73
- style: {
74
- fontSize: 14,
75
- lineHeight: "20px",
76
- fontWeight: 400,
77
- color: !i && o ? n.textMid : n.black,
78
- whiteSpace: "nowrap",
79
- overflow: "hidden",
80
- textOverflow: "ellipsis"
81
- },
82
- children: l.name
83
- }
84
- )
85
- ] }),
86
- /* @__PURE__ */ r(
87
- "span",
88
- {
89
- style: {
90
- fontSize: 12,
91
- fontWeight: 500,
92
- lineHeight: 1,
93
- color: !i && o ? n.textMid : n.black,
94
- whiteSpace: "nowrap",
95
- padding: "4px 8px"
96
- },
97
- children: [
98
- l.agentCount,
99
- " agents"
100
- ]
101
- }
102
- )
103
- ]
104
- }
105
- );
19
+ function i(t) {
20
+ return s(t) || t === 0 || t > 0 ? "up" : "down";
106
21
  }
107
- function L({ left: l, right: i }) {
108
- return /* @__PURE__ */ r(
109
- "div",
110
- {
111
- style: {
112
- display: "flex",
113
- alignItems: "center",
114
- justifyContent: "space-between",
115
- height: 14,
116
- fontSize: 12,
117
- lineHeight: 1.5,
118
- fontFamily: a,
119
- flexShrink: 0
120
- },
121
- children: [
122
- l,
123
- i
124
- ]
125
- }
126
- );
22
+ function c(t, { suffix: n = "", decimals: r = 1 } = {}) {
23
+ if (s(t))
24
+ return null;
25
+ const e = Number(t);
26
+ return Number.isFinite(e) ? `${e > 0 ? "+" : (e < 0, "")}${e.toFixed(r)}${n}` : null;
127
27
  }
128
- function s({ children: l, onClick: i, faded: o = !1 }) {
129
- return /* @__PURE__ */ e(
130
- "button",
131
- {
132
- type: "button",
133
- onClick: i,
134
- style: {
135
- background: "transparent",
136
- border: "none",
137
- padding: 0,
138
- cursor: i ? "pointer" : "default",
139
- fontFamily: a,
140
- fontSize: 12,
141
- fontWeight: 500,
142
- color: o ? n.textMuted : n.textDark,
143
- whiteSpace: "nowrap"
144
- },
145
- children: l
146
- }
147
- );
28
+ function u(t, n, { includeZero: r = !0 } = {}) {
29
+ return Array.isArray(t) ? t.map((e) => e == null ? void 0 : e[n]).filter((e) => {
30
+ if (e == null)
31
+ return !1;
32
+ const a = Number(e);
33
+ return Number.isFinite(a) ? r || a !== 0 : !1;
34
+ }).map(Number) : [];
148
35
  }
149
- function ne({
150
- supervisors: l = [],
151
- value: i = [],
152
- onApply: o,
153
- onClose: f,
154
- totalLabel: v,
155
- className: A = "",
156
- style: B
157
- }) {
158
- const C = g.useRef(i), [p, u] = g.useState(i), [h, M] = g.useState("");
159
- g.useEffect(() => {
160
- C.current = i, u(i);
161
- }, [i]);
162
- const y = g.useMemo(() => new Set(p), [p]), d = h.trim().length > 0, c = g.useMemo(() => {
163
- const t = h.trim().toLowerCase();
164
- return t ? l.filter((b) => b.name.toLowerCase().includes(t)) : l;
165
- }, [l, h]), R = l.length > 0 && p.length === l.length, z = p.length === 0, N = !R && !z, S = (t) => {
166
- u((b) => b.includes(t) ? b.filter((j) => j !== t) : [...b, t]);
167
- }, k = () => u(l.map((t) => t.id)), E = () => u([]), O = () => u(C.current), P = () => M(""), T = () => {
168
- o == null || o(p), f == null || f();
169
- }, _ = d ? `${c.length} Result${c.length === 1 ? "" : "s"}` : v || `${l.length} Supervisors`;
170
- let x;
171
- d ? x = c.length > 0 ? /* @__PURE__ */ e(s, { onClick: k, children: "Select all" }) : null : R ? x = /* @__PURE__ */ e(s, { onClick: E, children: "Deselect all" }) : z ? x = /* @__PURE__ */ e(s, { onClick: k, children: "Select all" }) : x = /* @__PURE__ */ r("span", { style: { display: "inline-flex", gap: 12 }, children: [
172
- /* @__PURE__ */ e(s, { onClick: k, children: "Select all" }),
173
- /* @__PURE__ */ e(s, { onClick: E, children: "Deselect all" })
174
- ] });
175
- const m = !d && N, W = d ? c : m ? [] : l, w = m ? l.filter((t) => y.has(t.id)) : [], F = m ? l.filter((t) => !y.has(t.id)) : [];
176
- return /* @__PURE__ */ r(
177
- "div",
178
- {
179
- className: A,
180
- style: {
181
- width: 262,
182
- background: n.white,
183
- border: `1px solid ${n.borderSubtle}`,
184
- borderRadius: 10,
185
- padding: 12,
186
- boxSizing: "border-box",
187
- display: "flex",
188
- flexDirection: "column",
189
- gap: 6,
190
- fontFamily: a,
191
- boxShadow: "0 8px 24px rgba(11, 11, 11, 0.08)",
192
- ...B
193
- },
194
- children: [
195
- /* @__PURE__ */ e(
196
- "div",
197
- {
198
- style: {
199
- background: n.searchBg,
200
- height: 32,
201
- borderRadius: 10,
202
- padding: 1,
203
- display: "flex",
204
- alignItems: "center"
205
- },
206
- children: /* @__PURE__ */ r(
207
- "div",
208
- {
209
- style: {
210
- background: n.white,
211
- flex: 1,
212
- height: 30,
213
- borderRadius: 10,
214
- display: "flex",
215
- alignItems: "center",
216
- gap: 8,
217
- padding: "0 8px"
218
- },
219
- children: [
220
- /* @__PURE__ */ e($, { size: 16, color: n.textMuted, strokeWidth: 2 }),
221
- /* @__PURE__ */ e(
222
- "input",
223
- {
224
- type: "text",
225
- value: h,
226
- onChange: (t) => M(t.target.value),
227
- placeholder: "Search supervisors...",
228
- style: {
229
- flex: 1,
230
- border: "none",
231
- outline: "none",
232
- background: "transparent",
233
- fontFamily: a,
234
- fontSize: 14,
235
- color: n.black,
236
- minWidth: 0
237
- }
238
- }
239
- )
240
- ]
241
- }
242
- )
243
- }
244
- ),
245
- /* @__PURE__ */ e(
246
- L,
247
- {
248
- left: /* @__PURE__ */ e("span", { style: { color: n.textMuted, fontWeight: 400 }, children: _ }),
249
- right: x
250
- }
251
- ),
252
- W.length > 0 && /* @__PURE__ */ e("div", { style: { display: "flex", flexDirection: "column", gap: 6 }, children: W.map((t) => /* @__PURE__ */ e(
253
- D,
254
- {
255
- supervisor: t,
256
- checked: y.has(t.id),
257
- muted: !1,
258
- onToggle: () => S(t.id)
259
- },
260
- t.id
261
- )) }),
262
- m && /* @__PURE__ */ r(I, { children: [
263
- w.length > 0 && /* @__PURE__ */ e("div", { style: { display: "flex", flexDirection: "column", gap: 6 }, children: w.map((t) => /* @__PURE__ */ e(D, { supervisor: t, checked: !0, onToggle: () => S(t.id) }, t.id)) }),
264
- w.length > 0 && F.length > 0 && /* @__PURE__ */ e("div", { style: { height: 1, background: n.border, margin: "4px 0" } }),
265
- F.length > 0 && /* @__PURE__ */ r(I, { children: [
266
- /* @__PURE__ */ e(
267
- L,
268
- {
269
- left: /* @__PURE__ */ e("span", { style: { color: n.textMuted, fontWeight: 400 }, children: "Others" }),
270
- right: null
271
- }
272
- ),
273
- /* @__PURE__ */ e("div", { style: { display: "flex", flexDirection: "column", gap: 6 }, children: F.map((t) => /* @__PURE__ */ e(
274
- D,
275
- {
276
- supervisor: t,
277
- checked: !1,
278
- muted: !0,
279
- onToggle: () => S(t.id)
280
- },
281
- t.id
282
- )) })
283
- ] })
284
- ] }),
285
- d && c.length === 0 && /* @__PURE__ */ r(
286
- "div",
287
- {
288
- style: {
289
- padding: "16px 8px",
290
- textAlign: "center",
291
- fontSize: 14,
292
- color: n.textMid,
293
- fontFamily: a
294
- },
295
- children: [
296
- "No results for “",
297
- h,
298
- "”"
299
- ]
300
- }
301
- ),
302
- d && c.length > 0 && l.length > c.length && /* @__PURE__ */ r(
303
- "div",
304
- {
305
- style: {
306
- padding: "10px 8px",
307
- textAlign: "center",
308
- fontSize: 14,
309
- color: n.textMid,
310
- fontFamily: a
311
- },
312
- children: [
313
- "No other results for “",
314
- h,
315
- "”"
316
- ]
317
- }
318
- ),
319
- /* @__PURE__ */ e("div", { style: { height: 1, background: n.border, margin: "2px 0" } }),
320
- /* @__PURE__ */ r(
321
- "div",
322
- {
323
- style: {
324
- display: "flex",
325
- alignItems: "center",
326
- justifyContent: "space-between",
327
- height: 30
328
- },
329
- children: [
330
- d ? /* @__PURE__ */ e(s, { onClick: P, children: "Clear search" }) : /* @__PURE__ */ e(s, { onClick: O, children: "Reset" }),
331
- /* @__PURE__ */ e(
332
- "button",
333
- {
334
- type: "button",
335
- onClick: T,
336
- style: {
337
- background: n.applyBg,
338
- color: n.white,
339
- border: "none",
340
- borderRadius: 10,
341
- height: 28,
342
- padding: "0 14px",
343
- fontFamily: a,
344
- fontSize: 14,
345
- fontWeight: 600,
346
- cursor: "pointer"
347
- },
348
- children: "Apply"
349
- }
350
- )
351
- ]
352
- }
353
- )
354
- ]
355
- }
356
- );
36
+ function N(t, n = 1) {
37
+ return s(t) ? m : `${(Number(t) * 100).toFixed(n)}%`;
38
+ }
39
+ function x(t, n = 1) {
40
+ if (s(t))
41
+ return m;
42
+ const r = Number(t) * 100;
43
+ return `${r > 0 ? "+" : ""}${r.toFixed(n)}pp`;
44
+ }
45
+ function F(t) {
46
+ return s(t) ? m : Number(t).toLocaleString("en-US");
47
+ }
48
+ function C(t, n = 2) {
49
+ return s(t) ? m : Number(t).toFixed(n);
50
+ }
51
+ function l(t, n, r) {
52
+ const e = r(n);
53
+ return e ? `${t} (${e})` : t;
54
+ }
55
+ function I(t) {
56
+ const n = (t == null ? void 0 : t.current) ?? {}, r = (t == null ? void 0 : t.deltas) ?? {}, e = (t == null ? void 0 : t.trend) ?? [], a = u(e, "count", { includeZero: !0 }), P = u(e, "csat"), _ = u(e, "baseline").map((o) => o * 100), L = u(e, "agent_lift").map((o) => o * 100), E = u(e, "score").map((o) => o * 100), f = {
57
+ value: F(n.call_count),
58
+ label: "Volume",
59
+ trend: i(r.call_count),
60
+ points: a
61
+ }, d = {
62
+ value: C(n.avg_csat),
63
+ label: l("Compass Score", r.csat, (o) => c(o, { decimals: 2 })),
64
+ trend: i(r.csat),
65
+ points: P
66
+ }, p = {
67
+ value: N(n.avg_baseline),
68
+ label: l(
69
+ "Baseline",
70
+ r.baseline,
71
+ (o) => c(Number(o) * 100, { suffix: "", decimals: 1 })
72
+ ),
73
+ trend: i(r.baseline),
74
+ points: _
75
+ }, b = {
76
+ value: x(n.avg_agent_lift),
77
+ label: l(
78
+ "Agent Lift",
79
+ r.agent_lift,
80
+ (o) => c(Number(o) * 100, { suffix: "pp", decimals: 1 })
81
+ ),
82
+ trend: i(r.agent_lift),
83
+ points: L
84
+ }, S = {
85
+ value: N(n.avg_score),
86
+ label: l(
87
+ "Score",
88
+ r.score,
89
+ (o) => c(Number(o) * 100, { suffix: "", decimals: 1 })
90
+ ),
91
+ trend: i(r.score),
92
+ points: E
93
+ };
94
+ for (const o of [f, d, p, b, S]) {
95
+ const g = D(o.points);
96
+ g && (o.trend = g);
97
+ }
98
+ return {
99
+ volumeStat: f,
100
+ compassStat: d,
101
+ baselineSubStat: p,
102
+ agentLiftSubStat: b,
103
+ scoreSubStat: S
104
+ };
357
105
  }
358
106
  export {
359
- re as DEFAULT_AGENT_COLUMNS,
360
- oe as DEFAULT_SESSION_COLUMNS,
361
- ae as PerformanceDetailsPage,
362
- de as PerformancePanel,
363
- ne as SupervisorSelect
107
+ K as DEFAULT_AGENT_COLUMNS,
108
+ V as DEFAULT_SESSION_COLUMNS,
109
+ j as METRIC_PLACEHOLDER,
110
+ z as PerformanceDetailsPage,
111
+ B as PerformancePanel,
112
+ Z as RANGE_TO_MS,
113
+ ct as SupervisorSelect,
114
+ q as buildSparkPaths,
115
+ J as computeWindowLabel,
116
+ u as extractTrendSeries,
117
+ Q as formatEightHourRangeEndpoints,
118
+ X as formatEightHourWindowLabel,
119
+ Y as formatLocalDate,
120
+ k as formatMetricDisplay,
121
+ tt as getPresetWindowDates,
122
+ et as hasChartData,
123
+ rt as hasMeaningfulMetric,
124
+ nt as isNullishMetric,
125
+ I as mapPerformanceKpiStats,
126
+ ot as normalizeSparkPoints,
127
+ st as resolveKpiTrend,
128
+ at as resolveTrend,
129
+ D as trendFromPoints,
130
+ it as trendFromSignedValue
364
131
  };
365
132
  //# sourceMappingURL=performance.es.js.map