@mastra/playground-ui 68.0.0-alpha.3 → 68.0.0
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.
- package/dist/{FilterBar-CQl04O6t.cjs → FilterBar-BSP2UTjc.cjs} +2 -2
- package/dist/{FilterBar-CQl04O6t.cjs.map → FilterBar-BSP2UTjc.cjs.map} +1 -1
- package/dist/{FilterBar-BgW2dqRQ.js → FilterBar-PSQ1OwqH.js} +2 -2
- package/dist/{FilterBar-BgW2dqRQ.js.map → FilterBar-PSQ1OwqH.js.map} +1 -1
- package/dist/{MetricsCard-CEB-f2sv.cjs → MetricsCard-BEwiS7Pe.cjs} +8 -8
- package/dist/MetricsCard-BEwiS7Pe.cjs.map +1 -0
- package/dist/{MetricsCard-M8awJ2B_.js → MetricsCard-ua6C6b8a.js} +10 -10
- package/dist/MetricsCard-ua6C6b8a.js.map +1 -0
- package/dist/{MetricsLineChart-BhHoduO0.js → MetricsLineChart-4SwxBbQx.js} +14 -3
- package/dist/MetricsLineChart-4SwxBbQx.js.map +1 -0
- package/dist/{MetricsLineChart-CjBm4IXu.cjs → MetricsLineChart-tZxsauau.cjs} +13 -2
- package/dist/MetricsLineChart-tZxsauau.cjs.map +1 -0
- package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs → MetricsStackedBarChart-CDLE76IB.cjs} +2 -2
- package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs.map → MetricsStackedBarChart-CDLE76IB.cjs.map} +1 -1
- package/dist/{MetricsStackedBarChart-BRuA6MTE.js → MetricsStackedBarChart-D2QyS4-z.js} +2 -2
- package/dist/{MetricsStackedBarChart-BRuA6MTE.js.map → MetricsStackedBarChart-D2QyS4-z.js.map} +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +2 -2
- package/dist/components/FilterBar.es.js +2 -2
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsLineChart.cjs.js +1 -1
- package/dist/components/MetricsLineChart.es.js +1 -1
- package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
- package/dist/components/MetricsStackedBarChart.es.js +1 -1
- package/dist/{date-time-range-picker-CTt7Od0P.cjs → date-time-range-picker-CWGjoR3j.cjs} +40 -13
- package/dist/date-time-range-picker-CWGjoR3j.cjs.map +1 -0
- package/dist/{date-time-range-picker-DKh1K9Iy.js → date-time-range-picker-CdSiXwB4.js} +40 -13
- package/dist/date-time-range-picker-CdSiXwB4.js.map +1 -0
- package/dist/domains/chat/messages/message-row.cjs.js +1 -1
- package/dist/domains/chat/messages/message-row.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +79 -4
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js.map +1 -1
- package/dist/domains/chat/tools/connect-prompt-tool.es.js +79 -4
- package/dist/domains/chat/tools/connect-prompt-tool.es.js.map +1 -1
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +10 -12
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -1
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js +10 -12
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/connect/types.cjs.js.map +1 -1
- package/dist/domains/connect/types.es.js.map +1 -1
- package/dist/domains/connect/use-user-connect.cjs.js +19 -2
- package/dist/domains/connect/use-user-connect.cjs.js.map +1 -1
- package/dist/domains/connect/use-user-connect.es.js +19 -2
- package/dist/domains/connect/use-user-connect.es.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +4 -3
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.es.js +4 -3
- package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
- package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
- package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-error.es.js +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +4 -3
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.es.js +4 -3
- package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +9 -6
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +9 -6
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +2 -2
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js +2 -2
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-widget.es.js +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +6 -5
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +6 -5
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.cjs.js +9 -2
- package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.es.js +9 -2
- package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +3 -3
- package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
- package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-area.es.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
- package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card.es.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +3 -2
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +3 -2
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.cjs.js +3 -2
- package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.es.js +3 -2
- package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.cjs.js +3 -2
- package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.es.js +3 -2
- package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
- package/dist/domains/metrics/components/scores-card.cjs.js +2 -1
- package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/scores-card.es.js +2 -1
- package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
- package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
- package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
- package/dist/domains/observability/components/observability-histogram.cjs.js +1 -1
- package/dist/domains/observability/components/observability-histogram.es.js +1 -1
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
- package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
- package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
- package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
- package/dist/{filter-bar-time-range-mg9JeYue.js → filter-bar-time-range-qlV8p7hp.js} +2 -2
- package/dist/{filter-bar-time-range-mg9JeYue.js.map → filter-bar-time-range-qlV8p7hp.js.map} +1 -1
- package/dist/{filter-bar-time-range-BA-pXMlo.cjs → filter-bar-time-range-zdM024JD.cjs} +2 -2
- package/dist/{filter-bar-time-range-BA-pXMlo.cjs.map → filter-bar-time-range-zdM024JD.cjs.map} +1 -1
- package/dist/src/domains/chat/tools/connect-prompt-tool.d.ts +10 -1
- package/dist/src/domains/connect/types.d.ts +16 -0
- package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +4 -2
- package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +4 -3
- package/dist/src/domains/dashboards/index.d.ts +1 -1
- package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
- package/dist/src/domains/dashboards/lib/chrome.d.ts +6 -4
- package/dist/src/domains/dashboards/widget-kind.d.ts +12 -0
- package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +12 -1
- package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +1 -1
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +8 -0
- package/dist/style.css +4 -0
- package/dist/{tool-card-rxhTDpk_.cjs → tool-card-BOLXeKIp.cjs} +4 -1
- package/dist/{tool-card-rxhTDpk_.cjs.map → tool-card-BOLXeKIp.cjs.map} +1 -1
- package/dist/{tool-card-toDgoZzJ.js → tool-card-HZ5bm7ue.js} +4 -1
- package/dist/{tool-card-toDgoZzJ.js.map → tool-card-HZ5bm7ue.js.map} +1 -1
- package/package.json +9 -9
- package/dist/MetricsCard-CEB-f2sv.cjs.map +0 -1
- package/dist/MetricsCard-M8awJ2B_.js.map +0 -1
- package/dist/MetricsLineChart-BhHoduO0.js.map +0 -1
- package/dist/MetricsLineChart-CjBm4IXu.cjs.map +0 -1
- package/dist/date-time-range-picker-CTt7Od0P.cjs.map +0 -1
- package/dist/date-time-range-picker-DKh1K9Iy.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scores-widget.es.js","names":[],"sources":["../../../../../src/domains/dashboards/kinds/scores/scores-widget.tsx"],"sourcesContent":["import type { DashboardQuery } from '@mastra/client-js';\nimport { ChartArea } from '../../../metrics/components/chart-area';\nimport { ChartCard } from '../../../metrics/components/chart-card';\nimport { ChartCardError } from '../../../metrics/components/chart-card-error';\nimport { BUCKET_AXIS } from '../../../metrics/lib/chart-axis';\nimport { CHART_COLORS } from '../../../metrics/lib/chart-colors';\nimport { bucketPlan, intervalHours } from '../../../metrics/lib/metrics-buckets';\nimport { ViewGate } from '../../components/view-gate';\nimport { useDashboardRequests } from '../../hooks/use-dashboard-requests';\nimport { useScorers } from '../../hooks/use-scorers';\nimport { FORMATTERS } from '../../lib/format';\nimport { buildRequest } from '../../lib/requests';\nimport type { DashboardPageContext } from '../../lib/requests';\nimport { shapeScores, withScorer } from '../../lib/scores';\nimport type { ResolvedView, WidgetKindProps } from '../../widget-kind';\nimport type { ScoresOptions } from './options';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart } from '@/ds/components/MetricsLineChart';\n\n/** Scores aren't problems, so no warm hues; past five scorers the colors repeat. */\nconst SCORER_COLORS = [\n CHART_COLORS.green,\n CHART_COLORS.sky,\n CHART_COLORS.violet,\n CHART_COLORS.teal,\n CHART_COLORS.indigo,\n];\n\nexport function ScoresWidget({ widget, views }: WidgetKindProps<ScoresOptions>) {\n const [view] = views;\n return (\n <ViewGate queries={view.queries} pending={() => null}>\n {page => <ScoresView
|
|
1
|
+
{"version":3,"file":"scores-widget.es.js","names":[],"sources":["../../../../../src/domains/dashboards/kinds/scores/scores-widget.tsx"],"sourcesContent":["import type { DashboardQuery } from '@mastra/client-js';\nimport { ChartArea } from '../../../metrics/components/chart-area';\nimport { ChartCard } from '../../../metrics/components/chart-card';\nimport { ChartCardError } from '../../../metrics/components/chart-card-error';\nimport { BUCKET_AXIS } from '../../../metrics/lib/chart-axis';\nimport { CHART_COLORS } from '../../../metrics/lib/chart-colors';\nimport { bucketPlan, intervalHours } from '../../../metrics/lib/metrics-buckets';\nimport { ViewGate } from '../../components/view-gate';\nimport { useDashboardRequests } from '../../hooks/use-dashboard-requests';\nimport { useScorers } from '../../hooks/use-scorers';\nimport { viewTitle } from '../../lib/chrome';\nimport type { ViewHeading } from '../../lib/chrome';\nimport { FORMATTERS } from '../../lib/format';\nimport { buildRequest } from '../../lib/requests';\nimport type { DashboardPageContext } from '../../lib/requests';\nimport { shapeScores, withScorer } from '../../lib/scores';\nimport type { ResolvedView, WidgetKindProps } from '../../widget-kind';\nimport type { ScoresOptions } from './options';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart } from '@/ds/components/MetricsLineChart';\n\n/** Scores aren't problems, so no warm hues; past five scorers the colors repeat. */\nconst SCORER_COLORS = [\n CHART_COLORS.green,\n CHART_COLORS.sky,\n CHART_COLORS.violet,\n CHART_COLORS.teal,\n CHART_COLORS.indigo,\n];\n\nexport function ScoresWidget({ widget, views, expand }: WidgetKindProps<ScoresOptions>) {\n const [view] = views;\n // Scores show their first view only, so the title is plain or, with somewhere to expand to, a link.\n const heading = viewTitle(widget, [view], 0, () => {}, expand);\n return (\n <ViewGate queries={view.queries} pending={() => null}>\n {page => <ScoresView heading={heading} view={view} page={page} />}\n </ViewGate>\n );\n}\n\nfunction ScoresView({\n heading,\n view,\n page,\n}: {\n heading: ViewHeading;\n view: ResolvedView<ScoresOptions>;\n page: DashboardPageContext;\n}) {\n const { options } = view;\n const { interval } = bucketPlan(page.window.start, page.window.end);\n const stepHours = intervalHours(interval);\n const { recent, scorers } = useScorers(view.queries, page);\n const averageQuery = view.queries.find(q => q.id === options.average);\n const seriesQuery = view.queries.find(q => q.id === options.series);\n const send = (query: DashboardQuery | undefined, scorerId: string, bucket?: typeof interval) => {\n const own = withScorer(query, scorerId);\n return own && buildRequest(own, page, { interval: bucket });\n };\n // One answer per scorer in each list, in `scorers`' order.\n const means = useDashboardRequests(scorers.map(({ scorerId }) => send(averageQuery, scorerId)));\n const points = useDashboardRequests(scorers.map(({ scorerId }) => send(seriesQuery, scorerId, interval)));\n\n const all = [recent, ...means, ...points].filter(r => r !== undefined);\n const failed = all.filter(r => r.isError);\n if (failed.length > 0) {\n return (\n <ChartCard {...heading}>\n <ChartCardError error={failed[0]?.error} onRetry={() => failed.forEach(r => void r.refetch())} />\n </ChartCard>\n );\n }\n\n const isLoading = all.some(r => r.isLoading);\n const { buckets, lines } = shapeScores(\n isLoading ? [] : scorers,\n means.map(r => r?.data),\n points.map(r => r?.data),\n page.window,\n stepHours,\n );\n const series: MetricsLineChartSeries[] = lines.map(({ scorerId, name }, i) => ({\n dataKey: scorerId,\n label: name,\n color: SCORER_COLORS[i % SCORER_COLORS.length] ?? CHART_COLORS.neutral,\n }));\n\n return (\n <ChartCard {...heading} isUpdating={all.some(r => r.isRefetching)}>\n <ChartArea isEmpty={!isLoading && lines.length === 0} emptyMessage={options.emptyMessage}>\n <MetricsLineChart\n lineStyle=\"thin\"\n data={isLoading ? [] : buckets}\n series={series}\n height=\"fill\"\n yDomain={[0, 1]}\n valueFormatter={FORMATTERS.score.value}\n axisFormatter={FORMATTERS.score.axis}\n isLoading={isLoading}\n {...BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAsBA,IAAM,gBAAgB;CACpB,aAAa;CACb,aAAa;CACb,aAAa;CACb,aAAa;CACb,aAAa;AACf;AAEA,SAAgB,aAAa,EAAE,QAAQ,OAAO,UAA0C;CACtF,MAAM,CAAC,QAAQ;CAEf,MAAM,UAAU,UAAU,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM;CAC7D,OACE,oBAAC,UAAD;EAAU,SAAS,KAAK;EAAS,eAAe;EAC7C,WAAA,SAAQ,oBAAC,YAAD;GAAqB;GAAe;GAAY;EAAO,CAAA;CACxD,CAAA;AAEd;AAEA,SAAS,WAAW,EAClB,SACA,MACA,QAKC;CACD,MAAM,EAAE,YAAY;CACpB,MAAM,EAAE,aAAa,WAAW,KAAK,OAAO,OAAO,KAAK,OAAO,GAAG;CAClE,MAAM,YAAY,cAAc,QAAQ;CACxC,MAAM,EAAE,QAAQ,YAAY,WAAW,KAAK,SAAS,IAAI;CACzD,MAAM,eAAe,KAAK,QAAQ,MAAK,MAAK,EAAE,OAAO,QAAQ,OAAO;CACpE,MAAM,cAAc,KAAK,QAAQ,MAAK,MAAK,EAAE,OAAO,QAAQ,MAAM;CAClE,MAAM,QAAQ,OAAmC,UAAkB,WAA6B;EAC9F,MAAM,MAAM,WAAW,OAAO,QAAQ;EACtC,OAAO,OAAO,aAAa,KAAK,MAAM,EAAE,UAAU,OAAO,CAAC;CAC5D;CAEA,MAAM,QAAQ,qBAAqB,QAAQ,KAAK,EAAE,eAAe,KAAK,cAAc,QAAQ,CAAC,CAAC;CAC9F,MAAM,SAAS,qBAAqB,QAAQ,KAAK,EAAE,eAAe,KAAK,aAAa,UAAU,QAAQ,CAAC,CAAC;CAExG,MAAM,MAAM;EAAC;EAAQ,GAAG;EAAO,GAAG;CAAM,CAAC,CAAC,QAAO,MAAK,MAAM,KAAA,CAAS;CACrE,MAAM,SAAS,IAAI,QAAO,MAAK,EAAE,OAAO;CACxC,IAAI,OAAO,SAAS,GAClB,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD;GAAgB,OAAO,OAAO,EAAE,EAAE;GAAO,eAAe,OAAO,SAAQ,MAAK,KAAK,EAAE,QAAQ,CAAC;EAAI,CAAA;CACvF,CAAA;CAIf,MAAM,YAAY,IAAI,MAAK,MAAK,EAAE,SAAS;CAC3C,MAAM,EAAE,SAAS,UAAU,YACzB,YAAY,CAAC,IAAI,SACjB,MAAM,KAAI,MAAK,GAAG,IAAI,GACtB,OAAO,KAAI,MAAK,GAAG,IAAI,GACvB,KAAK,QACL,SACF;CACA,MAAM,SAAmC,MAAM,KAAK,EAAE,UAAU,QAAQ,OAAO;EAC7E,SAAS;EACT,OAAO;EACP,OAAO,cAAc,IAAI,cAAc,WAAW,aAAa;CACjE,EAAE;CAEF,OACE,oBAAC,WAAD;EAAW,GAAI;EAAS,YAAY,IAAI,MAAK,MAAK,EAAE,YAAY;EAC9D,UAAA,oBAAC,WAAD;GAAW,SAAS,CAAC,aAAa,MAAM,WAAW;GAAG,cAAc,QAAQ;GAC1E,UAAA,oBAAC,kBAAD;IACE,WAAU;IACV,MAAM,YAAY,CAAC,IAAI;IACf;IACR,QAAO;IACP,SAAS,CAAC,GAAG,CAAC;IACd,gBAAgB,WAAW,MAAM;IACjC,eAAe,WAAW,MAAM;IACrB;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
|
|
@@ -2,9 +2,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_domains_dashboards_lib_requests = require("../../lib/requests.cjs.js");
|
|
3
3
|
const require_domains_dashboards_hooks_use_dashboard_requests = require("../../hooks/use-dashboard-requests.cjs.js");
|
|
4
4
|
const require_domains_dashboards_lib_values = require("../../lib/values.cjs.js");
|
|
5
|
-
const require_MetricsCard = require("../../../../MetricsCard-
|
|
6
|
-
const require_domains_dashboards_lib_table = require("../../lib/table.cjs.js");
|
|
5
|
+
const require_MetricsCard = require("../../../../MetricsCard-BEwiS7Pe.cjs");
|
|
7
6
|
const require_domains_dashboards_lib_chrome = require("../../lib/chrome.cjs.js");
|
|
7
|
+
const require_domains_dashboards_lib_table = require("../../lib/table.cjs.js");
|
|
8
8
|
const require_domains_dashboards_hooks_use_widget_views = require("../../hooks/use-widget-views.cjs.js");
|
|
9
9
|
const require_domains_dashboards_kinds_table_table_frame = require("./table-frame.cjs.js");
|
|
10
10
|
const require_domains_dashboards_kinds_table_table_view = require("./table-view.cjs.js");
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { buildRequest } from "../../lib/requests.es.js";
|
|
2
2
|
import { useDashboardRequests } from "../../hooks/use-dashboard-requests.es.js";
|
|
3
3
|
import { exprRefs } from "../../lib/values.es.js";
|
|
4
|
-
import { t as MetricsCard } from "../../../../MetricsCard-
|
|
5
|
-
import { countRows, isValueColumn, openingView, parseColumns } from "../../lib/table.es.js";
|
|
4
|
+
import { t as MetricsCard } from "../../../../MetricsCard-ua6C6b8a.js";
|
|
6
5
|
import { unsupportedMessage } from "../../lib/chrome.es.js";
|
|
6
|
+
import { countRows, isValueColumn, openingView, parseColumns } from "../../lib/table.es.js";
|
|
7
7
|
import { useViewMenu } from "../../hooks/use-widget-views.es.js";
|
|
8
8
|
import { TableFrame } from "./table-frame.es.js";
|
|
9
9
|
import { TableView } from "./table-view.es.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_domains_dashboards_components_view_gate = require("../../components/view-gate.cjs.js");
|
|
3
|
-
const require_MetricsCard = require("../../../../MetricsCard-
|
|
3
|
+
const require_MetricsCard = require("../../../../MetricsCard-BEwiS7Pe.cjs");
|
|
4
4
|
const require_domains_metrics_components_chart_card = require("../../../metrics/components/chart-card.cjs.js");
|
|
5
5
|
const require_domains_dashboards_kinds_table_table_tabs = require("./table-tabs.cjs.js");
|
|
6
6
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ViewGate } from "../../components/view-gate.es.js";
|
|
2
|
-
import { t as MetricsCard } from "../../../../MetricsCard-
|
|
2
|
+
import { t as MetricsCard } from "../../../../MetricsCard-ua6C6b8a.js";
|
|
3
3
|
import { ChartCard } from "../../../metrics/components/chart-card.es.js";
|
|
4
4
|
import { TableTabs } from "./table-tabs.es.js";
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -4,22 +4,22 @@ const require_domains_dashboards_lib_requests = require("../../lib/requests.cjs.
|
|
|
4
4
|
const require_domains_dashboards_components_view_gate = require("../../components/view-gate.cjs.js");
|
|
5
5
|
const require_domains_dashboards_hooks_use_dashboard_requests = require("../../hooks/use-dashboard-requests.cjs.js");
|
|
6
6
|
const require_domains_dashboards_lib_values = require("../../lib/values.cjs.js");
|
|
7
|
-
const require_MetricsCard = require("../../../../MetricsCard-
|
|
7
|
+
const require_MetricsCard = require("../../../../MetricsCard-BEwiS7Pe.cjs");
|
|
8
8
|
const require_domains_metrics_components_chart_area = require("../../../metrics/components/chart-area.cjs.js");
|
|
9
9
|
const require_domains_metrics_components_chart_card = require("../../../metrics/components/chart-card.cjs.js");
|
|
10
10
|
const require_domains_metrics_components_chart_card_error = require("../../../metrics/components/chart-card-error.cjs.js");
|
|
11
11
|
const require_domains_metrics_lib_chart_axis = require("../../../metrics/lib/chart-axis.cjs.js");
|
|
12
12
|
const require_domains_dashboards_lib_format = require("../../lib/format.cjs.js");
|
|
13
|
-
const require_MetricsLineChart = require("../../../../MetricsLineChart-
|
|
13
|
+
const require_MetricsLineChart = require("../../../../MetricsLineChart-tZxsauau.cjs");
|
|
14
14
|
const require_domains_dashboards_hooks_use_widget_views = require("../../hooks/use-widget-views.cjs.js");
|
|
15
15
|
const require_domains_dashboards_lib_timeseries = require("../../lib/timeseries.cjs.js");
|
|
16
16
|
const require_domains_dashboards_components_widget_chrome = require("../../components/widget-chrome.cjs.js");
|
|
17
17
|
const require_domains_dashboards_components_widget_controls = require("../../components/widget-controls.cjs.js");
|
|
18
|
-
const require_MetricsStackedBarChart = require("../../../../MetricsStackedBarChart-
|
|
18
|
+
const require_MetricsStackedBarChart = require("../../../../MetricsStackedBarChart-CDLE76IB.cjs");
|
|
19
19
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
20
20
|
// src/domains/dashboards/kinds/timeseries/timeseries-widget.tsx
|
|
21
21
|
function TimeseriesWidget(props) {
|
|
22
|
-
const { view, heading } = require_domains_dashboards_hooks_use_widget_views.useViewMenu(props.widget, props.views);
|
|
22
|
+
const { view, heading } = require_domains_dashboards_hooks_use_widget_views.useViewMenu(props.widget, props.views, 0, props.expand);
|
|
23
23
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_dashboards_components_view_gate.ViewGate, {
|
|
24
24
|
queries: view.queries,
|
|
25
25
|
pending: (gate) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_dashboards_components_widget_chrome.PendingChartCard, {
|
|
@@ -105,7 +105,8 @@ function TimeseriesView({ widget, view, heading, page, onDrilldown }) {
|
|
|
105
105
|
emptyMessage: options.emptyMessage,
|
|
106
106
|
children: options.chart === "stackedBar" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MetricsStackedBarChart.MetricsStackedBarChart, { ...chart }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MetricsLineChart.MetricsLineChart, {
|
|
107
107
|
...chart,
|
|
108
|
-
yDomain
|
|
108
|
+
yDomain,
|
|
109
|
+
lineStyle: "thin"
|
|
109
110
|
})
|
|
110
111
|
})
|
|
111
112
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeseries-widget.cjs.js","names":["useViewMenu","ViewGate","PendingChartCard","bucketPlan","useDashboardRequests","buildRequest","useDrilldown","shapeTimeseries","answersById","FORMATTERS","chartColor","hasDrilldownAction","DrilldownAction","MetricsCard","MetricsLineChartLegend","ChartCard","ChartCardError","bucketWindow","EDGE_BUCKET_AXIS","BUCKET_AXIS","ChartArea","MetricsStackedBarChart","MetricsLineChart"],"sources":["../../../../../src/domains/dashboards/kinds/timeseries/timeseries-widget.tsx"],"sourcesContent":["import { ChartArea } from '../../../metrics/components/chart-area';\nimport { ChartCard } from '../../../metrics/components/chart-card';\nimport { ChartCardError } from '../../../metrics/components/chart-card-error';\nimport { BUCKET_AXIS, EDGE_BUCKET_AXIS } from '../../../metrics/lib/chart-axis';\nimport { bucketPlan, bucketWindow } from '../../../metrics/lib/metrics-buckets';\nimport { ViewGate } from '../../components/view-gate';\nimport { PendingChartCard } from '../../components/widget-chrome';\nimport { DrilldownAction } from '../../components/widget-controls';\nimport { useDashboardRequests } from '../../hooks/use-dashboard-requests';\nimport { hasDrilldownAction, useDrilldown, useViewMenu } from '../../hooks/use-widget-views';\nimport type { ViewHeading } from '../../lib/chrome';\nimport { chartColor, FORMATTERS } from '../../lib/format';\nimport { buildRequest } from '../../lib/requests';\nimport type { DashboardPageContext } from '../../lib/requests';\nimport { shapeTimeseries } from '../../lib/timeseries';\nimport type { TimeseriesOptions } from '../../lib/timeseries';\nimport { answersById } from '../../lib/values';\nimport type { ResolvedView, WidgetKindProps } from '../../widget-kind';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsStackedBarChart } from '@/ds/components/MetricsStackedBarChart';\n\ntype Props = WidgetKindProps<TimeseriesOptions>;\ntype ViewProps = Props & {\n view: ResolvedView<TimeseriesOptions>;\n heading: ViewHeading;\n page: DashboardPageContext;\n};\n\nexport function TimeseriesWidget(props: Props) {\n const { view, heading } = useViewMenu(props.widget, props.views);\n return (\n <ViewGate queries={view.queries} pending={gate => <PendingChartCard gate={gate} heading={heading} />}>\n {page => <TimeseriesView {...props} view={view} heading={heading} page={page} />}\n </ViewGate>\n );\n}\n\nfunction TimeseriesView({ widget, view, heading, page, onDrilldown }: ViewProps) {\n const { options } = view;\n const { interval } = bucketPlan(page.window.start, page.window.end);\n const totals = new Set(options.totals ?? []);\n const results = useDashboardRequests(\n view.queries.map(q =>\n buildRequest(q, page, { interval: q.id !== undefined && totals.has(q.id) ? undefined : interval }),\n ),\n );\n const sent = results.filter(r => r !== undefined);\n const hasTraceQueries = view.queries.some(q => q.source === 'traceAggregate' || q.source === 'spanAggregate');\n const onClick = useDrilldown(widget, view, onDrilldown);\n\n const isLoading = sent.some(r => r.isLoading);\n const shaped = shapeTimeseries({\n options,\n responses: answersById(\n view.queries,\n results.map(r => r?.data),\n ),\n window: page.window,\n hasTraceQueries,\n });\n const format = FORMATTERS[options.format];\n const lines: MetricsLineChartSeries[] = shaped.series.map(s => ({\n dataKey: s.dataKey,\n label: s.label,\n color: chartColor(s.color),\n emphasis: s.emphasis,\n }));\n // Series with a range total each show theirs, marked like their line: they count different things.\n const rangeTotals = shaped.series.flatMap(s =>\n s.rangeTotal === undefined\n ? []\n : [{ label: s.label, value: format.value(s.rangeTotal), color: chartColor(s.color) }],\n );\n const withRangeTotals = options.series.some(s => s.rangeTotal !== undefined);\n\n const layout = {\n ...heading,\n actions: hasDrilldownAction(widget, view, onDrilldown) ? (\n <DrilldownAction widget={widget} view={view} onDrilldown={onDrilldown} />\n ) : undefined,\n total: withRangeTotals ? rangeTotals : undefined,\n isLoading,\n toolbar: lines.length > 0 && (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={lines} />\n </MetricsCard.Toolbar>\n ),\n };\n\n const failed = sent.filter(r => r.isError);\n if (failed.length) {\n return (\n <ChartCard {...layout}>\n {hasTraceQueries ? (\n <ChartCardError error={failed[0]?.error} onRetry={() => failed.forEach(r => void r.refetch())} />\n ) : (\n <ChartCardError />\n )}\n </ChartCard>\n );\n }\n\n const totalFormat = FORMATTERS[options.total?.format ?? options.format];\n const total =\n options.total &&\n (typeof options.total.value === 'object' && 'peak' in options.total.value && !shaped.total\n ? '—'\n : totalFormat.value(shaped.total ?? 0));\n\n const chart = {\n data: shaped.data,\n series: lines,\n height: 'fill' as const,\n xLabels: options.xLabels,\n showLegend: false,\n valueFormatter: format.value,\n axisFormatter: options.axis === false ? undefined : format.axis,\n onBucketClick:\n onClick &&\n ((row: Record<string, unknown>) => onClick({ window: bucketWindow(Number(row.ts), shaped.stepHours) })),\n isLoading,\n ...(options.xLabels ? EDGE_BUCKET_AXIS : BUCKET_AXIS),\n };\n const yDomain = shaped.flat && options.flatYDomain ? options.flatYDomain : options.yDomain;\n\n return (\n <ChartCard {...layout} total={layout.total ?? total} isUpdating={sent.some(r => r.isRefetching)}>\n <ChartArea isEmpty={!isLoading && shaped.empty} emptyMessage={options.emptyMessage}>\n {options.chart === 'stackedBar' ? (\n <MetricsStackedBarChart {...chart} />\n ) : (\n <MetricsLineChart {...chart} yDomain={yDomain} />\n )}\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,iBAAiB,OAAc;CAC7C,MAAM,EAAE,MAAM,YAAYA,kDAAAA,YAAY,MAAM,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"timeseries-widget.cjs.js","names":["useViewMenu","ViewGate","PendingChartCard","bucketPlan","useDashboardRequests","buildRequest","useDrilldown","shapeTimeseries","answersById","FORMATTERS","chartColor","hasDrilldownAction","DrilldownAction","MetricsCard","MetricsLineChartLegend","ChartCard","ChartCardError","bucketWindow","EDGE_BUCKET_AXIS","BUCKET_AXIS","ChartArea","MetricsStackedBarChart","MetricsLineChart"],"sources":["../../../../../src/domains/dashboards/kinds/timeseries/timeseries-widget.tsx"],"sourcesContent":["import { ChartArea } from '../../../metrics/components/chart-area';\nimport { ChartCard } from '../../../metrics/components/chart-card';\nimport { ChartCardError } from '../../../metrics/components/chart-card-error';\nimport { BUCKET_AXIS, EDGE_BUCKET_AXIS } from '../../../metrics/lib/chart-axis';\nimport { bucketPlan, bucketWindow } from '../../../metrics/lib/metrics-buckets';\nimport { ViewGate } from '../../components/view-gate';\nimport { PendingChartCard } from '../../components/widget-chrome';\nimport { DrilldownAction } from '../../components/widget-controls';\nimport { useDashboardRequests } from '../../hooks/use-dashboard-requests';\nimport { hasDrilldownAction, useDrilldown, useViewMenu } from '../../hooks/use-widget-views';\nimport type { ViewHeading } from '../../lib/chrome';\nimport { chartColor, FORMATTERS } from '../../lib/format';\nimport { buildRequest } from '../../lib/requests';\nimport type { DashboardPageContext } from '../../lib/requests';\nimport { shapeTimeseries } from '../../lib/timeseries';\nimport type { TimeseriesOptions } from '../../lib/timeseries';\nimport { answersById } from '../../lib/values';\nimport type { ResolvedView, WidgetKindProps } from '../../widget-kind';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsStackedBarChart } from '@/ds/components/MetricsStackedBarChart';\n\ntype Props = WidgetKindProps<TimeseriesOptions>;\ntype ViewProps = Props & {\n view: ResolvedView<TimeseriesOptions>;\n heading: ViewHeading;\n page: DashboardPageContext;\n};\n\nexport function TimeseriesWidget(props: Props) {\n const { view, heading } = useViewMenu(props.widget, props.views, 0, props.expand);\n return (\n <ViewGate queries={view.queries} pending={gate => <PendingChartCard gate={gate} heading={heading} />}>\n {page => <TimeseriesView {...props} view={view} heading={heading} page={page} />}\n </ViewGate>\n );\n}\n\nfunction TimeseriesView({ widget, view, heading, page, onDrilldown }: ViewProps) {\n const { options } = view;\n const { interval } = bucketPlan(page.window.start, page.window.end);\n const totals = new Set(options.totals ?? []);\n const results = useDashboardRequests(\n view.queries.map(q =>\n buildRequest(q, page, { interval: q.id !== undefined && totals.has(q.id) ? undefined : interval }),\n ),\n );\n const sent = results.filter(r => r !== undefined);\n const hasTraceQueries = view.queries.some(q => q.source === 'traceAggregate' || q.source === 'spanAggregate');\n const onClick = useDrilldown(widget, view, onDrilldown);\n\n const isLoading = sent.some(r => r.isLoading);\n const shaped = shapeTimeseries({\n options,\n responses: answersById(\n view.queries,\n results.map(r => r?.data),\n ),\n window: page.window,\n hasTraceQueries,\n });\n const format = FORMATTERS[options.format];\n const lines: MetricsLineChartSeries[] = shaped.series.map(s => ({\n dataKey: s.dataKey,\n label: s.label,\n color: chartColor(s.color),\n emphasis: s.emphasis,\n }));\n // Series with a range total each show theirs, marked like their line: they count different things.\n const rangeTotals = shaped.series.flatMap(s =>\n s.rangeTotal === undefined\n ? []\n : [{ label: s.label, value: format.value(s.rangeTotal), color: chartColor(s.color) }],\n );\n const withRangeTotals = options.series.some(s => s.rangeTotal !== undefined);\n\n const layout = {\n ...heading,\n actions: hasDrilldownAction(widget, view, onDrilldown) ? (\n <DrilldownAction widget={widget} view={view} onDrilldown={onDrilldown} />\n ) : undefined,\n total: withRangeTotals ? rangeTotals : undefined,\n isLoading,\n toolbar: lines.length > 0 && (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={lines} />\n </MetricsCard.Toolbar>\n ),\n };\n\n const failed = sent.filter(r => r.isError);\n if (failed.length) {\n return (\n <ChartCard {...layout}>\n {hasTraceQueries ? (\n <ChartCardError error={failed[0]?.error} onRetry={() => failed.forEach(r => void r.refetch())} />\n ) : (\n <ChartCardError />\n )}\n </ChartCard>\n );\n }\n\n const totalFormat = FORMATTERS[options.total?.format ?? options.format];\n const total =\n options.total &&\n (typeof options.total.value === 'object' && 'peak' in options.total.value && !shaped.total\n ? '—'\n : totalFormat.value(shaped.total ?? 0));\n\n const chart = {\n data: shaped.data,\n series: lines,\n height: 'fill' as const,\n xLabels: options.xLabels,\n showLegend: false,\n valueFormatter: format.value,\n axisFormatter: options.axis === false ? undefined : format.axis,\n onBucketClick:\n onClick &&\n ((row: Record<string, unknown>) => onClick({ window: bucketWindow(Number(row.ts), shaped.stepHours) })),\n isLoading,\n ...(options.xLabels ? EDGE_BUCKET_AXIS : BUCKET_AXIS),\n };\n const yDomain = shaped.flat && options.flatYDomain ? options.flatYDomain : options.yDomain;\n\n return (\n <ChartCard {...layout} total={layout.total ?? total} isUpdating={sent.some(r => r.isRefetching)}>\n <ChartArea isEmpty={!isLoading && shaped.empty} emptyMessage={options.emptyMessage}>\n {options.chart === 'stackedBar' ? (\n <MetricsStackedBarChart {...chart} />\n ) : (\n <MetricsLineChart {...chart} yDomain={yDomain} lineStyle=\"thin\" />\n )}\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":"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"}
|
|
@@ -3,22 +3,22 @@ import { buildRequest } from "../../lib/requests.es.js";
|
|
|
3
3
|
import { ViewGate } from "../../components/view-gate.es.js";
|
|
4
4
|
import { useDashboardRequests } from "../../hooks/use-dashboard-requests.es.js";
|
|
5
5
|
import { answersById } from "../../lib/values.es.js";
|
|
6
|
-
import { t as MetricsCard } from "../../../../MetricsCard-
|
|
6
|
+
import { t as MetricsCard } from "../../../../MetricsCard-ua6C6b8a.js";
|
|
7
7
|
import { ChartArea } from "../../../metrics/components/chart-area.es.js";
|
|
8
8
|
import { ChartCard } from "../../../metrics/components/chart-card.es.js";
|
|
9
9
|
import { ChartCardError } from "../../../metrics/components/chart-card-error.es.js";
|
|
10
10
|
import { BUCKET_AXIS, EDGE_BUCKET_AXIS } from "../../../metrics/lib/chart-axis.es.js";
|
|
11
11
|
import { FORMATTERS, chartColor } from "../../lib/format.es.js";
|
|
12
|
-
import { r as MetricsLineChartLegend, t as MetricsLineChart } from "../../../../MetricsLineChart-
|
|
12
|
+
import { r as MetricsLineChartLegend, t as MetricsLineChart } from "../../../../MetricsLineChart-4SwxBbQx.js";
|
|
13
13
|
import { hasDrilldownAction, useDrilldown, useViewMenu } from "../../hooks/use-widget-views.es.js";
|
|
14
14
|
import { shapeTimeseries } from "../../lib/timeseries.es.js";
|
|
15
15
|
import { PendingChartCard } from "../../components/widget-chrome.es.js";
|
|
16
16
|
import { DrilldownAction } from "../../components/widget-controls.es.js";
|
|
17
|
-
import { t as MetricsStackedBarChart } from "../../../../MetricsStackedBarChart-
|
|
17
|
+
import { t as MetricsStackedBarChart } from "../../../../MetricsStackedBarChart-D2QyS4-z.js";
|
|
18
18
|
import { jsx } from "react/jsx-runtime";
|
|
19
19
|
// src/domains/dashboards/kinds/timeseries/timeseries-widget.tsx
|
|
20
20
|
function TimeseriesWidget(props) {
|
|
21
|
-
const { view, heading } = useViewMenu(props.widget, props.views);
|
|
21
|
+
const { view, heading } = useViewMenu(props.widget, props.views, 0, props.expand);
|
|
22
22
|
return /* @__PURE__ */ jsx(ViewGate, {
|
|
23
23
|
queries: view.queries,
|
|
24
24
|
pending: (gate) => /* @__PURE__ */ jsx(PendingChartCard, {
|
|
@@ -104,7 +104,8 @@ function TimeseriesView({ widget, view, heading, page, onDrilldown }) {
|
|
|
104
104
|
emptyMessage: options.emptyMessage,
|
|
105
105
|
children: options.chart === "stackedBar" ? /* @__PURE__ */ jsx(MetricsStackedBarChart, { ...chart }) : /* @__PURE__ */ jsx(MetricsLineChart, {
|
|
106
106
|
...chart,
|
|
107
|
-
yDomain
|
|
107
|
+
yDomain,
|
|
108
|
+
lineStyle: "thin"
|
|
108
109
|
})
|
|
109
110
|
})
|
|
110
111
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeseries-widget.es.js","names":[],"sources":["../../../../../src/domains/dashboards/kinds/timeseries/timeseries-widget.tsx"],"sourcesContent":["import { ChartArea } from '../../../metrics/components/chart-area';\nimport { ChartCard } from '../../../metrics/components/chart-card';\nimport { ChartCardError } from '../../../metrics/components/chart-card-error';\nimport { BUCKET_AXIS, EDGE_BUCKET_AXIS } from '../../../metrics/lib/chart-axis';\nimport { bucketPlan, bucketWindow } from '../../../metrics/lib/metrics-buckets';\nimport { ViewGate } from '../../components/view-gate';\nimport { PendingChartCard } from '../../components/widget-chrome';\nimport { DrilldownAction } from '../../components/widget-controls';\nimport { useDashboardRequests } from '../../hooks/use-dashboard-requests';\nimport { hasDrilldownAction, useDrilldown, useViewMenu } from '../../hooks/use-widget-views';\nimport type { ViewHeading } from '../../lib/chrome';\nimport { chartColor, FORMATTERS } from '../../lib/format';\nimport { buildRequest } from '../../lib/requests';\nimport type { DashboardPageContext } from '../../lib/requests';\nimport { shapeTimeseries } from '../../lib/timeseries';\nimport type { TimeseriesOptions } from '../../lib/timeseries';\nimport { answersById } from '../../lib/values';\nimport type { ResolvedView, WidgetKindProps } from '../../widget-kind';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsStackedBarChart } from '@/ds/components/MetricsStackedBarChart';\n\ntype Props = WidgetKindProps<TimeseriesOptions>;\ntype ViewProps = Props & {\n view: ResolvedView<TimeseriesOptions>;\n heading: ViewHeading;\n page: DashboardPageContext;\n};\n\nexport function TimeseriesWidget(props: Props) {\n const { view, heading } = useViewMenu(props.widget, props.views);\n return (\n <ViewGate queries={view.queries} pending={gate => <PendingChartCard gate={gate} heading={heading} />}>\n {page => <TimeseriesView {...props} view={view} heading={heading} page={page} />}\n </ViewGate>\n );\n}\n\nfunction TimeseriesView({ widget, view, heading, page, onDrilldown }: ViewProps) {\n const { options } = view;\n const { interval } = bucketPlan(page.window.start, page.window.end);\n const totals = new Set(options.totals ?? []);\n const results = useDashboardRequests(\n view.queries.map(q =>\n buildRequest(q, page, { interval: q.id !== undefined && totals.has(q.id) ? undefined : interval }),\n ),\n );\n const sent = results.filter(r => r !== undefined);\n const hasTraceQueries = view.queries.some(q => q.source === 'traceAggregate' || q.source === 'spanAggregate');\n const onClick = useDrilldown(widget, view, onDrilldown);\n\n const isLoading = sent.some(r => r.isLoading);\n const shaped = shapeTimeseries({\n options,\n responses: answersById(\n view.queries,\n results.map(r => r?.data),\n ),\n window: page.window,\n hasTraceQueries,\n });\n const format = FORMATTERS[options.format];\n const lines: MetricsLineChartSeries[] = shaped.series.map(s => ({\n dataKey: s.dataKey,\n label: s.label,\n color: chartColor(s.color),\n emphasis: s.emphasis,\n }));\n // Series with a range total each show theirs, marked like their line: they count different things.\n const rangeTotals = shaped.series.flatMap(s =>\n s.rangeTotal === undefined\n ? []\n : [{ label: s.label, value: format.value(s.rangeTotal), color: chartColor(s.color) }],\n );\n const withRangeTotals = options.series.some(s => s.rangeTotal !== undefined);\n\n const layout = {\n ...heading,\n actions: hasDrilldownAction(widget, view, onDrilldown) ? (\n <DrilldownAction widget={widget} view={view} onDrilldown={onDrilldown} />\n ) : undefined,\n total: withRangeTotals ? rangeTotals : undefined,\n isLoading,\n toolbar: lines.length > 0 && (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={lines} />\n </MetricsCard.Toolbar>\n ),\n };\n\n const failed = sent.filter(r => r.isError);\n if (failed.length) {\n return (\n <ChartCard {...layout}>\n {hasTraceQueries ? (\n <ChartCardError error={failed[0]?.error} onRetry={() => failed.forEach(r => void r.refetch())} />\n ) : (\n <ChartCardError />\n )}\n </ChartCard>\n );\n }\n\n const totalFormat = FORMATTERS[options.total?.format ?? options.format];\n const total =\n options.total &&\n (typeof options.total.value === 'object' && 'peak' in options.total.value && !shaped.total\n ? '—'\n : totalFormat.value(shaped.total ?? 0));\n\n const chart = {\n data: shaped.data,\n series: lines,\n height: 'fill' as const,\n xLabels: options.xLabels,\n showLegend: false,\n valueFormatter: format.value,\n axisFormatter: options.axis === false ? undefined : format.axis,\n onBucketClick:\n onClick &&\n ((row: Record<string, unknown>) => onClick({ window: bucketWindow(Number(row.ts), shaped.stepHours) })),\n isLoading,\n ...(options.xLabels ? EDGE_BUCKET_AXIS : BUCKET_AXIS),\n };\n const yDomain = shaped.flat && options.flatYDomain ? options.flatYDomain : options.yDomain;\n\n return (\n <ChartCard {...layout} total={layout.total ?? total} isUpdating={sent.some(r => r.isRefetching)}>\n <ChartArea isEmpty={!isLoading && shaped.empty} emptyMessage={options.emptyMessage}>\n {options.chart === 'stackedBar' ? (\n <MetricsStackedBarChart {...chart} />\n ) : (\n <MetricsLineChart {...chart} yDomain={yDomain} />\n )}\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,iBAAiB,OAAc;CAC7C,MAAM,EAAE,MAAM,YAAY,YAAY,MAAM,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"timeseries-widget.es.js","names":[],"sources":["../../../../../src/domains/dashboards/kinds/timeseries/timeseries-widget.tsx"],"sourcesContent":["import { ChartArea } from '../../../metrics/components/chart-area';\nimport { ChartCard } from '../../../metrics/components/chart-card';\nimport { ChartCardError } from '../../../metrics/components/chart-card-error';\nimport { BUCKET_AXIS, EDGE_BUCKET_AXIS } from '../../../metrics/lib/chart-axis';\nimport { bucketPlan, bucketWindow } from '../../../metrics/lib/metrics-buckets';\nimport { ViewGate } from '../../components/view-gate';\nimport { PendingChartCard } from '../../components/widget-chrome';\nimport { DrilldownAction } from '../../components/widget-controls';\nimport { useDashboardRequests } from '../../hooks/use-dashboard-requests';\nimport { hasDrilldownAction, useDrilldown, useViewMenu } from '../../hooks/use-widget-views';\nimport type { ViewHeading } from '../../lib/chrome';\nimport { chartColor, FORMATTERS } from '../../lib/format';\nimport { buildRequest } from '../../lib/requests';\nimport type { DashboardPageContext } from '../../lib/requests';\nimport { shapeTimeseries } from '../../lib/timeseries';\nimport type { TimeseriesOptions } from '../../lib/timeseries';\nimport { answersById } from '../../lib/values';\nimport type { ResolvedView, WidgetKindProps } from '../../widget-kind';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsStackedBarChart } from '@/ds/components/MetricsStackedBarChart';\n\ntype Props = WidgetKindProps<TimeseriesOptions>;\ntype ViewProps = Props & {\n view: ResolvedView<TimeseriesOptions>;\n heading: ViewHeading;\n page: DashboardPageContext;\n};\n\nexport function TimeseriesWidget(props: Props) {\n const { view, heading } = useViewMenu(props.widget, props.views, 0, props.expand);\n return (\n <ViewGate queries={view.queries} pending={gate => <PendingChartCard gate={gate} heading={heading} />}>\n {page => <TimeseriesView {...props} view={view} heading={heading} page={page} />}\n </ViewGate>\n );\n}\n\nfunction TimeseriesView({ widget, view, heading, page, onDrilldown }: ViewProps) {\n const { options } = view;\n const { interval } = bucketPlan(page.window.start, page.window.end);\n const totals = new Set(options.totals ?? []);\n const results = useDashboardRequests(\n view.queries.map(q =>\n buildRequest(q, page, { interval: q.id !== undefined && totals.has(q.id) ? undefined : interval }),\n ),\n );\n const sent = results.filter(r => r !== undefined);\n const hasTraceQueries = view.queries.some(q => q.source === 'traceAggregate' || q.source === 'spanAggregate');\n const onClick = useDrilldown(widget, view, onDrilldown);\n\n const isLoading = sent.some(r => r.isLoading);\n const shaped = shapeTimeseries({\n options,\n responses: answersById(\n view.queries,\n results.map(r => r?.data),\n ),\n window: page.window,\n hasTraceQueries,\n });\n const format = FORMATTERS[options.format];\n const lines: MetricsLineChartSeries[] = shaped.series.map(s => ({\n dataKey: s.dataKey,\n label: s.label,\n color: chartColor(s.color),\n emphasis: s.emphasis,\n }));\n // Series with a range total each show theirs, marked like their line: they count different things.\n const rangeTotals = shaped.series.flatMap(s =>\n s.rangeTotal === undefined\n ? []\n : [{ label: s.label, value: format.value(s.rangeTotal), color: chartColor(s.color) }],\n );\n const withRangeTotals = options.series.some(s => s.rangeTotal !== undefined);\n\n const layout = {\n ...heading,\n actions: hasDrilldownAction(widget, view, onDrilldown) ? (\n <DrilldownAction widget={widget} view={view} onDrilldown={onDrilldown} />\n ) : undefined,\n total: withRangeTotals ? rangeTotals : undefined,\n isLoading,\n toolbar: lines.length > 0 && (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={lines} />\n </MetricsCard.Toolbar>\n ),\n };\n\n const failed = sent.filter(r => r.isError);\n if (failed.length) {\n return (\n <ChartCard {...layout}>\n {hasTraceQueries ? (\n <ChartCardError error={failed[0]?.error} onRetry={() => failed.forEach(r => void r.refetch())} />\n ) : (\n <ChartCardError />\n )}\n </ChartCard>\n );\n }\n\n const totalFormat = FORMATTERS[options.total?.format ?? options.format];\n const total =\n options.total &&\n (typeof options.total.value === 'object' && 'peak' in options.total.value && !shaped.total\n ? '—'\n : totalFormat.value(shaped.total ?? 0));\n\n const chart = {\n data: shaped.data,\n series: lines,\n height: 'fill' as const,\n xLabels: options.xLabels,\n showLegend: false,\n valueFormatter: format.value,\n axisFormatter: options.axis === false ? undefined : format.axis,\n onBucketClick:\n onClick &&\n ((row: Record<string, unknown>) => onClick({ window: bucketWindow(Number(row.ts), shaped.stepHours) })),\n isLoading,\n ...(options.xLabels ? EDGE_BUCKET_AXIS : BUCKET_AXIS),\n };\n const yDomain = shaped.flat && options.flatYDomain ? options.flatYDomain : options.yDomain;\n\n return (\n <ChartCard {...layout} total={layout.total ?? total} isUpdating={sent.some(r => r.isRefetching)}>\n <ChartArea isEmpty={!isLoading && shaped.empty} emptyMessage={options.emptyMessage}>\n {options.chart === 'stackedBar' ? (\n <MetricsStackedBarChart {...chart} />\n ) : (\n <MetricsLineChart {...chart} yDomain={yDomain} lineStyle=\"thin\" />\n )}\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":"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"}
|
|
@@ -16,9 +16,16 @@ var viewValue = (label, index) => {
|
|
|
16
16
|
var viewLabel = (label, index) => label?.trim() || `View ${index + 1}`;
|
|
17
17
|
/**
|
|
18
18
|
* The card title for the open view: the widget's title for a single view; with several, the open
|
|
19
|
-
* view's label, as a menu of every view (as the metrics cards switch views).
|
|
19
|
+
* view's label, as a menu of every view (as the metrics cards switch views). With somewhere to
|
|
20
|
+
* expand to, the widget's title links there instead.
|
|
20
21
|
*/
|
|
21
|
-
function viewTitle(widget, views, index, onChoose) {
|
|
22
|
+
function viewTitle(widget, views, index, onChoose, expand) {
|
|
23
|
+
const href = expand?.href(widget);
|
|
24
|
+
if (href) return {
|
|
25
|
+
title: widget.title?.trim() ? widget.title : viewLabel(views[0]?.label, 0),
|
|
26
|
+
href,
|
|
27
|
+
LinkComponent: expand?.LinkComponent
|
|
28
|
+
};
|
|
22
29
|
if (views.length < 2) return { title: widget.title ?? "" };
|
|
23
30
|
const options = views.map((v, i) => ({
|
|
24
31
|
value: viewValue(v.label, i),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrome.cjs.js","names":[],"sources":["../../../../src/domains/dashboards/lib/chrome.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ChartCardProps } from '../../metrics/components/chart-card';\n\n/** What a widget's card shows as its title: `title`, and `titleMenu` with several views. */\nexport type ViewHeading = Pick<ChartCardProps, 'title' | 'titleMenu'>;\n\n/** Filters a gate can't apply, named as the filter bar names them. */\nconst FILTER_NAMES: Record<string, string> = {\n serviceName: 'service',\n requestId: 'request ID',\n experimentId: 'experiment',\n};\n\nexport const unsupportedMessage = (fields: string[], names: Record<string, string> = FILTER_NAMES) =>\n `Not available with a ${fields.map(f => names[f] ?? f).join(' or ')} filter.`;\n\n/** A view's value in the card's menu: its label in kebab case (`Token usage` → `token-usage`), or its position when unlabelled or blank. */\nexport const viewValue = (label: string | undefined, index: number) => {\n const trimmed = label?.trim();\n return trimmed ? trimmed.toLowerCase().replace(/\\s+/g, '-') : String(index);\n};\n\n/** A view's visible name: its label, or `View n` when unlabelled or blank, so every option has an accessible name. */\nexport const viewLabel = (label: string | undefined, index: number) => label?.trim() || `View ${index + 1}`;\n\n/**\n * The card title for the open view: the widget's title for a single view; with several, the open\n * view's label, as a menu of every view (as the metrics cards switch views).\n */\nexport function viewTitle(\n widget: DashboardWidget,\n views: readonly DashboardWidgetView[],\n index: number,\n onChoose: (index: number) => void,\n): ViewHeading {\n if (views.length < 2) return { title: widget.title ?? '' };\n const options = views.map((v, i) => ({ value: viewValue(v.label, i), label: viewLabel(v.label, i) }));\n return {\n title: options[index]?.label ?? '',\n titleMenu: {\n value: options[index]?.value ?? '',\n onValueChange: (value: string) => onChoose(options.findIndex(o => o.value === value)),\n options,\n },\n };\n}\n"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"chrome.cjs.js","names":[],"sources":["../../../../src/domains/dashboards/lib/chrome.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ChartCardProps } from '../../metrics/components/chart-card';\nimport type { DashboardExpand } from '../widget-kind';\n\n/** What a widget's card shows as its title: `title`, and `titleMenu` with several views or an expand link. */\nexport type ViewHeading = Pick<ChartCardProps, 'title' | 'titleMenu' | 'href' | 'LinkComponent'>;\n\n/** Filters a gate can't apply, named as the filter bar names them. */\nconst FILTER_NAMES: Record<string, string> = {\n serviceName: 'service',\n requestId: 'request ID',\n experimentId: 'experiment',\n};\n\nexport const unsupportedMessage = (fields: string[], names: Record<string, string> = FILTER_NAMES) =>\n `Not available with a ${fields.map(f => names[f] ?? f).join(' or ')} filter.`;\n\n/** A view's value in the card's menu: its label in kebab case (`Token usage` → `token-usage`), or its position when unlabelled or blank. */\nexport const viewValue = (label: string | undefined, index: number) => {\n const trimmed = label?.trim();\n return trimmed ? trimmed.toLowerCase().replace(/\\s+/g, '-') : String(index);\n};\n\n/** A view's visible name: its label, or `View n` when unlabelled or blank, so every option has an accessible name. */\nexport const viewLabel = (label: string | undefined, index: number) => label?.trim() || `View ${index + 1}`;\n\n/**\n * The card title for the open view: the widget's title for a single view; with several, the open\n * view's label, as a menu of every view (as the metrics cards switch views). With somewhere to\n * expand to, the widget's title links there instead.\n */\nexport function viewTitle(\n widget: DashboardWidget,\n views: readonly DashboardWidgetView[],\n index: number,\n onChoose: (index: number) => void,\n expand?: DashboardExpand,\n): ViewHeading {\n const href = expand?.href(widget);\n if (href) {\n // A link needs a name: a blank title falls back to the first view's label.\n const title = widget.title?.trim() ? widget.title : viewLabel(views[0]?.label, 0);\n return { title, href, LinkComponent: expand?.LinkComponent };\n }\n if (views.length < 2) return { title: widget.title ?? '' };\n const options = views.map((v, i) => ({ value: viewValue(v.label, i), label: viewLabel(v.label, i) }));\n return {\n title: options[index]?.label ?? '',\n titleMenu: {\n value: options[index]?.value ?? '',\n onValueChange: (value: string) => onChoose(options.findIndex(o => o.value === value)),\n options,\n },\n };\n}\n"],"mappings":";;;AAQA,IAAM,eAAuC;CAC3C,aAAa;CACb,WAAW;CACX,cAAc;AAChB;AAEA,IAAa,sBAAsB,QAAkB,QAAgC,iBACnF,wBAAwB,OAAO,KAAI,MAAK,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;;AAGtE,IAAa,aAAa,OAA2B,UAAkB;CACrE,MAAM,UAAU,OAAO,KAAK;CAC5B,OAAO,UAAU,QAAQ,YAAY,CAAC,CAAC,QAAQ,QAAQ,GAAG,IAAI,OAAO,KAAK;AAC5E;;AAGA,IAAa,aAAa,OAA2B,UAAkB,OAAO,KAAK,KAAK,QAAQ,QAAQ;;;;;;AAOxG,SAAgB,UACd,QACA,OACA,OACA,UACA,QACa;CACb,MAAM,OAAO,QAAQ,KAAK,MAAM;CAChC,IAAI,MAGF,OAAO;EAAE,OADK,OAAO,OAAO,KAAK,IAAI,OAAO,QAAQ,UAAU,MAAM,EAAE,EAAE,OAAO,CAAC;EAChE;EAAM,eAAe,QAAQ;CAAc;CAE7D,IAAI,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,OAAO,SAAS,GAAG;CACzD,MAAM,UAAU,MAAM,KAAK,GAAG,OAAO;EAAE,OAAO,UAAU,EAAE,OAAO,CAAC;EAAG,OAAO,UAAU,EAAE,OAAO,CAAC;CAAE,EAAE;CACpG,OAAO;EACL,OAAO,QAAQ,MAAM,EAAE,SAAS;EAChC,WAAW;GACT,OAAO,QAAQ,MAAM,EAAE,SAAS;GAChC,gBAAgB,UAAkB,SAAS,QAAQ,WAAU,MAAK,EAAE,UAAU,KAAK,CAAC;GACpF;EACF;CACF;AACF"}
|
|
@@ -15,9 +15,16 @@ var viewValue = (label, index) => {
|
|
|
15
15
|
var viewLabel = (label, index) => label?.trim() || `View ${index + 1}`;
|
|
16
16
|
/**
|
|
17
17
|
* The card title for the open view: the widget's title for a single view; with several, the open
|
|
18
|
-
* view's label, as a menu of every view (as the metrics cards switch views).
|
|
18
|
+
* view's label, as a menu of every view (as the metrics cards switch views). With somewhere to
|
|
19
|
+
* expand to, the widget's title links there instead.
|
|
19
20
|
*/
|
|
20
|
-
function viewTitle(widget, views, index, onChoose) {
|
|
21
|
+
function viewTitle(widget, views, index, onChoose, expand) {
|
|
22
|
+
const href = expand?.href(widget);
|
|
23
|
+
if (href) return {
|
|
24
|
+
title: widget.title?.trim() ? widget.title : viewLabel(views[0]?.label, 0),
|
|
25
|
+
href,
|
|
26
|
+
LinkComponent: expand?.LinkComponent
|
|
27
|
+
};
|
|
21
28
|
if (views.length < 2) return { title: widget.title ?? "" };
|
|
22
29
|
const options = views.map((v, i) => ({
|
|
23
30
|
value: viewValue(v.label, i),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrome.es.js","names":[],"sources":["../../../../src/domains/dashboards/lib/chrome.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ChartCardProps } from '../../metrics/components/chart-card';\n\n/** What a widget's card shows as its title: `title`, and `titleMenu` with several views. */\nexport type ViewHeading = Pick<ChartCardProps, 'title' | 'titleMenu'>;\n\n/** Filters a gate can't apply, named as the filter bar names them. */\nconst FILTER_NAMES: Record<string, string> = {\n serviceName: 'service',\n requestId: 'request ID',\n experimentId: 'experiment',\n};\n\nexport const unsupportedMessage = (fields: string[], names: Record<string, string> = FILTER_NAMES) =>\n `Not available with a ${fields.map(f => names[f] ?? f).join(' or ')} filter.`;\n\n/** A view's value in the card's menu: its label in kebab case (`Token usage` → `token-usage`), or its position when unlabelled or blank. */\nexport const viewValue = (label: string | undefined, index: number) => {\n const trimmed = label?.trim();\n return trimmed ? trimmed.toLowerCase().replace(/\\s+/g, '-') : String(index);\n};\n\n/** A view's visible name: its label, or `View n` when unlabelled or blank, so every option has an accessible name. */\nexport const viewLabel = (label: string | undefined, index: number) => label?.trim() || `View ${index + 1}`;\n\n/**\n * The card title for the open view: the widget's title for a single view; with several, the open\n * view's label, as a menu of every view (as the metrics cards switch views).\n */\nexport function viewTitle(\n widget: DashboardWidget,\n views: readonly DashboardWidgetView[],\n index: number,\n onChoose: (index: number) => void,\n): ViewHeading {\n if (views.length < 2) return { title: widget.title ?? '' };\n const options = views.map((v, i) => ({ value: viewValue(v.label, i), label: viewLabel(v.label, i) }));\n return {\n title: options[index]?.label ?? '',\n titleMenu: {\n value: options[index]?.value ?? '',\n onValueChange: (value: string) => onChoose(options.findIndex(o => o.value === value)),\n options,\n },\n };\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"chrome.es.js","names":[],"sources":["../../../../src/domains/dashboards/lib/chrome.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ChartCardProps } from '../../metrics/components/chart-card';\nimport type { DashboardExpand } from '../widget-kind';\n\n/** What a widget's card shows as its title: `title`, and `titleMenu` with several views or an expand link. */\nexport type ViewHeading = Pick<ChartCardProps, 'title' | 'titleMenu' | 'href' | 'LinkComponent'>;\n\n/** Filters a gate can't apply, named as the filter bar names them. */\nconst FILTER_NAMES: Record<string, string> = {\n serviceName: 'service',\n requestId: 'request ID',\n experimentId: 'experiment',\n};\n\nexport const unsupportedMessage = (fields: string[], names: Record<string, string> = FILTER_NAMES) =>\n `Not available with a ${fields.map(f => names[f] ?? f).join(' or ')} filter.`;\n\n/** A view's value in the card's menu: its label in kebab case (`Token usage` → `token-usage`), or its position when unlabelled or blank. */\nexport const viewValue = (label: string | undefined, index: number) => {\n const trimmed = label?.trim();\n return trimmed ? trimmed.toLowerCase().replace(/\\s+/g, '-') : String(index);\n};\n\n/** A view's visible name: its label, or `View n` when unlabelled or blank, so every option has an accessible name. */\nexport const viewLabel = (label: string | undefined, index: number) => label?.trim() || `View ${index + 1}`;\n\n/**\n * The card title for the open view: the widget's title for a single view; with several, the open\n * view's label, as a menu of every view (as the metrics cards switch views). With somewhere to\n * expand to, the widget's title links there instead.\n */\nexport function viewTitle(\n widget: DashboardWidget,\n views: readonly DashboardWidgetView[],\n index: number,\n onChoose: (index: number) => void,\n expand?: DashboardExpand,\n): ViewHeading {\n const href = expand?.href(widget);\n if (href) {\n // A link needs a name: a blank title falls back to the first view's label.\n const title = widget.title?.trim() ? widget.title : viewLabel(views[0]?.label, 0);\n return { title, href, LinkComponent: expand?.LinkComponent };\n }\n if (views.length < 2) return { title: widget.title ?? '' };\n const options = views.map((v, i) => ({ value: viewValue(v.label, i), label: viewLabel(v.label, i) }));\n return {\n title: options[index]?.label ?? '',\n titleMenu: {\n value: options[index]?.value ?? '',\n onValueChange: (value: string) => onChoose(options.findIndex(o => o.value === value)),\n options,\n },\n };\n}\n"],"mappings":";;AAQA,IAAM,eAAuC;CAC3C,aAAa;CACb,WAAW;CACX,cAAc;AAChB;AAEA,IAAa,sBAAsB,QAAkB,QAAgC,iBACnF,wBAAwB,OAAO,KAAI,MAAK,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;;AAGtE,IAAa,aAAa,OAA2B,UAAkB;CACrE,MAAM,UAAU,OAAO,KAAK;CAC5B,OAAO,UAAU,QAAQ,YAAY,CAAC,CAAC,QAAQ,QAAQ,GAAG,IAAI,OAAO,KAAK;AAC5E;;AAGA,IAAa,aAAa,OAA2B,UAAkB,OAAO,KAAK,KAAK,QAAQ,QAAQ;;;;;;AAOxG,SAAgB,UACd,QACA,OACA,OACA,UACA,QACa;CACb,MAAM,OAAO,QAAQ,KAAK,MAAM;CAChC,IAAI,MAGF,OAAO;EAAE,OADK,OAAO,OAAO,KAAK,IAAI,OAAO,QAAQ,UAAU,MAAM,EAAE,EAAE,OAAO,CAAC;EAChE;EAAM,eAAe,QAAQ;CAAc;CAE7D,IAAI,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,OAAO,SAAS,GAAG;CACzD,MAAM,UAAU,MAAM,KAAK,GAAG,OAAO;EAAE,OAAO,UAAU,EAAE,OAAO,CAAC;EAAG,OAAO,UAAU,EAAE,OAAO,CAAC;CAAE,EAAE;CACpG,OAAO;EACL,OAAO,QAAQ,MAAM,EAAE,SAAS;EAChC,WAAW;GACT,OAAO,QAAQ,MAAM,EAAE,SAAS;GAChC,gBAAgB,UAAkB,SAAS,QAAQ,WAAU,MAAK,EAAE,UAAU,KAAK,CAAC;GACpF;EACF;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget-kind.cjs.js","names":[],"sources":["../../../src/domains/dashboards/widget-kind.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ComponentType } from 'react';\nimport type { z } from 'zod/v4';\nimport type { DashboardScope, OnDashboardDrilldown } from './lib/definition';\n\n/** A view whose options passed its kind's schema. */\nexport type ResolvedView<Options> = DashboardWidgetView & { options: Options };\n\nexport type WidgetKindProps<Options> = {\n widget: DashboardWidget;\n /** The views at the page's scope, options parsed. Never empty. */\n views: [ResolvedView<Options>, ...ResolvedView<Options>[]];\n scope: DashboardScope;\n onDrilldown?: OnDashboardDrilldown;\n};\n\n/**\n * One kind of widget, self-contained: the renderer only looks it up by name, checks each view's\n * options against `optionsSchema`, and renders `component`.\n */\nexport type WidgetKind<Options = unknown> = {\n kind: string;\n /** Each view's `options`, parsed before the widget renders. */\n optionsSchema: z.ZodType<Options>;\n /** Further problems with a view, e.g. options naming a query the view doesn't have. */\n issues?: (view: ResolvedView<Options>) => string[];\n component: ComponentType<WidgetKindProps<Options>>;\n};\n\n/** Keeps a kind's options type while it joins a list of kinds of different options. */\nexport const defineWidgetKind = <Options>(kind: WidgetKind<Options>): WidgetKind<Options> => kind;\n\n/** A registry entry, whatever its options. */\nexport type AnyWidgetKind = WidgetKind<any>;\n"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"widget-kind.cjs.js","names":[],"sources":["../../../src/domains/dashboards/widget-kind.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ComponentType } from 'react';\nimport type { z } from 'zod/v4';\nimport type { ChartCardProps } from '../metrics/components/chart-card';\nimport type { DashboardScope, OnDashboardDrilldown } from './lib/definition';\n\n/** A view whose options passed its kind's schema. */\nexport type ResolvedView<Options> = DashboardWidgetView & { options: Options };\n\nexport type WidgetKindProps<Options> = {\n widget: DashboardWidget;\n /** The views at the page's scope, options parsed. Never empty. */\n views: [ResolvedView<Options>, ...ResolvedView<Options>[]];\n scope: DashboardScope;\n onDrilldown?: OnDashboardDrilldown;\n /** Where a chart card expands to; see `DashboardExpand`. */\n expand?: DashboardExpand;\n};\n\n/**\n * Where a chart widget expands to (a host's query page), as the Gateway Overview's cards do: the card\n * shows its title with an expand icon linking there, in place of its views menu, on its first view.\n * `href` returns `undefined` for a widget with nowhere to go; that card keeps its menu.\n */\nexport type DashboardExpand = {\n href: (widget: DashboardWidget) => string | undefined;\n LinkComponent: NonNullable<ChartCardProps['LinkComponent']>;\n};\n\n/**\n * One kind of widget, self-contained: the renderer only looks it up by name, checks each view's\n * options against `optionsSchema`, and renders `component`.\n */\nexport type WidgetKind<Options = unknown> = {\n kind: string;\n /** Each view's `options`, parsed before the widget renders. */\n optionsSchema: z.ZodType<Options>;\n /** Further problems with a view, e.g. options naming a query the view doesn't have. */\n issues?: (view: ResolvedView<Options>) => string[];\n component: ComponentType<WidgetKindProps<Options>>;\n};\n\n/** Keeps a kind's options type while it joins a list of kinds of different options. */\nexport const defineWidgetKind = <Options>(kind: WidgetKind<Options>): WidgetKind<Options> => kind;\n\n/** A registry entry, whatever its options. */\nexport type AnyWidgetKind = WidgetKind<any>;\n"],"mappings":";;;AA2CA,IAAa,oBAA6B,SAAmD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget-kind.es.js","names":[],"sources":["../../../src/domains/dashboards/widget-kind.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ComponentType } from 'react';\nimport type { z } from 'zod/v4';\nimport type { DashboardScope, OnDashboardDrilldown } from './lib/definition';\n\n/** A view whose options passed its kind's schema. */\nexport type ResolvedView<Options> = DashboardWidgetView & { options: Options };\n\nexport type WidgetKindProps<Options> = {\n widget: DashboardWidget;\n /** The views at the page's scope, options parsed. Never empty. */\n views: [ResolvedView<Options>, ...ResolvedView<Options>[]];\n scope: DashboardScope;\n onDrilldown?: OnDashboardDrilldown;\n};\n\n/**\n * One kind of widget, self-contained: the renderer only looks it up by name, checks each view's\n * options against `optionsSchema`, and renders `component`.\n */\nexport type WidgetKind<Options = unknown> = {\n kind: string;\n /** Each view's `options`, parsed before the widget renders. */\n optionsSchema: z.ZodType<Options>;\n /** Further problems with a view, e.g. options naming a query the view doesn't have. */\n issues?: (view: ResolvedView<Options>) => string[];\n component: ComponentType<WidgetKindProps<Options>>;\n};\n\n/** Keeps a kind's options type while it joins a list of kinds of different options. */\nexport const defineWidgetKind = <Options>(kind: WidgetKind<Options>): WidgetKind<Options> => kind;\n\n/** A registry entry, whatever its options. */\nexport type AnyWidgetKind = WidgetKind<any>;\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"widget-kind.es.js","names":[],"sources":["../../../src/domains/dashboards/widget-kind.ts"],"sourcesContent":["import type { DashboardWidget, DashboardWidgetView } from '@mastra/client-js';\nimport type { ComponentType } from 'react';\nimport type { z } from 'zod/v4';\nimport type { ChartCardProps } from '../metrics/components/chart-card';\nimport type { DashboardScope, OnDashboardDrilldown } from './lib/definition';\n\n/** A view whose options passed its kind's schema. */\nexport type ResolvedView<Options> = DashboardWidgetView & { options: Options };\n\nexport type WidgetKindProps<Options> = {\n widget: DashboardWidget;\n /** The views at the page's scope, options parsed. Never empty. */\n views: [ResolvedView<Options>, ...ResolvedView<Options>[]];\n scope: DashboardScope;\n onDrilldown?: OnDashboardDrilldown;\n /** Where a chart card expands to; see `DashboardExpand`. */\n expand?: DashboardExpand;\n};\n\n/**\n * Where a chart widget expands to (a host's query page), as the Gateway Overview's cards do: the card\n * shows its title with an expand icon linking there, in place of its views menu, on its first view.\n * `href` returns `undefined` for a widget with nowhere to go; that card keeps its menu.\n */\nexport type DashboardExpand = {\n href: (widget: DashboardWidget) => string | undefined;\n LinkComponent: NonNullable<ChartCardProps['LinkComponent']>;\n};\n\n/**\n * One kind of widget, self-contained: the renderer only looks it up by name, checks each view's\n * options against `optionsSchema`, and renders `component`.\n */\nexport type WidgetKind<Options = unknown> = {\n kind: string;\n /** Each view's `options`, parsed before the widget renders. */\n optionsSchema: z.ZodType<Options>;\n /** Further problems with a view, e.g. options naming a query the view doesn't have. */\n issues?: (view: ResolvedView<Options>) => string[];\n component: ComponentType<WidgetKindProps<Options>>;\n};\n\n/** Keeps a kind's options type while it joins a list of kinds of different options. */\nexport const defineWidgetKind = <Options>(kind: WidgetKind<Options>): WidgetKind<Options> => kind;\n\n/** A registry entry, whatever its options. */\nexport type AnyWidgetKind = WidgetKind<any>;\n"],"mappings":";;AA2CA,IAAa,oBAA6B,SAAmD"}
|
|
@@ -2,14 +2,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_domains_metrics_lib_chart_format = require("../lib/chart-format.cjs.js");
|
|
3
3
|
const require_domains_metrics_hooks_use_metrics_filters = require("../hooks/use-metrics-filters.cjs.js");
|
|
4
4
|
const require_domains_metrics_lib_metrics_buckets = require("../lib/metrics-buckets.cjs.js");
|
|
5
|
-
const require_MetricsCard = require("../../../MetricsCard-
|
|
5
|
+
const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
|
|
6
6
|
const require_domains_metrics_components_chart_area = require("./chart-area.cjs.js");
|
|
7
7
|
const require_domains_metrics_components_chart_card = require("./chart-card.cjs.js");
|
|
8
8
|
const require_domains_metrics_components_chart_card_error = require("./chart-card-error.cjs.js");
|
|
9
9
|
const require_domains_metrics_lib_chart_axis = require("../lib/chart-axis.cjs.js");
|
|
10
10
|
const require_domains_metrics_lib_chart_colors = require("../lib/chart-colors.cjs.js");
|
|
11
|
-
const require_MetricsLineChart = require("../../../MetricsLineChart-
|
|
12
|
-
const require_MetricsStackedBarChart = require("../../../MetricsStackedBarChart-
|
|
11
|
+
const require_MetricsLineChart = require("../../../MetricsLineChart-tZxsauau.cjs");
|
|
12
|
+
const require_MetricsStackedBarChart = require("../../../MetricsStackedBarChart-CDLE76IB.cjs");
|
|
13
13
|
const require_domains_metrics_hooks_use_metrics_activity = require("../hooks/use-metrics-activity.cjs.js");
|
|
14
14
|
const require_domains_metrics_components_failure_rate_card = require("./failure-rate-card.cjs.js");
|
|
15
15
|
let react = require("react");
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { formatCount } from "../lib/chart-format.es.js";
|
|
2
2
|
import { useMetricsFilters } from "../hooks/use-metrics-filters.es.js";
|
|
3
3
|
import { bucketPlan, bucketWindow } from "../lib/metrics-buckets.es.js";
|
|
4
|
-
import { t as MetricsCard } from "../../../MetricsCard-
|
|
4
|
+
import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
|
|
5
5
|
import { ChartArea } from "./chart-area.es.js";
|
|
6
6
|
import { ChartCard } from "./chart-card.es.js";
|
|
7
7
|
import { ChartCardError } from "./chart-card-error.es.js";
|
|
8
8
|
import { EDGE_BUCKET_AXIS } from "../lib/chart-axis.es.js";
|
|
9
9
|
import { CHART_COLORS } from "../lib/chart-colors.es.js";
|
|
10
|
-
import { r as MetricsLineChartLegend } from "../../../MetricsLineChart-
|
|
11
|
-
import { t as MetricsStackedBarChart } from "../../../MetricsStackedBarChart-
|
|
10
|
+
import { r as MetricsLineChartLegend } from "../../../MetricsLineChart-4SwxBbQx.js";
|
|
11
|
+
import { t as MetricsStackedBarChart } from "../../../MetricsStackedBarChart-D2QyS4-z.js";
|
|
12
12
|
import { useMetricsActivity } from "../hooks/use-metrics-activity.es.js";
|
|
13
13
|
import { FailureRateCard } from "./failure-rate-card.es.js";
|
|
14
14
|
import { useState } from "react";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_MetricsCard = require("../../../../MetricsCard-
|
|
2
|
+
const require_MetricsCard = require("../../../../MetricsCard-BEwiS7Pe.cjs");
|
|
3
3
|
const require_domains_metrics_lib_breakdown = require("../../lib/breakdown.cjs.js");
|
|
4
4
|
const require_domains_metrics_components_breakdown_breakdown_frame = require("./breakdown-frame.cjs.js");
|
|
5
5
|
const require_domains_metrics_components_breakdown_breakdown_entity_tab = require("./breakdown-entity-tab.cjs.js");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as MetricsCard } from "../../../../MetricsCard-
|
|
1
|
+
import { t as MetricsCard } from "../../../../MetricsCard-ua6C6b8a.js";
|
|
2
2
|
import { isEntityTab } from "../../lib/breakdown.es.js";
|
|
3
3
|
import { BreakdownFrame } from "./breakdown-frame.es.js";
|
|
4
4
|
import { BreakdownEntityTab } from "./breakdown-entity-tab.es.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_domains_metrics_hooks_use_metrics_span_aggregate = require("../hooks/use-metrics-span-aggregate.cjs.js");
|
|
3
3
|
const require_domains_metrics_hooks_use_metrics_trace_aggregate = require("../hooks/use-metrics-trace-aggregate.cjs.js");
|
|
4
|
-
const require_MetricsCard = require("../../../MetricsCard-
|
|
4
|
+
const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
|
|
5
5
|
const require_domains_metrics_components_chart_card = require("./chart-card.cjs.js");
|
|
6
6
|
const require_domains_metrics_hooks_use_metrics_scope = require("../hooks/use-metrics-scope.cjs.js");
|
|
7
7
|
const require_domains_metrics_components_breakdown_breakdown_frame = require("./breakdown/breakdown-frame.cjs.js");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useSpanAggregateGate } from "../hooks/use-metrics-span-aggregate.es.js";
|
|
2
2
|
import { useTraceAggregateGate } from "../hooks/use-metrics-trace-aggregate.es.js";
|
|
3
|
-
import { t as MetricsCard } from "../../../MetricsCard-
|
|
3
|
+
import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
|
|
4
4
|
import { ChartCard } from "./chart-card.es.js";
|
|
5
5
|
import { useMetricsScope } from "../hooks/use-metrics-scope.es.js";
|
|
6
6
|
import { BREAKDOWN_TITLE } from "./breakdown/breakdown-frame.es.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_MetricsCard = require("../../../MetricsCard-
|
|
2
|
+
const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
|
|
3
3
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
4
|
// src/domains/metrics/components/chart-area.tsx
|
|
5
5
|
/** A card's chart or list, filling the card body; an empty range shows a message over it. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as MetricsCard } from "../../../MetricsCard-
|
|
1
|
+
import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
// src/domains/metrics/components/chart-area.tsx
|
|
4
4
|
/** A card's chart or list, filling the card body; an empty range shows a message over it. */
|
|
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_Button = require("../../../Button-DLcMcuUL.cjs");
|
|
3
3
|
const require_domains_auth_components_permission_denied = require("../../auth/components/permission-denied.cjs.js");
|
|
4
4
|
const require_domains_auth_components_session_expired = require("../../auth/components/session-expired.cjs.js");
|
|
5
|
-
const require_MetricsCard = require("../../../MetricsCard-
|
|
5
|
+
const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
|
|
6
6
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
7
|
let _mastra_react_hooks_query = require("@mastra/react/hooks/query");
|
|
8
8
|
let lucide_react = require("lucide-react");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as Button } from "../../../Button-CLXTbAY8.js";
|
|
2
2
|
import { PermissionDenied } from "../../auth/components/permission-denied.es.js";
|
|
3
3
|
import { SessionExpired } from "../../auth/components/session-expired.es.js";
|
|
4
|
-
import { t as MetricsCard } from "../../../MetricsCard-
|
|
4
|
+
import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
import { is401UnauthorizedError, is403ForbiddenError } from "@mastra/react/hooks/query";
|
|
7
7
|
import { RotateCcwIcon } from "lucide-react";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_utils = require("../../../utils-uDc1ofX1.cjs");
|
|
3
|
-
const require_MetricsCard = require("../../../MetricsCard-
|
|
3
|
+
const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
let lucide_react = require("lucide-react");
|
|
6
6
|
// src/domains/metrics/components/chart-card.tsx
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as cn } from "../../../utils-DQx8TpNT.js";
|
|
2
|
-
import { t as MetricsCard } from "../../../MetricsCard-
|
|
2
|
+
import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { Maximize2Icon } from "lucide-react";
|
|
5
5
|
// src/domains/metrics/components/chart-card.tsx
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_domains_metrics_hooks_use_metrics = require("../hooks/use-metrics.cjs.js");
|
|
3
|
-
const require_date_time_range_picker = require("../../../date-time-range-picker-
|
|
3
|
+
const require_date_time_range_picker = require("../../../date-time-range-picker-CWGjoR3j.cjs");
|
|
4
4
|
const require_domains_metrics_metrics_date_presets = require("../metrics-date-presets.cjs.js");
|
|
5
5
|
let react = require("react");
|
|
6
6
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useMetrics } from "../hooks/use-metrics.es.js";
|
|
2
|
-
import { t as DateTimeRangePicker } from "../../../date-time-range-picker-
|
|
2
|
+
import { t as DateTimeRangePicker } from "../../../date-time-range-picker-CdSiXwB4.js";
|
|
3
3
|
import { METRICS_PICKER_PRESETS, fromPickerPreset, toPickerPreset } from "../metrics-date-presets.es.js";
|
|
4
4
|
import { useRef } from "react";
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -3,13 +3,13 @@ const require_domains_metrics_lib_chart_format = require("../../lib/chart-format
|
|
|
3
3
|
const require_domains_metrics_lib_metrics_buckets = require("../../lib/metrics-buckets.cjs.js");
|
|
4
4
|
const require_domains_metrics_lib_trace_aggregate = require("../../lib/trace-aggregate.cjs.js");
|
|
5
5
|
const require_domains_metrics_hooks_use_metrics_trace_aggregate = require("../../hooks/use-metrics-trace-aggregate.cjs.js");
|
|
6
|
-
const require_MetricsCard = require("../../../../MetricsCard-
|
|
6
|
+
const require_MetricsCard = require("../../../../MetricsCard-BEwiS7Pe.cjs");
|
|
7
7
|
const require_domains_metrics_components_chart_area = require("../chart-area.cjs.js");
|
|
8
8
|
const require_domains_metrics_components_chart_card = require("../chart-card.cjs.js");
|
|
9
9
|
const require_domains_metrics_components_chart_card_error = require("../chart-card-error.cjs.js");
|
|
10
10
|
const require_domains_metrics_lib_chart_axis = require("../../lib/chart-axis.cjs.js");
|
|
11
11
|
const require_domains_metrics_lib_chart_colors = require("../../lib/chart-colors.cjs.js");
|
|
12
|
-
const require_MetricsLineChart = require("../../../../MetricsLineChart-
|
|
12
|
+
const require_MetricsLineChart = require("../../../../MetricsLineChart-tZxsauau.cjs");
|
|
13
13
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
14
14
|
// src/domains/metrics/components/distinct-ids/distinct-ids-chart.tsx
|
|
15
15
|
/** Most apps set resource and thread ids (through memory); few set user and session ids. */
|
|
@@ -100,6 +100,7 @@ function DistinctIdsChart({ scope, onTimeRangeClick }) {
|
|
|
100
100
|
isEmpty: !isLoading && shown.length === 0,
|
|
101
101
|
emptyMessage: "No traces in this range set a resource, thread, user or session id.",
|
|
102
102
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MetricsLineChart.MetricsLineChart, {
|
|
103
|
+
lineStyle: "thin",
|
|
103
104
|
data: chart,
|
|
104
105
|
series: lines,
|
|
105
106
|
height: "fill",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distinct-ids-chart.cjs.js","names":["CHART_COLORS","useMetricsTraceAggregate","bucketTraceAggregateRows","intervalHours","formatCount","MetricsCard","MetricsLineChartLegend","ChartCard","ChartCardError","ChartArea","MetricsLineChart","formatAxisCount","bucketWindow","EDGE_BUCKET_AXIS"],"sources":["../../../../../src/domains/metrics/components/distinct-ids/distinct-ids-chart.tsx"],"sourcesContent":["import type { AggregateTracesArgs } from '@mastra/client-js';\nimport type { DrilldownScope } from '../../drilldown';\nimport { useMetricsTraceAggregate } from '../../hooks/use-metrics-trace-aggregate';\nimport type { TraceAggregateScope } from '../../hooks/use-metrics-trace-aggregate';\nimport { EDGE_BUCKET_AXIS } from '../../lib/chart-axis';\nimport { CHART_COLORS } from '../../lib/chart-colors';\nimport { formatAxisCount, formatCount } from '../../lib/chart-format';\nimport { bucketWindow, intervalHours } from '../../lib/metrics-buckets';\nimport { bucketTraceAggregateRows, TRACE_AGGREGATE_SERIES_LIMIT } from '../../lib/trace-aggregate';\nimport type { TraceAggregateRow } from '../../lib/trace-aggregate';\nimport { ChartArea } from '../chart-area';\nimport { ChartCard } from '../chart-card';\nimport { ChartCardError } from '../chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\n\n/** Most apps set resource and thread ids (through memory); few set user and session ids. */\nconst IDS = [\n { measure: 'countDistinct.resourceId', dataKey: 'resources', label: 'Resources', color: CHART_COLORS.sky },\n { measure: 'countDistinct.threadId', dataKey: 'threads', label: 'Threads', color: CHART_COLORS.green },\n { measure: 'countDistinct.userId', dataKey: 'users', label: 'Users', color: CHART_COLORS.violet },\n { measure: 'countDistinct.sessionId', dataKey: 'sessions', label: 'Sessions', color: CHART_COLORS.teal },\n] as const;\n\ntype Id = (typeof IDS)[number];\n\nconst MEASURES: AggregateTracesArgs['measures'] = IDS.map(id => id.measure);\n\nexport const DISTINCT_IDS_TITLE = 'Resources and threads';\n\nexport type DistinctIdsChartProps = {\n scope: TraceAggregateScope;\n /** Called with the time range of the clicked bucket. */\n onTimeRangeClick?: (scope: DrilldownScope) => void;\n};\n\nfunction count(row: TraceAggregateRow | undefined, id: Id) {\n return row?.measures[id.measure] ?? 0;\n}\n\n/** Distinct ids per bucket, with range totals from a second request. */\nexport function DistinctIdsChart({ scope, onTimeRangeClick }: DistinctIdsChartProps) {\n const series = useMetricsTraceAggregate({\n timeRange: scope.timeRange,\n where: scope.where,\n interval: scope.interval,\n measures: MEASURES,\n limit: TRACE_AGGREGATE_SERIES_LIMIT,\n });\n // Bucket counts can't be added up: an id active in two buckets would count twice.\n const totals = useMetricsTraceAggregate({ timeRange: scope.timeRange, where: scope.where, measures: MEASURES });\n\n const total = totals.data?.rows[0];\n // Only the ids this project sets get a line; the rest would sit flat at zero.\n const shown = IDS.filter(id => count(total, id) > 0);\n const lines: MetricsLineChartSeries[] = shown.map((id, i) => ({\n dataKey: id.dataKey,\n label: id.label,\n color: id.color,\n emphasis: i === 0,\n }));\n const chart = bucketTraceAggregateRows(series.data?.rows ?? [], scope.window).map(({ rows, ...labels }) => ({\n ...labels,\n ...Object.fromEntries(shown.map(id => [id.dataKey, count(rows[0], id)])),\n }));\n const step = intervalHours(scope.interval === '1d' ? '1d' : '1h');\n const error = series.error ?? totals.error;\n const isLoading = series.isLoading || totals.isLoading;\n\n const layout = {\n title: DISTINCT_IDS_TITLE,\n // Each id's range total, marked like its line: they count different things, so no one sum.\n total: shown.map(id => ({ label: id.label, value: formatCount(count(total, id)), color: id.color })),\n isLoading: totals.isLoading,\n toolbar: lines.length > 0 && (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={lines} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (error) {\n return (\n <ChartCard {...layout}>\n <ChartCardError\n error={error}\n onRetry={() => {\n if (series.error) void series.refetch();\n if (totals.error) void totals.refetch();\n }}\n />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard {...layout} isUpdating={series.isPlaceholderData || totals.isPlaceholderData}>\n <ChartArea\n isEmpty={!isLoading && shown.length === 0}\n emptyMessage=\"No traces in this range set a resource, thread, user or session id.\"\n >\n <MetricsLineChart\n data={chart}\n series={lines}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatCount}\n axisFormatter={formatAxisCount}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick({ window: bucketWindow(Number(row.ts), step) }))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"distinct-ids-chart.cjs.js","names":["CHART_COLORS","useMetricsTraceAggregate","bucketTraceAggregateRows","intervalHours","formatCount","MetricsCard","MetricsLineChartLegend","ChartCard","ChartCardError","ChartArea","MetricsLineChart","formatAxisCount","bucketWindow","EDGE_BUCKET_AXIS"],"sources":["../../../../../src/domains/metrics/components/distinct-ids/distinct-ids-chart.tsx"],"sourcesContent":["import type { AggregateTracesArgs } from '@mastra/client-js';\nimport type { DrilldownScope } from '../../drilldown';\nimport { useMetricsTraceAggregate } from '../../hooks/use-metrics-trace-aggregate';\nimport type { TraceAggregateScope } from '../../hooks/use-metrics-trace-aggregate';\nimport { EDGE_BUCKET_AXIS } from '../../lib/chart-axis';\nimport { CHART_COLORS } from '../../lib/chart-colors';\nimport { formatAxisCount, formatCount } from '../../lib/chart-format';\nimport { bucketWindow, intervalHours } from '../../lib/metrics-buckets';\nimport { bucketTraceAggregateRows, TRACE_AGGREGATE_SERIES_LIMIT } from '../../lib/trace-aggregate';\nimport type { TraceAggregateRow } from '../../lib/trace-aggregate';\nimport { ChartArea } from '../chart-area';\nimport { ChartCard } from '../chart-card';\nimport { ChartCardError } from '../chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\n\n/** Most apps set resource and thread ids (through memory); few set user and session ids. */\nconst IDS = [\n { measure: 'countDistinct.resourceId', dataKey: 'resources', label: 'Resources', color: CHART_COLORS.sky },\n { measure: 'countDistinct.threadId', dataKey: 'threads', label: 'Threads', color: CHART_COLORS.green },\n { measure: 'countDistinct.userId', dataKey: 'users', label: 'Users', color: CHART_COLORS.violet },\n { measure: 'countDistinct.sessionId', dataKey: 'sessions', label: 'Sessions', color: CHART_COLORS.teal },\n] as const;\n\ntype Id = (typeof IDS)[number];\n\nconst MEASURES: AggregateTracesArgs['measures'] = IDS.map(id => id.measure);\n\nexport const DISTINCT_IDS_TITLE = 'Resources and threads';\n\nexport type DistinctIdsChartProps = {\n scope: TraceAggregateScope;\n /** Called with the time range of the clicked bucket. */\n onTimeRangeClick?: (scope: DrilldownScope) => void;\n};\n\nfunction count(row: TraceAggregateRow | undefined, id: Id) {\n return row?.measures[id.measure] ?? 0;\n}\n\n/** Distinct ids per bucket, with range totals from a second request. */\nexport function DistinctIdsChart({ scope, onTimeRangeClick }: DistinctIdsChartProps) {\n const series = useMetricsTraceAggregate({\n timeRange: scope.timeRange,\n where: scope.where,\n interval: scope.interval,\n measures: MEASURES,\n limit: TRACE_AGGREGATE_SERIES_LIMIT,\n });\n // Bucket counts can't be added up: an id active in two buckets would count twice.\n const totals = useMetricsTraceAggregate({ timeRange: scope.timeRange, where: scope.where, measures: MEASURES });\n\n const total = totals.data?.rows[0];\n // Only the ids this project sets get a line; the rest would sit flat at zero.\n const shown = IDS.filter(id => count(total, id) > 0);\n const lines: MetricsLineChartSeries[] = shown.map((id, i) => ({\n dataKey: id.dataKey,\n label: id.label,\n color: id.color,\n emphasis: i === 0,\n }));\n const chart = bucketTraceAggregateRows(series.data?.rows ?? [], scope.window).map(({ rows, ...labels }) => ({\n ...labels,\n ...Object.fromEntries(shown.map(id => [id.dataKey, count(rows[0], id)])),\n }));\n const step = intervalHours(scope.interval === '1d' ? '1d' : '1h');\n const error = series.error ?? totals.error;\n const isLoading = series.isLoading || totals.isLoading;\n\n const layout = {\n title: DISTINCT_IDS_TITLE,\n // Each id's range total, marked like its line: they count different things, so no one sum.\n total: shown.map(id => ({ label: id.label, value: formatCount(count(total, id)), color: id.color })),\n isLoading: totals.isLoading,\n toolbar: lines.length > 0 && (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={lines} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (error) {\n return (\n <ChartCard {...layout}>\n <ChartCardError\n error={error}\n onRetry={() => {\n if (series.error) void series.refetch();\n if (totals.error) void totals.refetch();\n }}\n />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard {...layout} isUpdating={series.isPlaceholderData || totals.isPlaceholderData}>\n <ChartArea\n isEmpty={!isLoading && shown.length === 0}\n emptyMessage=\"No traces in this range set a resource, thread, user or session id.\"\n >\n <MetricsLineChart\n lineStyle=\"thin\"\n data={chart}\n series={lines}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatCount}\n axisFormatter={formatAxisCount}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick({ window: bucketWindow(Number(row.ts), step) }))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":"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"}
|