@dudousxd/nestjs-telescope-ui 2.0.0 → 2.0.1
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/CHANGELOG.md +748 -0
- package/README.md +31 -0
- package/dist/client/console-url.d.ts +11 -0
- package/dist/client/console-url.d.ts.map +1 -0
- package/dist/client/console-url.js +21 -0
- package/dist/client/console-url.js.map +1 -0
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/telescope-client.d.ts +64 -11
- package/dist/client/telescope-client.d.ts.map +1 -1
- package/dist/client/telescope-client.js +59 -54
- package/dist/client/telescope-client.js.map +1 -1
- package/dist/client/types.d.ts +431 -30
- package/dist/client/types.d.ts.map +1 -1
- package/dist/react/components/batch-timeline.js +2 -2
- package/dist/react/components/batch-timeline.js.map +1 -1
- package/dist/react/components/cache-badge.d.ts +14 -6
- package/dist/react/components/cache-badge.d.ts.map +1 -1
- package/dist/react/components/cache-badge.js +26 -12
- package/dist/react/components/cache-badge.js.map +1 -1
- package/dist/react/components/charts/area-chart-card.d.ts +11 -3
- package/dist/react/components/charts/area-chart-card.d.ts.map +1 -1
- package/dist/react/components/charts/area-chart-card.js +33 -6
- package/dist/react/components/charts/area-chart-card.js.map +1 -1
- package/dist/react/components/charts/bar-chart-card.d.ts +18 -7
- package/dist/react/components/charts/bar-chart-card.d.ts.map +1 -1
- package/dist/react/components/charts/bar-chart-card.js +18 -9
- package/dist/react/components/charts/bar-chart-card.js.map +1 -1
- package/dist/react/components/charts/breakdown-card.d.ts +17 -0
- package/dist/react/components/charts/breakdown-card.d.ts.map +1 -0
- package/dist/react/components/charts/breakdown-card.js +43 -0
- package/dist/react/components/charts/breakdown-card.js.map +1 -0
- package/dist/react/components/charts/chart-card.d.ts +7 -0
- package/dist/react/components/charts/chart-card.d.ts.map +1 -1
- package/dist/react/components/charts/chart-card.js +10 -3
- package/dist/react/components/charts/chart-card.js.map +1 -1
- package/dist/react/components/charts/chart-selection.d.ts +44 -0
- package/dist/react/components/charts/chart-selection.d.ts.map +1 -0
- package/dist/react/components/charts/chart-selection.js +36 -0
- package/dist/react/components/charts/chart-selection.js.map +1 -0
- package/dist/react/components/charts/chart-theme.d.ts +62 -19
- package/dist/react/components/charts/chart-theme.d.ts.map +1 -1
- package/dist/react/components/charts/chart-theme.js +72 -13
- package/dist/react/components/charts/chart-theme.js.map +1 -1
- package/dist/react/components/charts/distribution-chart-card.d.ts +17 -0
- package/dist/react/components/charts/distribution-chart-card.d.ts.map +1 -0
- package/dist/react/components/charts/distribution-chart-card.js +46 -0
- package/dist/react/components/charts/distribution-chart-card.js.map +1 -0
- package/dist/react/components/charts/gauge-card.d.ts +12 -0
- package/dist/react/components/charts/gauge-card.d.ts.map +1 -0
- package/dist/react/components/charts/gauge-card.js +17 -0
- package/dist/react/components/charts/gauge-card.js.map +1 -0
- package/dist/react/components/charts/index.d.ts +1 -0
- package/dist/react/components/charts/index.d.ts.map +1 -1
- package/dist/react/components/charts/index.js +1 -0
- package/dist/react/components/charts/index.js.map +1 -1
- package/dist/react/components/charts/stacked-area-chart-card.d.ts +17 -3
- package/dist/react/components/charts/stacked-area-chart-card.d.ts.map +1 -1
- package/dist/react/components/charts/stacked-area-chart-card.js +31 -8
- package/dist/react/components/charts/stacked-area-chart-card.js.map +1 -1
- package/dist/react/components/entries-table.d.ts.map +1 -1
- package/dist/react/components/entries-table.js +17 -3
- package/dist/react/components/entries-table.js.map +1 -1
- package/dist/react/components/entry-detail.d.ts +2 -0
- package/dist/react/components/entry-detail.d.ts.map +1 -1
- package/dist/react/components/entry-detail.js +186 -20
- package/dist/react/components/entry-detail.js.map +1 -1
- package/dist/react/components/entry-insights.d.ts.map +1 -1
- package/dist/react/components/entry-insights.js +28 -17
- package/dist/react/components/entry-insights.js.map +1 -1
- package/dist/react/components/entry-types.d.ts +29 -0
- package/dist/react/components/entry-types.d.ts.map +1 -1
- package/dist/react/components/entry-types.js +60 -0
- package/dist/react/components/entry-types.js.map +1 -1
- package/dist/react/components/export-json-toolbar.js +2 -2
- package/dist/react/components/export-json-toolbar.js.map +1 -1
- package/dist/react/components/extensions/panel-column-menu.d.ts +19 -0
- package/dist/react/components/extensions/panel-column-menu.d.ts.map +1 -0
- package/dist/react/components/extensions/panel-column-menu.js +47 -0
- package/dist/react/components/extensions/panel-column-menu.js.map +1 -0
- package/dist/react/components/extensions/panel-renderer.d.ts +46 -0
- package/dist/react/components/extensions/panel-renderer.d.ts.map +1 -0
- package/dist/react/components/extensions/panel-renderer.js +122 -0
- package/dist/react/components/extensions/panel-renderer.js.map +1 -0
- package/dist/react/components/extensions/panel-table-header.d.ts +18 -0
- package/dist/react/components/extensions/panel-table-header.d.ts.map +1 -0
- package/dist/react/components/extensions/panel-table-header.js +82 -0
- package/dist/react/components/extensions/panel-table-header.js.map +1 -0
- package/dist/react/components/extensions/panel-table.d.ts +27 -0
- package/dist/react/components/extensions/panel-table.d.ts.map +1 -0
- package/dist/react/components/extensions/panel-table.js +87 -0
- package/dist/react/components/extensions/panel-table.js.map +1 -0
- package/dist/react/components/extensions/stat-card.d.ts +18 -0
- package/dist/react/components/extensions/stat-card.d.ts.map +1 -0
- package/dist/react/components/extensions/stat-card.js +44 -0
- package/dist/react/components/extensions/stat-card.js.map +1 -0
- package/dist/react/components/extensions/table-columns.d.ts +32 -0
- package/dist/react/components/extensions/table-columns.d.ts.map +1 -0
- package/dist/react/components/extensions/table-columns.js +51 -0
- package/dist/react/components/extensions/table-columns.js.map +1 -0
- package/dist/react/components/extensions/table-features.d.ts +47 -0
- package/dist/react/components/extensions/table-features.d.ts.map +1 -0
- package/dist/react/components/extensions/table-features.js +45 -0
- package/dist/react/components/extensions/table-features.js.map +1 -0
- package/dist/react/components/extensions/table-query.d.ts +53 -0
- package/dist/react/components/extensions/table-query.d.ts.map +1 -0
- package/dist/react/components/extensions/table-query.js +51 -0
- package/dist/react/components/extensions/table-query.js.map +1 -0
- package/dist/react/components/flamegraph-view.d.ts +18 -0
- package/dist/react/components/flamegraph-view.d.ts.map +1 -0
- package/dist/react/components/flamegraph-view.js +48 -0
- package/dist/react/components/flamegraph-view.js.map +1 -0
- package/dist/react/components/flamegraph.d.ts +34 -0
- package/dist/react/components/flamegraph.d.ts.map +1 -0
- package/dist/react/components/flamegraph.js +54 -0
- package/dist/react/components/flamegraph.js.map +1 -0
- package/dist/react/components/inertia-badge.d.ts +33 -0
- package/dist/react/components/inertia-badge.d.ts.map +1 -0
- package/dist/react/components/inertia-badge.js +72 -0
- package/dist/react/components/inertia-badge.js.map +1 -0
- package/dist/react/components/inertia-body.d.ts +11 -0
- package/dist/react/components/inertia-body.d.ts.map +1 -0
- package/dist/react/components/inertia-body.js +127 -0
- package/dist/react/components/inertia-body.js.map +1 -0
- package/dist/react/components/official-event.d.ts +16 -0
- package/dist/react/components/official-event.d.ts.map +1 -0
- package/dist/react/components/official-event.js +88 -0
- package/dist/react/components/official-event.js.map +1 -0
- package/dist/react/components/pulse-panel.d.ts.map +1 -1
- package/dist/react/components/pulse-panel.js +6 -6
- package/dist/react/components/pulse-panel.js.map +1 -1
- package/dist/react/components/queues/EnqueueJobForm.d.ts.map +1 -1
- package/dist/react/components/queues/EnqueueJobForm.js +2 -1
- package/dist/react/components/queues/EnqueueJobForm.js.map +1 -1
- package/dist/react/components/queues/JobActions.d.ts.map +1 -1
- package/dist/react/components/queues/JobActions.js +11 -9
- package/dist/react/components/queues/JobActions.js.map +1 -1
- package/dist/react/components/queues/JobDetailDrawer.d.ts.map +1 -1
- package/dist/react/components/queues/JobDetailDrawer.js +8 -13
- package/dist/react/components/queues/JobDetailDrawer.js.map +1 -1
- package/dist/react/components/queues/JobTable.d.ts.map +1 -1
- package/dist/react/components/queues/JobTable.js +0 -0
- package/dist/react/components/queues/JobTable.js.map +1 -1
- package/dist/react/components/queues/QueueList.d.ts.map +1 -1
- package/dist/react/components/queues/QueueList.js +6 -6
- package/dist/react/components/queues/QueueList.js.map +1 -1
- package/dist/react/components/queues/QueueStateTabs.d.ts.map +1 -1
- package/dist/react/components/queues/QueueStateTabs.js +9 -7
- package/dist/react/components/queues/QueueStateTabs.js.map +1 -1
- package/dist/react/components/queues/queue-format.d.ts +5 -1
- package/dist/react/components/queues/queue-format.d.ts.map +1 -1
- package/dist/react/components/queues/queue-format.js +11 -7
- package/dist/react/components/queues/queue-format.js.map +1 -1
- package/dist/react/components/queues-panel.js +1 -1
- package/dist/react/components/queues-panel.js.map +1 -1
- package/dist/react/components/request-timeline.d.ts.map +1 -1
- package/dist/react/components/request-timeline.js +2 -2
- package/dist/react/components/request-timeline.js.map +1 -1
- package/dist/react/components/retention-indicator.d.ts.map +1 -1
- package/dist/react/components/retention-indicator.js +1 -1
- package/dist/react/components/retention-indicator.js.map +1 -1
- package/dist/react/components/sparkline.d.ts.map +1 -1
- package/dist/react/components/sparkline.js +1 -1
- package/dist/react/components/sparkline.js.map +1 -1
- package/dist/react/components/tag-autocomplete.d.ts +21 -4
- package/dist/react/components/tag-autocomplete.d.ts.map +1 -1
- package/dist/react/components/tag-autocomplete.js +57 -29
- package/dist/react/components/tag-autocomplete.js.map +1 -1
- package/dist/react/components/to-csv.d.ts +25 -0
- package/dist/react/components/to-csv.d.ts.map +1 -0
- package/dist/react/components/to-csv.js +78 -0
- package/dist/react/components/to-csv.js.map +1 -0
- package/dist/react/components/user-tag.d.ts +15 -0
- package/dist/react/components/user-tag.d.ts.map +1 -1
- package/dist/react/components/user-tag.js +19 -0
- package/dist/react/components/user-tag.js.map +1 -1
- package/dist/react/components/waterfall-view.d.ts +13 -0
- package/dist/react/components/waterfall-view.d.ts.map +1 -0
- package/dist/react/components/waterfall-view.js +58 -0
- package/dist/react/components/waterfall-view.js.map +1 -0
- package/dist/react/components/window-select.d.ts.map +1 -1
- package/dist/react/components/window-select.js +6 -2
- package/dist/react/components/window-select.js.map +1 -1
- package/dist/react/index.d.ts +7 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +11 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/ui/badge.d.ts +16 -0
- package/dist/react/ui/badge.d.ts.map +1 -0
- package/dist/react/ui/badge.js +28 -0
- package/dist/react/ui/badge.js.map +1 -0
- package/dist/react/ui/button.d.ts +17 -0
- package/dist/react/ui/button.d.ts.map +1 -0
- package/dist/react/ui/button.js +35 -0
- package/dist/react/ui/button.js.map +1 -0
- package/dist/react/ui/chart.d.ts +116 -0
- package/dist/react/ui/chart.d.ts.map +1 -0
- package/dist/react/ui/chart.js +191 -0
- package/dist/react/ui/chart.js.map +1 -0
- package/dist/react/ui/cn.d.ts +8 -0
- package/dist/react/ui/cn.d.ts.map +1 -0
- package/dist/react/ui/cn.js +11 -0
- package/dist/react/ui/cn.js.map +1 -0
- package/dist/react/ui/dialog.d.ts +26 -0
- package/dist/react/ui/dialog.d.ts.map +1 -0
- package/dist/react/ui/dialog.js +40 -0
- package/dist/react/ui/dialog.js.map +1 -0
- package/dist/react/ui/index.d.ts +24 -0
- package/dist/react/ui/index.d.ts.map +1 -0
- package/dist/react/ui/index.js +24 -0
- package/dist/react/ui/index.js.map +1 -0
- package/dist/react/ui/input.d.ts +3 -0
- package/dist/react/ui/input.d.ts.map +1 -0
- package/dist/react/ui/input.js +8 -0
- package/dist/react/ui/input.js.map +1 -0
- package/dist/react/ui/select.d.ts +20 -0
- package/dist/react/ui/select.d.ts.map +1 -0
- package/dist/react/ui/select.js +27 -0
- package/dist/react/ui/select.js.map +1 -0
- package/dist/react/ui/table.d.ts +27 -0
- package/dist/react/ui/table.d.ts.map +1 -0
- package/dist/react/ui/table.js +22 -0
- package/dist/react/ui/table.js.map +1 -0
- package/dist/react/ui/tabs.d.ts +12 -0
- package/dist/react/ui/tabs.d.ts.map +1 -0
- package/dist/react/ui/tabs.js +20 -0
- package/dist/react/ui/tabs.js.map +1 -0
- package/dist/react/ui/tooltip.d.ts +10 -0
- package/dist/react/ui/tooltip.d.ts.map +1 -0
- package/dist/react/ui/tooltip.js +12 -0
- package/dist/react/ui/tooltip.js.map +1 -0
- package/dist/react/use-telescope-queries.d.ts +129 -130
- package/dist/react/use-telescope-queries.d.ts.map +1 -1
- package/dist/react/use-telescope-queries.js +146 -1
- package/dist/react/use-telescope-queries.js.map +1 -1
- package/dist/react/use-telescope-stream.d.ts +10 -0
- package/dist/react/use-telescope-stream.d.ts.map +1 -0
- package/dist/react/use-telescope-stream.js +40 -0
- package/dist/react/use-telescope-stream.js.map +1 -0
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/telescope-ui.module.d.ts +28 -1
- package/dist/server/telescope-ui.module.d.ts.map +1 -1
- package/dist/server/telescope-ui.module.js +42 -4
- package/dist/server/telescope-ui.module.js.map +1 -1
- package/dist/server/telescope-ui.options.d.ts +47 -0
- package/dist/server/telescope-ui.options.d.ts.map +1 -1
- package/dist/server/telescope-ui.options.js.map +1 -1
- package/dist/spa/assets/index-BPSlup7m.js +159 -0
- package/dist/spa/assets/index-DmsmJrlA.css +1 -0
- package/dist/spa/index.html +2 -2
- package/package.json +75 -36
- package/skills/telescope-ui-dashboard/SKILL.md +198 -0
- package/dist/react/components/type-tabs.d.ts +0 -5
- package/dist/react/components/type-tabs.d.ts.map +0 -1
- package/dist/react/components/type-tabs.js +0 -8
- package/dist/react/components/type-tabs.js.map +0 -1
- package/dist/spa/assets/index-CCzTpxj3.css +0 -1
- package/dist/spa/assets/index-w0XTI5OM.js +0 -135
|
@@ -1,32 +1,58 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useId, useRef, useState } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
import { Input } from '../ui/index.js';
|
|
4
|
+
import { useTagsInfinite } from '../use-telescope-queries.js';
|
|
5
|
+
/** How long typing settles before it becomes a request. Long enough that a word costs one query,
|
|
6
|
+
* short enough that the list feels attached to the keyboard. */
|
|
7
|
+
const SEARCH_DEBOUNCE_MS = 200;
|
|
8
|
+
/** How close to the bottom of the list a scroll gets before the next page is asked for. */
|
|
9
|
+
const LOAD_MORE_MARGIN_PX = 48;
|
|
10
|
+
/** Settles a value that changes on every keystroke into one that changes once typing stops. */
|
|
11
|
+
function useDebounced(value, ms) {
|
|
12
|
+
const [settled, setSettled] = useState(value);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const timer = setTimeout(() => setSettled(value), ms);
|
|
15
|
+
return () => clearTimeout(timer);
|
|
16
|
+
}, [value, ms]);
|
|
17
|
+
return settled;
|
|
14
18
|
}
|
|
15
19
|
/**
|
|
16
|
-
* Tag filter rendered as an accessible combobox:
|
|
17
|
-
*
|
|
18
|
-
*
|
|
20
|
+
* Tag filter rendered as an accessible combobox: it lists the tags that exist, most-used first, with
|
|
21
|
+
* their entry counts. Selecting one applies it as the active `tag` filter; typing something the list
|
|
22
|
+
* does not offer still applies as typed, which a bounded list has to allow.
|
|
23
|
+
*
|
|
24
|
+
* Focus alone opens it — an operator should not have to guess a first character to discover what is
|
|
25
|
+
* there. Both the search and the paging happen on the SERVER: the list is bounded because tag
|
|
26
|
+
* cardinality grows with the data, so the values worth searching for are routinely the ones the
|
|
27
|
+
* bound cut, and a search over the fetched page could never find them.
|
|
19
28
|
*/
|
|
20
|
-
export function TagAutocomplete({ onSelect }) {
|
|
29
|
+
export function TagAutocomplete({ onSelect, prefix = '', placeholder = 'Filter by tag…', ariaLabel = 'Filter by tag', }) {
|
|
21
30
|
const [input, setInput] = useState('');
|
|
22
31
|
const [open, setOpen] = useState(false);
|
|
23
32
|
const [highlight, setHighlight] = useState(0);
|
|
24
33
|
const containerRef = useRef(null);
|
|
25
34
|
const listboxId = useId();
|
|
26
35
|
const trimmed = input.trim();
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
// The full tag the user is narrowing to — `user:` + `42` etc. The input shows only the stripped
|
|
37
|
+
// portion (the id), while the query works against the real, prefixed namespace so counts match.
|
|
38
|
+
const fullQuery = `${prefix}${trimmed}`;
|
|
39
|
+
const debouncedSearch = useDebounced(trimmed, SEARCH_DEBOUNCE_MS);
|
|
40
|
+
const tags = useTagsInfinite(prefix, debouncedSearch);
|
|
41
|
+
const suggestions = tags.data?.pages.flat() ?? [];
|
|
29
42
|
const showList = open && suggestions.length > 0;
|
|
43
|
+
const listRef = useRef(null);
|
|
44
|
+
function onListScroll() {
|
|
45
|
+
const el = listRef.current;
|
|
46
|
+
if (!el || !tags.hasNextPage || tags.isFetchingNextPage)
|
|
47
|
+
return;
|
|
48
|
+
if (el.scrollTop + el.clientHeight >= el.scrollHeight - LOAD_MORE_MARGIN_PX) {
|
|
49
|
+
void tags.fetchNextPage();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** What we show in the row / input for a tag — the prefix stripped off. */
|
|
53
|
+
function displayOf(tag) {
|
|
54
|
+
return prefix !== '' && tag.startsWith(prefix) ? tag.slice(prefix.length) : tag;
|
|
55
|
+
}
|
|
30
56
|
// Clamp the highlight whenever the suggestion set shrinks.
|
|
31
57
|
useEffect(() => {
|
|
32
58
|
setHighlight((current) => (current >= suggestions.length ? 0 : current));
|
|
@@ -41,9 +67,11 @@ export function TagAutocomplete({ onSelect }) {
|
|
|
41
67
|
document.addEventListener('mousedown', onPointerDown);
|
|
42
68
|
return () => document.removeEventListener('mousedown', onPointerDown);
|
|
43
69
|
}, []);
|
|
70
|
+
// `tag` is always the full, prefixed tag the filter applies; the input mirrors
|
|
71
|
+
// the stripped display so a User filter never shows the `user:` plumbing.
|
|
44
72
|
function choose(tag) {
|
|
45
73
|
onSelect(tag);
|
|
46
|
-
setInput(tag);
|
|
74
|
+
setInput(displayOf(tag));
|
|
47
75
|
setOpen(false);
|
|
48
76
|
}
|
|
49
77
|
function onKeyDown(event) {
|
|
@@ -53,7 +81,7 @@ export function TagAutocomplete({ onSelect }) {
|
|
|
53
81
|
}
|
|
54
82
|
if (!showList) {
|
|
55
83
|
if (event.key === 'Enter' && trimmed !== '')
|
|
56
|
-
choose(
|
|
84
|
+
choose(fullQuery);
|
|
57
85
|
return;
|
|
58
86
|
}
|
|
59
87
|
if (event.key === 'ArrowDown') {
|
|
@@ -70,21 +98,21 @@ export function TagAutocomplete({ onSelect }) {
|
|
|
70
98
|
if (picked)
|
|
71
99
|
choose(picked.tag);
|
|
72
100
|
else if (trimmed !== '')
|
|
73
|
-
choose(
|
|
101
|
+
choose(fullQuery);
|
|
74
102
|
}
|
|
75
103
|
}
|
|
76
104
|
const activeId = showList ? `${listboxId}-option-${highlight}` : undefined;
|
|
77
|
-
return (_jsxs("div", { ref: containerRef, className: "relative", children: [_jsx(
|
|
105
|
+
return (_jsxs("div", { ref: containerRef, className: "relative", children: [_jsx(Input, { type: "text", value: input, onChange: (event) => {
|
|
78
106
|
setInput(event.target.value);
|
|
79
107
|
setOpen(true);
|
|
80
|
-
}, onFocus: () => setOpen(true), onKeyDown: onKeyDown, placeholder:
|
|
108
|
+
}, onFocus: () => setOpen(true), onKeyDown: onKeyDown, placeholder: placeholder, "aria-label": ariaLabel, role: "combobox", "aria-expanded": showList, "aria-controls": listboxId, "aria-autocomplete": "list", ...(activeId ? { 'aria-activedescendant': activeId } : {}) }), showList ? (_jsxs("div", { id: listboxId,
|
|
81
109
|
// biome-ignore lint/a11y/useSemanticElements: a <select> can't render styled tag+count option rows; ARIA combobox listbox pattern
|
|
82
|
-
role: "listbox", "aria-label": "Tag suggestions", tabIndex: -1, className: "absolute left-0 top-full z-10 mt-1 max-h-64 w-48 overflow-auto rounded border border-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
110
|
+
role: "listbox", "aria-label": "Tag suggestions", tabIndex: -1, ref: listRef, onScroll: onListScroll, className: "absolute left-0 top-full z-10 mt-1 max-h-64 w-48 overflow-auto rounded border border-line bg-popover py-1 shadow-lg", children: [suggestions.map((suggestion, index) => (_jsxs("div", { id: `${listboxId}-option-${index}`,
|
|
111
|
+
// biome-ignore lint/a11y/useSemanticElements: <option> can't host the styled tag+count layout; ARIA combobox option pattern
|
|
112
|
+
role: "option", tabIndex: -1, "aria-selected": index === highlight, onMouseDown: (event) => {
|
|
113
|
+
// mousedown (not click) so the input's blur doesn't close the list first
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
choose(suggestion.tag);
|
|
116
|
+
}, onMouseEnter: () => setHighlight(index), className: `flex cursor-pointer items-center justify-between gap-3 px-2 py-1 text-xs ${index === highlight ? 'bg-panel-2 text-foreground' : 'text-foreground'}`, children: [_jsx("span", { className: "truncate", children: displayOf(suggestion.tag) }), _jsx("span", { className: "shrink-0 text-muted-foreground", children: suggestion.count })] }, suggestion.tag))), tags.isFetchingNextPage ? (_jsx("p", { className: "px-2 py-1 text-[10px] text-muted-foreground", children: "loading more\u2026" })) : null] })) : null] }));
|
|
89
117
|
}
|
|
90
118
|
//# sourceMappingURL=tag-autocomplete.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-autocomplete.js","sourceRoot":"","sources":["../../../src/react/components/tag-autocomplete.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"tag-autocomplete.js","sourceRoot":"","sources":["../../../src/react/components/tag-autocomplete.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, dependency-free CSV serialization for telescope entries, used by the
|
|
3
|
+
* Exports screen. Flattens the top-level entry fields (the columns a triage
|
|
4
|
+
* spreadsheet actually wants) plus a stringified `content` blob — nested content
|
|
5
|
+
* shapes vary by type, so we serialize the whole thing into one escaped cell
|
|
6
|
+
* rather than exploding into a ragged column set. Kept framework-free so it can
|
|
7
|
+
* be unit-tested in isolation, mirroring `export-json.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import type { Entry } from '../../client/index.js';
|
|
10
|
+
/** The fixed CSV column order. `content` is the JSON-stringified entry content. */
|
|
11
|
+
export declare const CSV_COLUMNS: readonly ["id", "type", "createdAt", "durationMs", "tags", "familyHash", "traceId", "content"];
|
|
12
|
+
/**
|
|
13
|
+
* Escape a single CSV field per RFC 4180: if it contains a quote, comma, or
|
|
14
|
+
* newline (CR or LF), wrap it in double quotes and double any embedded quotes.
|
|
15
|
+
* Plain fields pass through untouched so the common case stays readable.
|
|
16
|
+
*/
|
|
17
|
+
export declare function escapeCsvField(value: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Render entries as a CSV document (header row + one row per entry), CRLF-
|
|
20
|
+
* terminated per RFC 4180. Every cell is escaped via {@link escapeCsvField}.
|
|
21
|
+
*/
|
|
22
|
+
export declare function entriesToCsv(entries: Entry[]): string;
|
|
23
|
+
/** Trigger a browser download of `csv` text under `filename`, mirroring `downloadJson`. */
|
|
24
|
+
export declare function downloadCsv(filename: string, csv: string): void;
|
|
25
|
+
//# sourceMappingURL=to-csv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-csv.d.ts","sourceRoot":"","sources":["../../../src/react/components/to-csv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,mFAAmF;AACnF,eAAO,MAAM,WAAW,gGASd,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AA0BD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAMrD;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAU/D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, dependency-free CSV serialization for telescope entries, used by the
|
|
3
|
+
* Exports screen. Flattens the top-level entry fields (the columns a triage
|
|
4
|
+
* spreadsheet actually wants) plus a stringified `content` blob — nested content
|
|
5
|
+
* shapes vary by type, so we serialize the whole thing into one escaped cell
|
|
6
|
+
* rather than exploding into a ragged column set. Kept framework-free so it can
|
|
7
|
+
* be unit-tested in isolation, mirroring `export-json.ts`.
|
|
8
|
+
*/
|
|
9
|
+
/** The fixed CSV column order. `content` is the JSON-stringified entry content. */
|
|
10
|
+
export const CSV_COLUMNS = [
|
|
11
|
+
'id',
|
|
12
|
+
'type',
|
|
13
|
+
'createdAt',
|
|
14
|
+
'durationMs',
|
|
15
|
+
'tags',
|
|
16
|
+
'familyHash',
|
|
17
|
+
'traceId',
|
|
18
|
+
'content',
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Escape a single CSV field per RFC 4180: if it contains a quote, comma, or
|
|
22
|
+
* newline (CR or LF), wrap it in double quotes and double any embedded quotes.
|
|
23
|
+
* Plain fields pass through untouched so the common case stays readable.
|
|
24
|
+
*/
|
|
25
|
+
export function escapeCsvField(value) {
|
|
26
|
+
if (/[",\r\n]/.test(value)) {
|
|
27
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
/** Serialize an arbitrary value for the `content` cell, never throwing. */
|
|
32
|
+
function stringifyContent(content) {
|
|
33
|
+
if (content === null || content === undefined)
|
|
34
|
+
return '';
|
|
35
|
+
try {
|
|
36
|
+
return JSON.stringify(content) ?? String(content);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return String(content);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** One CSV row of cells (pre-escape) for an entry, in {@link CSV_COLUMNS} order. */
|
|
43
|
+
function rowFor(entry) {
|
|
44
|
+
return [
|
|
45
|
+
entry.id,
|
|
46
|
+
entry.type,
|
|
47
|
+
entry.createdAt,
|
|
48
|
+
entry.durationMs === null ? '' : String(entry.durationMs),
|
|
49
|
+
entry.tags.join('; '),
|
|
50
|
+
entry.familyHash ?? '',
|
|
51
|
+
entry.traceId ?? '',
|
|
52
|
+
stringifyContent(entry.content),
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Render entries as a CSV document (header row + one row per entry), CRLF-
|
|
57
|
+
* terminated per RFC 4180. Every cell is escaped via {@link escapeCsvField}.
|
|
58
|
+
*/
|
|
59
|
+
export function entriesToCsv(entries) {
|
|
60
|
+
const lines = [CSV_COLUMNS.map(escapeCsvField).join(',')];
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
lines.push(rowFor(entry).map(escapeCsvField).join(','));
|
|
63
|
+
}
|
|
64
|
+
return lines.join('\r\n');
|
|
65
|
+
}
|
|
66
|
+
/** Trigger a browser download of `csv` text under `filename`, mirroring `downloadJson`. */
|
|
67
|
+
export function downloadCsv(filename, csv) {
|
|
68
|
+
const blob = new Blob([csv], { type: 'text/csv' });
|
|
69
|
+
const url = URL.createObjectURL(blob);
|
|
70
|
+
const anchor = document.createElement('a');
|
|
71
|
+
anchor.href = url;
|
|
72
|
+
anchor.download = filename;
|
|
73
|
+
document.body.appendChild(anchor);
|
|
74
|
+
anchor.click();
|
|
75
|
+
anchor.remove();
|
|
76
|
+
URL.revokeObjectURL(url);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=to-csv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-csv.js","sourceRoot":"","sources":["../../../src/react/components/to-csv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,mFAAmF;AACnF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI;IACJ,MAAM;IACN,WAAW;IACX,YAAY;IACZ,MAAM;IACN,YAAY;IACZ,SAAS;IACT,SAAS;CACD,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,SAAS,gBAAgB,CAAC,OAAgB;IACxC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,SAAS,MAAM,CAAC,KAAY;IAC1B,OAAO;QACL,KAAK,CAAC,EAAE;QACR,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACrB,KAAK,CAAC,UAAU,IAAI,EAAE;QACtB,KAAK,CAAC,OAAO,IAAI,EAAE;QACnB,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;KAChC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,GAAW;IACvD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -11,4 +11,19 @@ export declare function findUserTag(tags: readonly string[]): string | null;
|
|
|
11
11
|
export declare function userTagId(userTag: string): string;
|
|
12
12
|
/** Hash-router href to the all-types entries list filtered by a `user:<id>` tag. */
|
|
13
13
|
export declare function buildUserActivityHref(userTag: string): string;
|
|
14
|
+
/** The fixed prefix the dedicated User filter narrows the tag search to. */
|
|
15
|
+
export declare const USER_TAG_FILTER_PREFIX = "user:";
|
|
16
|
+
/**
|
|
17
|
+
* True when `tag` is a populated `user:<id>` tag — i.e. the active tag filter is
|
|
18
|
+
* really a user pivot and should render in the User control, not the generic
|
|
19
|
+
* tag chip. A bare `user:` (no id) is NOT a user filter.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isUserTag(tag: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Prepends the `user:` prefix to a raw user id to form the underlying tag the
|
|
24
|
+
* entries query filters by. Idempotent: an already-prefixed value passes
|
|
25
|
+
* through unchanged, so the autocomplete (which surfaces full `user:<id>` tags)
|
|
26
|
+
* and a hand-typed bare id both resolve to the same tag.
|
|
27
|
+
*/
|
|
28
|
+
export declare function toUserTag(idOrTag: string): string;
|
|
14
29
|
//# sourceMappingURL=user-tag.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-tag.d.ts","sourceRoot":"","sources":["../../../src/react/components/user-tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAKlE;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
|
1
|
+
{"version":3,"file":"user-tag.d.ts","sourceRoot":"","sources":["../../../src/react/components/user-tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAKlE;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,UAAkB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
|
@@ -22,4 +22,23 @@ export function userTagId(userTag) {
|
|
|
22
22
|
export function buildUserActivityHref(userTag) {
|
|
23
23
|
return `#/entries?tag=${encodeURIComponent(userTag)}`;
|
|
24
24
|
}
|
|
25
|
+
/** The fixed prefix the dedicated User filter narrows the tag search to. */
|
|
26
|
+
export const USER_TAG_FILTER_PREFIX = USER_TAG_PREFIX;
|
|
27
|
+
/**
|
|
28
|
+
* True when `tag` is a populated `user:<id>` tag — i.e. the active tag filter is
|
|
29
|
+
* really a user pivot and should render in the User control, not the generic
|
|
30
|
+
* tag chip. A bare `user:` (no id) is NOT a user filter.
|
|
31
|
+
*/
|
|
32
|
+
export function isUserTag(tag) {
|
|
33
|
+
return tag.startsWith(USER_TAG_PREFIX) && tag.length > USER_TAG_PREFIX.length;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Prepends the `user:` prefix to a raw user id to form the underlying tag the
|
|
37
|
+
* entries query filters by. Idempotent: an already-prefixed value passes
|
|
38
|
+
* through unchanged, so the autocomplete (which surfaces full `user:<id>` tags)
|
|
39
|
+
* and a hand-typed bare id both resolve to the same tag.
|
|
40
|
+
*/
|
|
41
|
+
export function toUserTag(idOrTag) {
|
|
42
|
+
return idOrTag.startsWith(USER_TAG_PREFIX) ? idOrTag : `${USER_TAG_PREFIX}${idOrTag}`;
|
|
43
|
+
}
|
|
25
44
|
//# sourceMappingURL=user-tag.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-tag.js","sourceRoot":"","sources":["../../../src/react/components/user-tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AACxD,CAAC"}
|
|
1
|
+
{"version":3,"file":"user-tag.js","sourceRoot":"","sources":["../../../src/react/components/user-tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;AAChF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,GAAG,OAAO,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Waterfall } from '../../client/index.js';
|
|
2
|
+
export interface WaterfallViewProps {
|
|
3
|
+
waterfall: Waterfall;
|
|
4
|
+
onSelect?: ((id: string) => void) | undefined;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Renders a nested span waterfall as a flat, indented timeline — each row a bar
|
|
8
|
+
* positioned by its start offset and sized by its duration, indented by nesting
|
|
9
|
+
* depth (Sentry/Tempo style). The bars are derived entirely from the headless
|
|
10
|
+
* `/traces/:id/waterfall` payload.
|
|
11
|
+
*/
|
|
12
|
+
export declare function WaterfallView({ waterfall, onSelect }: WaterfallViewProps): JSX.Element;
|
|
13
|
+
//# sourceMappingURL=waterfall-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waterfall-view.d.ts","sourceRoot":"","sources":["../../../src/react/components/waterfall-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AA+EtE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAqBtF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/** Per-entry-type bar colour, mirroring the dashboard's entry-type palette. */
|
|
3
|
+
const TYPE_COLOR = {
|
|
4
|
+
request: 'bg-sky-500',
|
|
5
|
+
query: 'bg-amber-500',
|
|
6
|
+
http_client: 'bg-violet-500',
|
|
7
|
+
job: 'bg-emerald-500',
|
|
8
|
+
cache: 'bg-teal-500',
|
|
9
|
+
exception: 'bg-rose-500',
|
|
10
|
+
event: 'bg-indigo-500',
|
|
11
|
+
log: 'bg-zinc-500',
|
|
12
|
+
mail: 'bg-pink-500',
|
|
13
|
+
redis: 'bg-red-500',
|
|
14
|
+
};
|
|
15
|
+
function colorFor(type) {
|
|
16
|
+
return TYPE_COLOR[type] ?? 'bg-zinc-600';
|
|
17
|
+
}
|
|
18
|
+
function formatMs(ms) {
|
|
19
|
+
if (ms < 1)
|
|
20
|
+
return '<1ms';
|
|
21
|
+
if (ms < 1000)
|
|
22
|
+
return `${Math.round(ms)}ms`;
|
|
23
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
24
|
+
}
|
|
25
|
+
/** A flattened list of spans in depth-first order, preserving nesting via depth. */
|
|
26
|
+
function flatten(spans) {
|
|
27
|
+
const out = [];
|
|
28
|
+
const walk = (list) => {
|
|
29
|
+
for (const span of list) {
|
|
30
|
+
out.push(span);
|
|
31
|
+
if (span.children.length > 0)
|
|
32
|
+
walk(span.children);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
walk(spans);
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
function WaterfallRow({ span, totalDurationMs, onSelect }) {
|
|
39
|
+
// Guard against a zero-width trace (all instant spans) so bars stay visible.
|
|
40
|
+
const span100 = totalDurationMs > 0 ? totalDurationMs : 1;
|
|
41
|
+
const leftPct = Math.min(100, (span.offsetMs / span100) * 100);
|
|
42
|
+
const widthPct = Math.max(0.5, Math.min(100 - leftPct, (span.durationMs / span100) * 100));
|
|
43
|
+
return (_jsxs("button", { type: "button", onClick: () => onSelect?.(span.id), "data-testid": "waterfall-row", className: "flex w-full items-center gap-2 rounded px-1 py-0.5 text-left text-[11px] hover:bg-panel-2", children: [_jsxs("span", { className: "min-w-0 flex-shrink-0 truncate font-mono text-foreground", style: { width: '40%', paddingLeft: `${span.depth * 12}px` }, title: span.label, children: [_jsx("span", { className: "mr-1 text-muted-foreground", children: span.type }), span.label] }), _jsx("span", { className: "relative h-3 flex-1 rounded bg-panel", children: _jsx("span", { className: `absolute top-0 h-3 rounded ${colorFor(span.type)}`, style: { left: `${leftPct}%`, width: `${widthPct}%` }, title: `${formatMs(span.offsetMs)} +${formatMs(span.durationMs)}` }) }), _jsx("span", { className: "w-16 flex-shrink-0 text-right tabular-nums text-muted-foreground", children: formatMs(span.durationMs) })] }));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Renders a nested span waterfall as a flat, indented timeline — each row a bar
|
|
47
|
+
* positioned by its start offset and sized by its duration, indented by nesting
|
|
48
|
+
* depth (Sentry/Tempo style). The bars are derived entirely from the headless
|
|
49
|
+
* `/traces/:id/waterfall` payload.
|
|
50
|
+
*/
|
|
51
|
+
export function WaterfallView({ waterfall, onSelect }) {
|
|
52
|
+
const rows = flatten(waterfall.spans);
|
|
53
|
+
if (rows.length === 0) {
|
|
54
|
+
return _jsx("p", { className: "text-muted-foreground", children: "No spans in this trace" });
|
|
55
|
+
}
|
|
56
|
+
return (_jsxs("div", { className: "space-y-0.5", children: [_jsxs("div", { className: "mb-1 flex items-center justify-between text-[10px] uppercase tracking-wide text-muted-foreground", children: [_jsx("span", { children: "Span" }), _jsxs("span", { children: ["Total ", formatMs(waterfall.totalDurationMs)] })] }), rows.map((span) => (_jsx(WaterfallRow, { span: span, totalDurationMs: waterfall.totalDurationMs, onSelect: onSelect }, span.id)))] }));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=waterfall-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waterfall-view.js","sourceRoot":"","sources":["../../../src/react/components/waterfall-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window-select.d.ts","sourceRoot":"","sources":["../../../src/react/components/window-select.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"window-select.d.ts","sourceRoot":"","sources":["../../../src/react/components/window-select.tsx"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GACT,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAoBhE"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/index.js';
|
|
2
3
|
const WINDOWS = ['15m', '1h', '6h', '24h'];
|
|
3
4
|
export function WindowSelect({ value, onChange, }) {
|
|
4
|
-
return (
|
|
5
|
+
return (_jsxs(Select, { value: value, onValueChange: (next) => {
|
|
6
|
+
if (typeof next === 'string')
|
|
7
|
+
onChange(next);
|
|
8
|
+
}, children: [_jsx(SelectTrigger, { "aria-label": "Time window", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { align: "end", children: WINDOWS.map((w) => (_jsx(SelectItem, { value: w, children: w }, w))) })] }));
|
|
5
9
|
}
|
|
6
10
|
//# sourceMappingURL=window-select.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window-select.js","sourceRoot":"","sources":["../../../src/react/components/window-select.tsx"],"names":[],"mappings":";AAAA,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GACyC;IACjD,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"window-select.js","sourceRoot":"","sources":["../../../src/react/components/window-select.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/F,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GACyC;IACjD,OAAO,CACL,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YACtB,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,aAED,KAAC,aAAa,kBAAY,aAAa,YACrC,KAAC,WAAW,KAAG,GACD,EAChB,KAAC,aAAa,IAAC,KAAK,EAAC,KAAK,YACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,KAAC,UAAU,IAAS,KAAK,EAAE,CAAC,YACzB,CAAC,IADa,CAAC,CAEL,CACd,CAAC,GACY,IACT,CACV,CAAC;AACJ,CAAC"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
export * from './telescope-context.js';
|
|
2
2
|
export * from './use-telescope-queries.js';
|
|
3
|
+
export * from './use-telescope-stream.js';
|
|
3
4
|
export * from './components/entry-types.js';
|
|
4
|
-
export * from './components/type-tabs.js';
|
|
5
5
|
export * from './components/entries-table.js';
|
|
6
6
|
export * from './components/user-tag.js';
|
|
7
7
|
export * from './components/batch-timeline.js';
|
|
8
|
+
export * from './components/waterfall-view.js';
|
|
9
|
+
export * from './components/flamegraph.js';
|
|
10
|
+
export * from './components/flamegraph-view.js';
|
|
8
11
|
export * from './components/entry-detail.js';
|
|
9
12
|
export * from './components/export-json.js';
|
|
10
13
|
export * from './components/export-json-toolbar.js';
|
|
14
|
+
export * from './components/to-csv.js';
|
|
11
15
|
export * from './components/retention-indicator.js';
|
|
12
16
|
export * from './components/cache-badge.js';
|
|
17
|
+
export * from './components/inertia-badge.js';
|
|
18
|
+
export * from './components/inertia-body.js';
|
|
13
19
|
export * from './components/entry-insights.js';
|
|
14
20
|
export * from './components/window-select.js';
|
|
15
21
|
export * from './components/tag-autocomplete.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAK1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
package/dist/react/index.js
CHANGED
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
export * from './telescope-context.js';
|
|
2
2
|
export * from './use-telescope-queries.js';
|
|
3
|
+
export * from './use-telescope-stream.js';
|
|
4
|
+
// Console launcher, three tiers: `openTelescopeConsole` (no React, from `./client`),
|
|
5
|
+
// `useOpenTelescopeConsole` (state only, your markup), `<OpenTelescopeConsoleButton>` (drop-in).
|
|
6
|
+
// `openTelescopeConsoleMutationOptions` wires the same call into TanStack Query without this
|
|
7
|
+
// package depending on TanStack.
|
|
3
8
|
export * from './components/entry-types.js';
|
|
4
|
-
export * from './components/type-tabs.js';
|
|
5
9
|
export * from './components/entries-table.js';
|
|
6
10
|
export * from './components/user-tag.js';
|
|
7
11
|
export * from './components/batch-timeline.js';
|
|
12
|
+
export * from './components/waterfall-view.js';
|
|
13
|
+
export * from './components/flamegraph.js';
|
|
14
|
+
export * from './components/flamegraph-view.js';
|
|
8
15
|
export * from './components/entry-detail.js';
|
|
9
16
|
export * from './components/export-json.js';
|
|
10
17
|
export * from './components/export-json-toolbar.js';
|
|
18
|
+
export * from './components/to-csv.js';
|
|
11
19
|
export * from './components/retention-indicator.js';
|
|
12
20
|
export * from './components/cache-badge.js';
|
|
21
|
+
export * from './components/inertia-badge.js';
|
|
22
|
+
export * from './components/inertia-body.js';
|
|
13
23
|
export * from './components/entry-insights.js';
|
|
14
24
|
export * from './components/window-select.js';
|
|
15
25
|
export * from './components/tag-autocomplete.js';
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,qFAAqF;AACrF,iGAAiG;AACjG,6FAA6F;AAC7F,iCAAiC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
/**
|
|
3
|
+
* Vendored shadcn `Badge`, retuned to the Aviary tokens.
|
|
4
|
+
*
|
|
5
|
+
* Variants are semantic, not decorative: `good`/`warn`/`bad` are the status
|
|
6
|
+
* hues, `brand` is "interactive / branded", `muted` is a neutral label. Entry
|
|
7
|
+
* TYPE colours are a separate categorical palette (see `entry-types.ts`) and
|
|
8
|
+
* deliberately do not go through here.
|
|
9
|
+
*/
|
|
10
|
+
export declare const badgeVariants: (props?: ({
|
|
11
|
+
variant?: "muted" | "brand" | "good" | "warn" | "bad" | "outline" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
|
+
export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
|
|
14
|
+
}
|
|
15
|
+
export declare function Badge({ className, variant, ...props }: BadgeProps): JSX.Element;
|
|
16
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/react/ui/badge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAC;AAGlE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;;8EAezB,CAAC;AAEF,MAAM,WAAW,UACf,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAC3C,YAAY,CAAC,OAAO,aAAa,CAAC;CAAG;AAEzC,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CAE/E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { cn } from './cn.js';
|
|
4
|
+
/**
|
|
5
|
+
* Vendored shadcn `Badge`, retuned to the Aviary tokens.
|
|
6
|
+
*
|
|
7
|
+
* Variants are semantic, not decorative: `good`/`warn`/`bad` are the status
|
|
8
|
+
* hues, `brand` is "interactive / branded", `muted` is a neutral label. Entry
|
|
9
|
+
* TYPE colours are a separate categorical palette (see `entry-types.ts`) and
|
|
10
|
+
* deliberately do not go through here.
|
|
11
|
+
*/
|
|
12
|
+
export const badgeVariants = cva('inline-flex items-center gap-1 rounded border px-1.5 py-0.5 text-[10px] font-medium', {
|
|
13
|
+
variants: {
|
|
14
|
+
variant: {
|
|
15
|
+
muted: 'tint-muted',
|
|
16
|
+
brand: 'tint-brand',
|
|
17
|
+
good: 'tint-good',
|
|
18
|
+
warn: 'tint-warn',
|
|
19
|
+
bad: 'tint-bad',
|
|
20
|
+
outline: 'border-line bg-transparent text-muted-foreground',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: { variant: 'muted' },
|
|
24
|
+
});
|
|
25
|
+
export function Badge({ className, variant, ...props }) {
|
|
26
|
+
return _jsx("span", { className: cn(badgeVariants({ variant }), className), ...props });
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/react/ui/badge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAqB,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAC9B,qFAAqF,EACrF;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,UAAU;YACf,OAAO,EAAE,kDAAkD;SAC5D;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;CACtC,CACF,CAAC;AAMF,MAAM,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAc;IAChE,OAAO,eAAM,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
/**
|
|
3
|
+
* Vendored shadcn `Button`, retuned to the Aviary tokens.
|
|
4
|
+
*
|
|
5
|
+
* The console's real button vocabulary is small and uniform: bordered, low-key,
|
|
6
|
+
* xs/uppercase. `outline` is the default because that is what every toolbar,
|
|
7
|
+
* header control and row action already looked like; `accent`/`good`/`warn`/
|
|
8
|
+
* `bad` are the tinted states those controls toggle into.
|
|
9
|
+
*/
|
|
10
|
+
export declare const buttonVariants: (props?: ({
|
|
11
|
+
variant?: "brand" | "good" | "warn" | "bad" | "outline" | "ghost" | "solid" | null | undefined;
|
|
12
|
+
size?: "xs" | "sm" | "md" | null | undefined;
|
|
13
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
14
|
+
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
|
|
15
|
+
}
|
|
16
|
+
export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
17
|
+
//# sourceMappingURL=button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/react/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAC;AAIlE;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;;;8EAsB1B,CAAC;AAEF,MAAM,WAAW,WACf,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EACnD,YAAY,CAAC,OAAO,cAAc,CAAC;CAAG;AAE1C,eAAO,MAAM,MAAM,2GAYjB,CAAC"}
|