@mastra/playground-ui 58.0.0-alpha.3 → 58.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/{code-DhrdtZce.cjs → code-B-x-9sJ1.cjs} +16 -4
- package/dist/code-B-x-9sJ1.cjs.map +1 -0
- package/dist/{code-D4Vw_fYq.js → code-BeWhOFT4.js} +16 -4
- package/dist/code-BeWhOFT4.js.map +1 -0
- package/dist/{code-block-BD2N5Yi2.js → code-block-C4caeNBi.js} +2 -2
- package/dist/{code-block-BD2N5Yi2.js.map → code-block-C4caeNBi.js.map} +1 -1
- package/dist/{code-block-fI67m2KV.cjs → code-block-il1MzQTs.cjs} +2 -2
- package/dist/{code-block-fI67m2KV.cjs.map → code-block-il1MzQTs.cjs.map} +1 -1
- package/dist/{code-diff-BHZTS4Zh.js → code-diff-Hao35skN.js} +2 -2
- package/dist/{code-diff-BHZTS4Zh.js.map → code-diff-Hao35skN.js.map} +1 -1
- package/dist/{code-editor-C-0srcj0.js → code-editor-BTxx6wLT.js} +4 -4
- package/dist/{code-editor-C-0srcj0.js.map → code-editor-BTxx6wLT.js.map} +1 -1
- package/dist/{code-editor-CFu_BYpQ.cjs → code-editor-LgrhXmOy.cjs} +3 -3
- package/dist/{code-editor-CFu_BYpQ.cjs.map → code-editor-LgrhXmOy.cjs.map} +1 -1
- package/dist/components/Code.cjs.js +1 -1
- package/dist/components/Code.es.js +1 -1
- package/dist/components/CodeBlock.cjs.js +1 -1
- package/dist/components/CodeBlock.es.js +1 -1
- package/dist/components/CodeDiff.es.js +1 -1
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataDetailsPanel.cjs.js +2 -78
- package/dist/components/DataDetailsPanel.cjs.js.map +1 -1
- package/dist/components/DataDetailsPanel.es.js +2 -78
- package/dist/components/DataDetailsPanel.es.js.map +1 -1
- package/dist/components/DataList.cjs.js +5 -5
- package/dist/components/DataList.es.js +5 -5
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +4 -2
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +4 -2
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +2 -2
- package/dist/components/SideDialog.cjs.js.map +1 -1
- package/dist/components/SideDialog.es.js +3 -3
- package/dist/components/SideDialog.es.js.map +1 -1
- package/dist/components/ThemeProvider.es.js +1 -1
- package/dist/components/ThemeToggle.es.js +1 -1
- package/dist/components/Workflow.cjs.js +5 -5
- package/dist/components/Workflow.cjs.js.map +1 -1
- package/dist/components/Workflow.es.js +5 -5
- package/dist/components/Workflow.es.js.map +1 -1
- package/dist/components/ai/chat-event.cjs.js +1 -1
- package/dist/components/ai/chat-event.es.js +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +2 -2
- package/dist/components/ai/tool-call.es.js +2 -2
- package/dist/data-code-section-Cth9zVkj.js +199 -0
- package/dist/data-code-section-Cth9zVkj.js.map +1 -0
- package/dist/{data-code-section-DzLc9O0B.cjs → data-code-section-DE4AgaTU.cjs} +44 -210
- package/dist/data-code-section-DE4AgaTU.cjs.map +1 -0
- package/dist/{data-list-DXjH5wkB.js → data-list-DisTjDHP.js} +3 -3
- package/dist/{data-list-DXjH5wkB.js.map → data-list-DisTjDHP.js.map} +1 -1
- package/dist/{data-list-CH3HAhK5.cjs → data-list-PwFpP_mo.cjs} +3 -3
- package/dist/{data-list-CH3HAhK5.cjs.map → data-list-PwFpP_mo.cjs.map} +1 -1
- package/dist/{data-list-skeleton-K_WmrVke.cjs → data-list-skeleton-CjwR0o3w.cjs} +2 -2
- package/dist/{data-list-skeleton-K_WmrVke.cjs.map → data-list-skeleton-CjwR0o3w.cjs.map} +1 -1
- package/dist/{data-list-skeleton-h4pILqCC.js → data-list-skeleton-DAfM8AjW.js} +2 -2
- package/dist/{data-list-skeleton-h4pILqCC.js.map → data-list-skeleton-DAfM8AjW.js.map} +1 -1
- package/dist/{data-list-spacer-BQ4_YeyT.js → data-list-spacer-BmorAN0V.js} +2 -2
- package/dist/{data-list-spacer-BQ4_YeyT.js.map → data-list-spacer-BmorAN0V.js.map} +1 -1
- package/dist/{data-list-spacer-GIVW2hB1.cjs → data-list-spacer-DEcgVGFM.cjs} +2 -2
- package/dist/{data-list-spacer-GIVW2hB1.cjs.map → data-list-spacer-DEcgVGFM.cjs.map} +1 -1
- package/dist/{data-list-top-LiaWUw5P.js → data-list-top-DpbOA3uw.js} +2 -2
- package/dist/data-list-top-DpbOA3uw.js.map +1 -0
- package/dist/{data-list-top-B-gb-FY6.cjs → data-list-top-WGUY167p.cjs} +2 -2
- package/dist/data-list-top-WGUY167p.cjs.map +1 -0
- package/dist/{data-panel-CPZ2GuZN.js → data-panel-BQVTKo86.js} +2 -2
- package/dist/{data-panel-CPZ2GuZN.js.map → data-panel-BQVTKo86.js.map} +1 -1
- package/dist/{data-panel-CIu6JToM.cjs → data-panel-XPXrhYJI.cjs} +2 -2
- package/dist/{data-panel-CIu6JToM.cjs.map → data-panel-XPXrhYJI.cjs.map} +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
- package/dist/domains/chat/messages/reasoning.cjs.js +1 -1
- package/dist/domains/chat/messages/reasoning.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
- package/dist/domains/logs/components/log-data-panel.cjs.js +118 -0
- package/dist/domains/logs/components/log-data-panel.cjs.js.map +1 -0
- package/dist/domains/logs/components/log-data-panel.d.ts +2 -0
- package/dist/domains/logs/components/log-data-panel.es.js +114 -0
- package/dist/domains/logs/components/log-data-panel.es.js.map +1 -0
- package/dist/domains/logs/components/logs-list-view.cjs.js +4 -4
- package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +4 -4
- package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
- package/dist/domains/logs/components.cjs.js +2 -4
- package/dist/domains/logs/components.cjs.js.map +1 -1
- package/dist/domains/logs/components.es.js +1 -2
- package/dist/domains/logs/components.es.js.map +1 -1
- package/dist/domains/logs.cjs.js +2 -4
- package/dist/domains/logs.cjs.js.map +1 -1
- package/dist/domains/logs.es.js +1 -2
- package/dist/domains/logs.es.js.map +1 -1
- package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +2 -2
- package/dist/domains/traces/components/span-data-panel-view.es.js +2 -2
- package/dist/domains/traces/components/span-details-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-details-view.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +1 -1
- package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/span-summary-description.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
- package/dist/domains/traces/components/trace-id-button.es.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +3 -3
- package/dist/domains/traces/components/traces-list-view.es.js +3 -3
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +3 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +3 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +3 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +3 -1
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +2 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +2 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/filter-bar-chip.css +34 -14
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/{logs-data-list-XU1hCwI5.js → logs-data-list-5BAeLU57.js} +11 -11
- package/dist/logs-data-list-5BAeLU57.js.map +1 -0
- package/dist/{logs-data-list-BGJTRyO_.cjs → logs-data-list-YL9yLKF3.cjs} +11 -11
- package/dist/logs-data-list-YL9yLKF3.cjs.map +1 -0
- package/dist/{markdown-renderer-BBYgxsXL.js → markdown-renderer-Ces7VyRK.js} +2 -2
- package/dist/{markdown-renderer-BBYgxsXL.js.map → markdown-renderer-Ces7VyRK.js.map} +1 -1
- package/dist/{markdown-renderer-Du_Zd1T-.cjs → markdown-renderer-DtH58325.cjs} +2 -2
- package/dist/{markdown-renderer-Du_Zd1T-.cjs.map → markdown-renderer-DtH58325.cjs.map} +1 -1
- package/dist/{span-payload-primitives-CzLh6axt.js → span-payload-primitives-Buq9V8nK.js} +2 -2
- package/dist/{span-payload-primitives-CzLh6axt.js.map → span-payload-primitives-Buq9V8nK.js.map} +1 -1
- package/dist/{span-payload-primitives-KEXwIaeZ.cjs → span-payload-primitives-CjlNH9C-.cjs} +2 -2
- package/dist/{span-payload-primitives-KEXwIaeZ.cjs.map → span-payload-primitives-CjlNH9C-.cjs.map} +1 -1
- package/dist/src/domains/logs/components/index.d.ts +1 -2
- package/dist/src/domains/logs/components/log-data-panel.d.ts +12 -0
- package/dist/src/ds/components/Code/code.d.ts +3 -1
- package/dist/src/ds/components/DataList/shared.d.ts +2 -2
- package/dist/style.css +50 -36
- package/dist/{theme-provider-C9ih9jSS.js → theme-provider-CQKmlkHX.js} +2 -2
- package/dist/{theme-provider-C9ih9jSS.js.map → theme-provider-CQKmlkHX.js.map} +1 -1
- package/dist/{traces-data-list-DLeKSbaZ.cjs → traces-data-list-Dam8-XW-.cjs} +4 -4
- package/dist/{traces-data-list-DLeKSbaZ.cjs.map → traces-data-list-Dam8-XW-.cjs.map} +1 -1
- package/dist/{traces-data-list-Cjy5a-1f.js → traces-data-list-Dvi0s56v.js} +4 -4
- package/dist/{traces-data-list-Cjy5a-1f.js.map → traces-data-list-Dvi0s56v.js.map} +1 -1
- package/package.json +8 -8
- package/dist/code-D4Vw_fYq.js.map +0 -1
- package/dist/code-DhrdtZce.cjs.map +0 -1
- package/dist/data-code-section-C75shCII.js +0 -365
- package/dist/data-code-section-C75shCII.js.map +0 -1
- package/dist/data-code-section-DzLc9O0B.cjs.map +0 -1
- package/dist/data-list-top-B-gb-FY6.cjs.map +0 -1
- package/dist/data-list-top-LiaWUw5P.js.map +0 -1
- package/dist/domains/logs/components/log-details-view.cjs.js +0 -131
- package/dist/domains/logs/components/log-details-view.cjs.js.map +0 -1
- package/dist/domains/logs/components/log-details-view.d.ts +0 -2
- package/dist/domains/logs/components/log-details-view.es.js +0 -127
- package/dist/domains/logs/components/log-details-view.es.js.map +0 -1
- package/dist/domains/logs/components/logs-layout.cjs.js +0 -36
- package/dist/domains/logs/components/logs-layout.cjs.js.map +0 -1
- package/dist/domains/logs/components/logs-layout.d.ts +0 -2
- package/dist/domains/logs/components/logs-layout.es.js +0 -32
- package/dist/domains/logs/components/logs-layout.es.js.map +0 -1
- package/dist/logs-data-list-BGJTRyO_.cjs.map +0 -1
- package/dist/logs-data-list-XU1hCwI5.js.map +0 -1
- package/dist/src/domains/logs/components/log-details-view.d.ts +0 -12
- package/dist/src/domains/logs/components/logs-layout.d.ts +0 -19
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
|
|
5
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
const dateFns = require('date-fns');
|
|
7
|
+
const lucideReact = require('lucide-react');
|
|
8
|
+
const React = require('react');
|
|
9
|
+
const Button = require('../../../Button-BAMnPqos.cjs');
|
|
10
|
+
const buttonsGroup = require('../../../buttons-group-CoZP3lJt.cjs');
|
|
11
|
+
const copyButton = require('../../../copy-button-D2MTGxq_.cjs');
|
|
12
|
+
const dataKeysAndValues = require('../../../data-keys-and-values-CMJ9zHKm.cjs');
|
|
13
|
+
const dataPanel = require('../../../data-panel-XPXrhYJI.cjs');
|
|
14
|
+
|
|
15
|
+
function toDate(value) {
|
|
16
|
+
return value instanceof Date ? value : new Date(value);
|
|
17
|
+
}
|
|
18
|
+
function LogDataPanel({
|
|
19
|
+
log,
|
|
20
|
+
onClose,
|
|
21
|
+
onTraceClick,
|
|
22
|
+
onSpanClick,
|
|
23
|
+
onPrevious,
|
|
24
|
+
onNext,
|
|
25
|
+
depth
|
|
26
|
+
}) {
|
|
27
|
+
const formattedDate = log ? dateFns.format(toDate(log.timestamp), "MMM dd, HH:mm:ss.SSS") : "";
|
|
28
|
+
return /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel, { open: !!log, onClose, title: log ? `Log ${formattedDate}` : "Log", depth, children: log && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsxs(dataPanel.DataPanel.Header, { children: [
|
|
30
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.CloseButton, { onClick: onClose }),
|
|
31
|
+
/* @__PURE__ */ jsxRuntime.jsxs(dataPanel.DataPanel.Heading, { children: [
|
|
32
|
+
"Log · ",
|
|
33
|
+
formattedDate
|
|
34
|
+
] }),
|
|
35
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.HeaderActions, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
36
|
+
dataPanel.DataPanel.NextPrevNav,
|
|
37
|
+
{
|
|
38
|
+
onPrevious,
|
|
39
|
+
onNext,
|
|
40
|
+
previousLabel: "Go to previous log",
|
|
41
|
+
nextLabel: "Go to next log"
|
|
42
|
+
}
|
|
43
|
+
) })
|
|
44
|
+
] }),
|
|
45
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-6 p-2", children: [
|
|
46
|
+
/* @__PURE__ */ jsxRuntime.jsxs(dataKeysAndValues.DataKeysAndValues, { children: [
|
|
47
|
+
log.entityType && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
48
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Key, { children: "Entity Type" }),
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Value, { children: log.entityType })
|
|
50
|
+
] }),
|
|
51
|
+
log.entityName && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
52
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Key, { children: "Entity Name" }),
|
|
53
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Value, { children: log.entityName })
|
|
54
|
+
] }),
|
|
55
|
+
log.serviceName && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
56
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Key, { children: "Service" }),
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Value, { children: log.serviceName })
|
|
58
|
+
] }),
|
|
59
|
+
log.environment && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
60
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Key, { children: "Environment" }),
|
|
61
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Value, { children: log.environment })
|
|
62
|
+
] }),
|
|
63
|
+
log.source && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Key, { children: "Source" }),
|
|
65
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Value, { children: log.source })
|
|
66
|
+
] }),
|
|
67
|
+
log.metadata && Object.entries(log.metadata).map(([key, value]) => /* @__PURE__ */ jsxRuntime.jsxs(React.Fragment, { children: [
|
|
68
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Key, { children: key }),
|
|
69
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataKeysAndValues.DataKeysAndValues.Value, { children: String(value) })
|
|
70
|
+
] }, key))
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.CodeSection, { title: "Message", codeStr: log.message, simplified: true }),
|
|
73
|
+
(log.traceId || log.spanId) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-2", children: [
|
|
74
|
+
log.traceId && /* @__PURE__ */ jsxRuntime.jsxs(buttonsGroup.ButtonsGroup, { className: "w-full min-w-0", children: [
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
76
|
+
Button.Button,
|
|
77
|
+
{
|
|
78
|
+
className: "min-w-0 flex-1 justify-between overflow-hidden",
|
|
79
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, {}),
|
|
80
|
+
onClick: () => log.traceId && onTraceClick?.(log.traceId),
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Trace" }),
|
|
83
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto min-w-0 truncate text-caption text-placeholder", children: [
|
|
84
|
+
"# ",
|
|
85
|
+
log.traceId
|
|
86
|
+
] })
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
),
|
|
90
|
+
/* @__PURE__ */ jsxRuntime.jsx(copyButton.CopyButton, { content: log.traceId, tooltip: "Copy Trace ID to clipboard" })
|
|
91
|
+
] }),
|
|
92
|
+
log.spanId && /* @__PURE__ */ jsxRuntime.jsxs(buttonsGroup.ButtonsGroup, { className: "w-full min-w-0", children: [
|
|
93
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
94
|
+
Button.Button,
|
|
95
|
+
{
|
|
96
|
+
className: "min-w-0 flex-1 justify-between overflow-hidden",
|
|
97
|
+
disabled: !log.traceId || !onSpanClick,
|
|
98
|
+
onClick: () => log.traceId && log.spanId && onSpanClick?.(log.traceId, log.spanId),
|
|
99
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, {}),
|
|
100
|
+
children: [
|
|
101
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Span" }),
|
|
102
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto min-w-0 truncate text-caption text-placeholder", children: [
|
|
103
|
+
"# ",
|
|
104
|
+
log.spanId
|
|
105
|
+
] })
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
/* @__PURE__ */ jsxRuntime.jsx(copyButton.CopyButton, { content: log.spanId, tooltip: "Copy Span ID to clipboard" })
|
|
110
|
+
] })
|
|
111
|
+
] }),
|
|
112
|
+
log.data && Object.keys(log.data).length > 0 && /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.CodeSection, { title: "Data", codeStr: JSON.stringify(log.data, null, 2) })
|
|
113
|
+
] }) })
|
|
114
|
+
] }) });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
exports.LogDataPanel = LogDataPanel;
|
|
118
|
+
//# sourceMappingURL=log-data-panel.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-data-panel.cjs.js","sources":["../../../../src/domains/logs/components/log-data-panel.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ArrowRightIcon } from 'lucide-react';\nimport { Fragment } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n log?: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function LogDataPanel({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n depth,\n}: LogDataPanelProps) {\n const formattedDate = log ? format(toDate(log.timestamp), 'MMM dd, HH:mm:ss.SSS') : '';\n\n return (\n <DataPanel open={!!log} onClose={onClose} title={log ? `Log ${formattedDate}` : 'Log'} depth={depth}>\n {log && (\n <>\n <DataPanel.Header>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.Heading>Log · {formattedDate}</DataPanel.Heading>\n <DataPanel.HeaderActions>\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous log\"\n nextLabel=\"Go to next log\"\n />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <div className=\"grid gap-6 p-2\">\n <DataKeysAndValues>\n {log.entityType && (\n <>\n <DataKeysAndValues.Key>Entity Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityType}</DataKeysAndValues.Value>\n </>\n )}\n {log.entityName && (\n <>\n <DataKeysAndValues.Key>Entity Name</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityName}</DataKeysAndValues.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <DataKeysAndValues.Key>Service</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.serviceName}</DataKeysAndValues.Value>\n </>\n )}\n {log.environment && (\n <>\n <DataKeysAndValues.Key>Environment</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.environment}</DataKeysAndValues.Value>\n </>\n )}\n {log.source && (\n <>\n <DataKeysAndValues.Key>Source</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.source}</DataKeysAndValues.Value>\n </>\n )}\n {log.metadata &&\n Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <DataKeysAndValues.Key>{key}</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(value)}</DataKeysAndValues.Value>\n </Fragment>\n ))}\n </DataKeysAndValues>\n\n <DataPanel.CodeSection title=\"Message\" codeStr={log.message} simplified />\n\n {(log.traceId || log.spanId) && (\n <div className=\"grid gap-2\">\n {log.traceId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n icon={<ArrowRightIcon />}\n onClick={() => log.traceId && onTraceClick?.(log.traceId)}\n >\n <span>Trace</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId} tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && log.spanId && onSpanClick?.(log.traceId, log.spanId)}\n icon={<ArrowRightIcon />}\n >\n <span>Span</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId} tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} />\n )}\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n );\n}\n"],"names":["format","jsx","DataPanel","jsxs","Fragment","DataKeysAndValues","ButtonsGroup","Button","ArrowRightIcon","CopyButton"],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { format } from 'date-fns';
|
|
3
|
+
import { ArrowRightIcon } from 'lucide-react';
|
|
4
|
+
import { Fragment as Fragment$1 } from 'react';
|
|
5
|
+
import { B as Button } from '../../../Button-B8nF87ai.js';
|
|
6
|
+
import { B as ButtonsGroup } from '../../../buttons-group-DsZgrZBZ.js';
|
|
7
|
+
import { C as CopyButton } from '../../../copy-button-DcZ1mdw4.js';
|
|
8
|
+
import { D as DataKeysAndValues } from '../../../data-keys-and-values-BTYDB-K2.js';
|
|
9
|
+
import { D as DataPanel } from '../../../data-panel-BQVTKo86.js';
|
|
10
|
+
|
|
11
|
+
function toDate(value) {
|
|
12
|
+
return value instanceof Date ? value : new Date(value);
|
|
13
|
+
}
|
|
14
|
+
function LogDataPanel({
|
|
15
|
+
log,
|
|
16
|
+
onClose,
|
|
17
|
+
onTraceClick,
|
|
18
|
+
onSpanClick,
|
|
19
|
+
onPrevious,
|
|
20
|
+
onNext,
|
|
21
|
+
depth
|
|
22
|
+
}) {
|
|
23
|
+
const formattedDate = log ? format(toDate(log.timestamp), "MMM dd, HH:mm:ss.SSS") : "";
|
|
24
|
+
return /* @__PURE__ */ jsx(DataPanel, { open: !!log, onClose, title: log ? `Log ${formattedDate}` : "Log", depth, children: log && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
25
|
+
/* @__PURE__ */ jsxs(DataPanel.Header, { children: [
|
|
26
|
+
/* @__PURE__ */ jsx(DataPanel.CloseButton, { onClick: onClose }),
|
|
27
|
+
/* @__PURE__ */ jsxs(DataPanel.Heading, { children: [
|
|
28
|
+
"Log · ",
|
|
29
|
+
formattedDate
|
|
30
|
+
] }),
|
|
31
|
+
/* @__PURE__ */ jsx(DataPanel.HeaderActions, { children: /* @__PURE__ */ jsx(
|
|
32
|
+
DataPanel.NextPrevNav,
|
|
33
|
+
{
|
|
34
|
+
onPrevious,
|
|
35
|
+
onNext,
|
|
36
|
+
previousLabel: "Go to previous log",
|
|
37
|
+
nextLabel: "Go to next log"
|
|
38
|
+
}
|
|
39
|
+
) })
|
|
40
|
+
] }),
|
|
41
|
+
/* @__PURE__ */ jsx(DataPanel.Content, { children: /* @__PURE__ */ jsxs("div", { className: "grid gap-6 p-2", children: [
|
|
42
|
+
/* @__PURE__ */ jsxs(DataKeysAndValues, { children: [
|
|
43
|
+
log.entityType && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
44
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Entity Type" }),
|
|
45
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Value, { children: log.entityType })
|
|
46
|
+
] }),
|
|
47
|
+
log.entityName && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
48
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Entity Name" }),
|
|
49
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Value, { children: log.entityName })
|
|
50
|
+
] }),
|
|
51
|
+
log.serviceName && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
52
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Service" }),
|
|
53
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Value, { children: log.serviceName })
|
|
54
|
+
] }),
|
|
55
|
+
log.environment && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
56
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Environment" }),
|
|
57
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Value, { children: log.environment })
|
|
58
|
+
] }),
|
|
59
|
+
log.source && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
60
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Source" }),
|
|
61
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Value, { children: log.source })
|
|
62
|
+
] }),
|
|
63
|
+
log.metadata && Object.entries(log.metadata).map(([key, value]) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
64
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: key }),
|
|
65
|
+
/* @__PURE__ */ jsx(DataKeysAndValues.Value, { children: String(value) })
|
|
66
|
+
] }, key))
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ jsx(DataPanel.CodeSection, { title: "Message", codeStr: log.message, simplified: true }),
|
|
69
|
+
(log.traceId || log.spanId) && /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
|
|
70
|
+
log.traceId && /* @__PURE__ */ jsxs(ButtonsGroup, { className: "w-full min-w-0", children: [
|
|
71
|
+
/* @__PURE__ */ jsxs(
|
|
72
|
+
Button,
|
|
73
|
+
{
|
|
74
|
+
className: "min-w-0 flex-1 justify-between overflow-hidden",
|
|
75
|
+
icon: /* @__PURE__ */ jsx(ArrowRightIcon, {}),
|
|
76
|
+
onClick: () => log.traceId && onTraceClick?.(log.traceId),
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ jsx("span", { children: "Trace" }),
|
|
79
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-auto min-w-0 truncate text-caption text-placeholder", children: [
|
|
80
|
+
"# ",
|
|
81
|
+
log.traceId
|
|
82
|
+
] })
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsx(CopyButton, { content: log.traceId, tooltip: "Copy Trace ID to clipboard" })
|
|
87
|
+
] }),
|
|
88
|
+
log.spanId && /* @__PURE__ */ jsxs(ButtonsGroup, { className: "w-full min-w-0", children: [
|
|
89
|
+
/* @__PURE__ */ jsxs(
|
|
90
|
+
Button,
|
|
91
|
+
{
|
|
92
|
+
className: "min-w-0 flex-1 justify-between overflow-hidden",
|
|
93
|
+
disabled: !log.traceId || !onSpanClick,
|
|
94
|
+
onClick: () => log.traceId && log.spanId && onSpanClick?.(log.traceId, log.spanId),
|
|
95
|
+
icon: /* @__PURE__ */ jsx(ArrowRightIcon, {}),
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ jsx("span", { children: "Span" }),
|
|
98
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-auto min-w-0 truncate text-caption text-placeholder", children: [
|
|
99
|
+
"# ",
|
|
100
|
+
log.spanId
|
|
101
|
+
] })
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
/* @__PURE__ */ jsx(CopyButton, { content: log.spanId, tooltip: "Copy Span ID to clipboard" })
|
|
106
|
+
] })
|
|
107
|
+
] }),
|
|
108
|
+
log.data && Object.keys(log.data).length > 0 && /* @__PURE__ */ jsx(DataPanel.CodeSection, { title: "Data", codeStr: JSON.stringify(log.data, null, 2) })
|
|
109
|
+
] }) })
|
|
110
|
+
] }) });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { LogDataPanel };
|
|
114
|
+
//# sourceMappingURL=log-data-panel.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-data-panel.es.js","sources":["../../../../src/domains/logs/components/log-data-panel.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ArrowRightIcon } from 'lucide-react';\nimport { Fragment } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n log?: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function LogDataPanel({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n depth,\n}: LogDataPanelProps) {\n const formattedDate = log ? format(toDate(log.timestamp), 'MMM dd, HH:mm:ss.SSS') : '';\n\n return (\n <DataPanel open={!!log} onClose={onClose} title={log ? `Log ${formattedDate}` : 'Log'} depth={depth}>\n {log && (\n <>\n <DataPanel.Header>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.Heading>Log · {formattedDate}</DataPanel.Heading>\n <DataPanel.HeaderActions>\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous log\"\n nextLabel=\"Go to next log\"\n />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <div className=\"grid gap-6 p-2\">\n <DataKeysAndValues>\n {log.entityType && (\n <>\n <DataKeysAndValues.Key>Entity Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityType}</DataKeysAndValues.Value>\n </>\n )}\n {log.entityName && (\n <>\n <DataKeysAndValues.Key>Entity Name</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityName}</DataKeysAndValues.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <DataKeysAndValues.Key>Service</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.serviceName}</DataKeysAndValues.Value>\n </>\n )}\n {log.environment && (\n <>\n <DataKeysAndValues.Key>Environment</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.environment}</DataKeysAndValues.Value>\n </>\n )}\n {log.source && (\n <>\n <DataKeysAndValues.Key>Source</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.source}</DataKeysAndValues.Value>\n </>\n )}\n {log.metadata &&\n Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <DataKeysAndValues.Key>{key}</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(value)}</DataKeysAndValues.Value>\n </Fragment>\n ))}\n </DataKeysAndValues>\n\n <DataPanel.CodeSection title=\"Message\" codeStr={log.message} simplified />\n\n {(log.traceId || log.spanId) && (\n <div className=\"grid gap-2\">\n {log.traceId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n icon={<ArrowRightIcon />}\n onClick={() => log.traceId && onTraceClick?.(log.traceId)}\n >\n <span>Trace</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId} tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && log.spanId && onSpanClick?.(log.traceId, log.spanId)}\n icon={<ArrowRightIcon />}\n >\n <span>Span</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId} tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} />\n )}\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const reactVirtual = require('@tanstack/react-virtual');
|
|
7
7
|
const React = require('react');
|
|
8
|
-
const dataListSkeleton = require('../../../data-list-skeleton-
|
|
8
|
+
const dataListSkeleton = require('../../../data-list-skeleton-CjwR0o3w.cjs');
|
|
9
9
|
const useDataListKeyboard = require('../../../use-data-list-keyboard-DF3tLe10.cjs');
|
|
10
|
-
const logsDataList = require('../../../logs-data-list-
|
|
10
|
+
const logsDataList = require('../../../logs-data-list-YL9yLKF3.cjs');
|
|
11
11
|
|
|
12
12
|
const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
|
|
13
13
|
const ROW_HEIGHT = 36;
|
|
@@ -45,13 +45,13 @@ function LogsListView({
|
|
|
45
45
|
wasLoadingRef.current = isLoading;
|
|
46
46
|
}, [isLoading]);
|
|
47
47
|
if (isLoading) {
|
|
48
|
-
return /* @__PURE__ */ jsxRuntime.jsx(dataListSkeleton.DataListSkeleton, { columns: COLUMNS });
|
|
48
|
+
return /* @__PURE__ */ jsxRuntime.jsx(dataListSkeleton.DataListSkeleton, { columns: COLUMNS, fit: "container" });
|
|
49
49
|
}
|
|
50
50
|
const virtualItems = virtualizer.getVirtualItems();
|
|
51
51
|
const totalSize = virtualizer.getTotalSize();
|
|
52
52
|
const paddingTop = virtualItems[0]?.start ?? 0;
|
|
53
53
|
const paddingBottom = virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;
|
|
54
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(logsDataList.LogsDataList, { columns: COLUMNS, scrollRef, className: "min-w-0", children: [
|
|
54
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(logsDataList.LogsDataList, { columns: COLUMNS, scrollRef, className: "min-w-0", fit: "container", children: [
|
|
55
55
|
/* @__PURE__ */ jsxRuntime.jsxs(logsDataList.LogsDataList.Top, { children: [
|
|
56
56
|
onSortChange ? /* @__PURE__ */ jsxRuntime.jsx(logsDataList.LogsDataList.SortableTopCell, { sortKey: "timestamp", sort: timestampSort, onSortChange, children: "Date" }) : /* @__PURE__ */ jsxRuntime.jsx(logsDataList.LogsDataList.TopCell, { children: "Date" }),
|
|
57
57
|
/* @__PURE__ */ jsxRuntime.jsx(logsDataList.LogsDataList.TopCell, { children: "Time" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs-list-view.cjs.js","sources":["../../../../src/domains/logs/components/logs-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { useDataListKeyboard } from '@/ds/components/DataList';\nimport type { DataListSort } from '@/ds/components/DataList';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n /** Current timestamp sort direction. When `onSortChange` is provided the Date/Time headers become sortable. */\n timestampSort?: DataListSort;\n onSortChange?: (direction: DataListSort, key: 'timestamp') => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n timestampSort,\n onSortChange,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: logs.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n global: true,\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS} scrollRef={scrollRef} className=\"min-w-0\">\n <LogsDataList.Top>\n {onSortChange ? (\n <LogsDataList.SortableTopCell sortKey=\"timestamp\" sort={timestampSort} onSortChange={onSortChange}>\n Date\n </LogsDataList.SortableTopCell>\n ) : (\n <LogsDataList.TopCell>Date</LogsDataList.TopCell>\n )}\n <LogsDataList.TopCell>Time</LogsDataList.TopCell>\n <LogsDataList.TopCell>Level</LogsDataList.TopCell>\n <LogsDataList.TopCell>Entity</LogsDataList.TopCell>\n <LogsDataList.TopCell>Message</LogsDataList.TopCell>\n <LogsDataList.TopCell>Data</LogsDataList.TopCell>\n </LogsDataList.Top>\n\n {logs.length === 0 ? (\n <LogsDataList.NoMatch message=\"No logs match your search\" />\n ) : (\n <>\n <LogsDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const log = logs[vi.index];\n if (!log) return null;\n const id = logIdMap.get(log);\n // Defensive: consumer is expected to build `logIdMap` from the same `logs` list\n // (via `useLogsListNavigation`), but if they drift we'd rather drop the row than\n // ship a missing-key warning and broken selection highlighting.\n if (!id) return null;\n const isFeatured = id === featuredLogId;\n\n return (\n <LogsDataList.RowButton\n key={id}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n {...getRowProps(vi.index)}\n onClick={() => onLogClick(log)}\n featured={isFeatured}\n variant={log.level === 'error' || log.level === 'fatal' ? 'error' : 'default'}\n >\n <LogsDataList.DateCell timestamp={log.timestamp} />\n <LogsDataList.TimeCell timestamp={log.timestamp} />\n <LogsDataList.LevelCell level={log.level} />\n <LogsDataList.EntityCell entityType={log.entityType} entityName={log.entityName} />\n <LogsDataList.MessageCell message={log.message} />\n <LogsDataList.DataCell data={log.data} />\n </LogsDataList.RowButton>\n );\n })}\n <LogsDataList.Spacer height={paddingBottom} />\n </>\n )}\n <LogsDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </LogsDataList>\n );\n}\n"],"names":["useRef","useVirtualizer","useDataListKeyboard","useEffect","jsx","LogsDataListSkeleton","LogsDataList","jsxs","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"logs-list-view.cjs.js","sources":["../../../../src/domains/logs/components/logs-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { useDataListKeyboard } from '@/ds/components/DataList';\nimport type { DataListSort } from '@/ds/components/DataList';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n /** Current timestamp sort direction. When `onSortChange` is provided the Date/Time headers become sortable. */\n timestampSort?: DataListSort;\n onSortChange?: (direction: DataListSort, key: 'timestamp') => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n timestampSort,\n onSortChange,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: logs.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n global: true,\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} fit=\"container\" />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS} scrollRef={scrollRef} className=\"min-w-0\" fit=\"container\">\n <LogsDataList.Top>\n {onSortChange ? (\n <LogsDataList.SortableTopCell sortKey=\"timestamp\" sort={timestampSort} onSortChange={onSortChange}>\n Date\n </LogsDataList.SortableTopCell>\n ) : (\n <LogsDataList.TopCell>Date</LogsDataList.TopCell>\n )}\n <LogsDataList.TopCell>Time</LogsDataList.TopCell>\n <LogsDataList.TopCell>Level</LogsDataList.TopCell>\n <LogsDataList.TopCell>Entity</LogsDataList.TopCell>\n <LogsDataList.TopCell>Message</LogsDataList.TopCell>\n <LogsDataList.TopCell>Data</LogsDataList.TopCell>\n </LogsDataList.Top>\n\n {logs.length === 0 ? (\n <LogsDataList.NoMatch message=\"No logs match your search\" />\n ) : (\n <>\n <LogsDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const log = logs[vi.index];\n if (!log) return null;\n const id = logIdMap.get(log);\n // Defensive: consumer is expected to build `logIdMap` from the same `logs` list\n // (via `useLogsListNavigation`), but if they drift we'd rather drop the row than\n // ship a missing-key warning and broken selection highlighting.\n if (!id) return null;\n const isFeatured = id === featuredLogId;\n\n return (\n <LogsDataList.RowButton\n key={id}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n {...getRowProps(vi.index)}\n onClick={() => onLogClick(log)}\n featured={isFeatured}\n variant={log.level === 'error' || log.level === 'fatal' ? 'error' : 'default'}\n >\n <LogsDataList.DateCell timestamp={log.timestamp} />\n <LogsDataList.TimeCell timestamp={log.timestamp} />\n <LogsDataList.LevelCell level={log.level} />\n <LogsDataList.EntityCell entityType={log.entityType} entityName={log.entityName} />\n <LogsDataList.MessageCell message={log.message} />\n <LogsDataList.DataCell data={log.data} />\n </LogsDataList.RowButton>\n );\n })}\n <LogsDataList.Spacer height={paddingBottom} />\n </>\n )}\n <LogsDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </LogsDataList>\n );\n}\n"],"names":["useRef","useVirtualizer","useDataListKeyboard","useEffect","jsx","LogsDataListSkeleton","jsxs","LogsDataList","Fragment"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
3
3
|
import { useRef, useEffect } from 'react';
|
|
4
|
-
import { D as DataListSkeleton } from '../../../data-list-skeleton-
|
|
4
|
+
import { D as DataListSkeleton } from '../../../data-list-skeleton-DAfM8AjW.js';
|
|
5
5
|
import { u as useDataListKeyboard } from '../../../use-data-list-keyboard-DFQr4t38.js';
|
|
6
|
-
import { L as LogsDataList } from '../../../logs-data-list-
|
|
6
|
+
import { L as LogsDataList } from '../../../logs-data-list-5BAeLU57.js';
|
|
7
7
|
|
|
8
8
|
const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
|
|
9
9
|
const ROW_HEIGHT = 36;
|
|
@@ -41,13 +41,13 @@ function LogsListView({
|
|
|
41
41
|
wasLoadingRef.current = isLoading;
|
|
42
42
|
}, [isLoading]);
|
|
43
43
|
if (isLoading) {
|
|
44
|
-
return /* @__PURE__ */ jsx(DataListSkeleton, { columns: COLUMNS });
|
|
44
|
+
return /* @__PURE__ */ jsx(DataListSkeleton, { columns: COLUMNS, fit: "container" });
|
|
45
45
|
}
|
|
46
46
|
const virtualItems = virtualizer.getVirtualItems();
|
|
47
47
|
const totalSize = virtualizer.getTotalSize();
|
|
48
48
|
const paddingTop = virtualItems[0]?.start ?? 0;
|
|
49
49
|
const paddingBottom = virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;
|
|
50
|
-
return /* @__PURE__ */ jsxs(LogsDataList, { columns: COLUMNS, scrollRef, className: "min-w-0", children: [
|
|
50
|
+
return /* @__PURE__ */ jsxs(LogsDataList, { columns: COLUMNS, scrollRef, className: "min-w-0", fit: "container", children: [
|
|
51
51
|
/* @__PURE__ */ jsxs(LogsDataList.Top, { children: [
|
|
52
52
|
onSortChange ? /* @__PURE__ */ jsx(LogsDataList.SortableTopCell, { sortKey: "timestamp", sort: timestampSort, onSortChange, children: "Date" }) : /* @__PURE__ */ jsx(LogsDataList.TopCell, { children: "Date" }),
|
|
53
53
|
/* @__PURE__ */ jsx(LogsDataList.TopCell, { children: "Time" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs-list-view.es.js","sources":["../../../../src/domains/logs/components/logs-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { useDataListKeyboard } from '@/ds/components/DataList';\nimport type { DataListSort } from '@/ds/components/DataList';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n /** Current timestamp sort direction. When `onSortChange` is provided the Date/Time headers become sortable. */\n timestampSort?: DataListSort;\n onSortChange?: (direction: DataListSort, key: 'timestamp') => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n timestampSort,\n onSortChange,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: logs.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n global: true,\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS} scrollRef={scrollRef} className=\"min-w-0\">\n <LogsDataList.Top>\n {onSortChange ? (\n <LogsDataList.SortableTopCell sortKey=\"timestamp\" sort={timestampSort} onSortChange={onSortChange}>\n Date\n </LogsDataList.SortableTopCell>\n ) : (\n <LogsDataList.TopCell>Date</LogsDataList.TopCell>\n )}\n <LogsDataList.TopCell>Time</LogsDataList.TopCell>\n <LogsDataList.TopCell>Level</LogsDataList.TopCell>\n <LogsDataList.TopCell>Entity</LogsDataList.TopCell>\n <LogsDataList.TopCell>Message</LogsDataList.TopCell>\n <LogsDataList.TopCell>Data</LogsDataList.TopCell>\n </LogsDataList.Top>\n\n {logs.length === 0 ? (\n <LogsDataList.NoMatch message=\"No logs match your search\" />\n ) : (\n <>\n <LogsDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const log = logs[vi.index];\n if (!log) return null;\n const id = logIdMap.get(log);\n // Defensive: consumer is expected to build `logIdMap` from the same `logs` list\n // (via `useLogsListNavigation`), but if they drift we'd rather drop the row than\n // ship a missing-key warning and broken selection highlighting.\n if (!id) return null;\n const isFeatured = id === featuredLogId;\n\n return (\n <LogsDataList.RowButton\n key={id}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n {...getRowProps(vi.index)}\n onClick={() => onLogClick(log)}\n featured={isFeatured}\n variant={log.level === 'error' || log.level === 'fatal' ? 'error' : 'default'}\n >\n <LogsDataList.DateCell timestamp={log.timestamp} />\n <LogsDataList.TimeCell timestamp={log.timestamp} />\n <LogsDataList.LevelCell level={log.level} />\n <LogsDataList.EntityCell entityType={log.entityType} entityName={log.entityName} />\n <LogsDataList.MessageCell message={log.message} />\n <LogsDataList.DataCell data={log.data} />\n </LogsDataList.RowButton>\n );\n })}\n <LogsDataList.Spacer height={paddingBottom} />\n </>\n )}\n <LogsDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </LogsDataList>\n );\n}\n"],"names":["LogsDataListSkeleton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"logs-list-view.es.js","sources":["../../../../src/domains/logs/components/logs-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { useDataListKeyboard } from '@/ds/components/DataList';\nimport type { DataListSort } from '@/ds/components/DataList';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n /** Current timestamp sort direction. When `onSortChange` is provided the Date/Time headers become sortable. */\n timestampSort?: DataListSort;\n onSortChange?: (direction: DataListSort, key: 'timestamp') => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n timestampSort,\n onSortChange,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: logs.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n global: true,\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} fit=\"container\" />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS} scrollRef={scrollRef} className=\"min-w-0\" fit=\"container\">\n <LogsDataList.Top>\n {onSortChange ? (\n <LogsDataList.SortableTopCell sortKey=\"timestamp\" sort={timestampSort} onSortChange={onSortChange}>\n Date\n </LogsDataList.SortableTopCell>\n ) : (\n <LogsDataList.TopCell>Date</LogsDataList.TopCell>\n )}\n <LogsDataList.TopCell>Time</LogsDataList.TopCell>\n <LogsDataList.TopCell>Level</LogsDataList.TopCell>\n <LogsDataList.TopCell>Entity</LogsDataList.TopCell>\n <LogsDataList.TopCell>Message</LogsDataList.TopCell>\n <LogsDataList.TopCell>Data</LogsDataList.TopCell>\n </LogsDataList.Top>\n\n {logs.length === 0 ? (\n <LogsDataList.NoMatch message=\"No logs match your search\" />\n ) : (\n <>\n <LogsDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const log = logs[vi.index];\n if (!log) return null;\n const id = logIdMap.get(log);\n // Defensive: consumer is expected to build `logIdMap` from the same `logs` list\n // (via `useLogsListNavigation`), but if they drift we'd rather drop the row than\n // ship a missing-key warning and broken selection highlighting.\n if (!id) return null;\n const isFeatured = id === featuredLogId;\n\n return (\n <LogsDataList.RowButton\n key={id}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n {...getRowProps(vi.index)}\n onClick={() => onLogClick(log)}\n featured={isFeatured}\n variant={log.level === 'error' || log.level === 'fatal' ? 'error' : 'default'}\n >\n <LogsDataList.DateCell timestamp={log.timestamp} />\n <LogsDataList.TimeCell timestamp={log.timestamp} />\n <LogsDataList.LevelCell level={log.level} />\n <LogsDataList.EntityCell entityType={log.entityType} entityName={log.entityName} />\n <LogsDataList.MessageCell message={log.message} />\n <LogsDataList.DataCell data={log.data} />\n </LogsDataList.RowButton>\n );\n })}\n <LogsDataList.Spacer height={paddingBottom} />\n </>\n )}\n <LogsDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </LogsDataList>\n );\n}\n"],"names":["LogsDataListSkeleton"],"mappings":"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"}
|
|
@@ -2,18 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const domains_logs_components_logDataPanel = require('./components/log-data-panel.cjs.js');
|
|
6
6
|
const domains_logs_components_logsErrorContent = require('./components/logs-error-content.cjs.js');
|
|
7
|
-
const domains_logs_components_logsLayout = require('./components/logs-layout.cjs.js');
|
|
8
7
|
const domains_logs_components_logsListView = require('./components/logs-list-view.cjs.js');
|
|
9
8
|
const domains_logs_components_logsToolbar = require('./components/logs-toolbar.cjs.js');
|
|
10
9
|
const domains_logs_components_noLogsInfo = require('./components/no-logs-info.cjs.js');
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
|
|
14
|
-
exports.
|
|
13
|
+
exports.LogDataPanel = domains_logs_components_logDataPanel.LogDataPanel;
|
|
15
14
|
exports.LogsErrorContent = domains_logs_components_logsErrorContent.LogsErrorContent;
|
|
16
|
-
exports.LogsLayout = domains_logs_components_logsLayout.LogsLayout;
|
|
17
15
|
exports.LogsListView = domains_logs_components_logsListView.LogsListView;
|
|
18
16
|
exports.LogsToolbar = domains_logs_components_logsToolbar.LogsToolbar;
|
|
19
17
|
exports.NoLogsInfo = domains_logs_components_noLogsInfo.NoLogsInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"components.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { LogDataPanel } from './components/log-data-panel.es.js';
|
|
2
2
|
export { LogsErrorContent } from './components/logs-error-content.es.js';
|
|
3
|
-
export { LogsLayout } from './components/logs-layout.es.js';
|
|
4
3
|
export { LogsListView } from './components/logs-list-view.es.js';
|
|
5
4
|
export { LogsToolbar } from './components/logs-toolbar.es.js';
|
|
6
5
|
export { NoLogsInfo } from './components/no-logs-info.es.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"components.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/dist/domains/logs.cjs.js
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const domains_logs_components_logDataPanel = require('./logs/components/log-data-panel.cjs.js');
|
|
6
6
|
const domains_logs_components_logsErrorContent = require('./logs/components/logs-error-content.cjs.js');
|
|
7
|
-
const domains_logs_components_logsLayout = require('./logs/components/logs-layout.cjs.js');
|
|
8
7
|
const domains_logs_components_logsListView = require('./logs/components/logs-list-view.cjs.js');
|
|
9
8
|
const domains_logs_components_logsToolbar = require('./logs/components/logs-toolbar.cjs.js');
|
|
10
9
|
const domains_logs_components_noLogsInfo = require('./logs/components/no-logs-info.cjs.js');
|
|
@@ -16,9 +15,8 @@ const domains_logs_logFilters = require('./logs/log-filters.cjs.js');
|
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
|
|
19
|
-
exports.
|
|
18
|
+
exports.LogDataPanel = domains_logs_components_logDataPanel.LogDataPanel;
|
|
20
19
|
exports.LogsErrorContent = domains_logs_components_logsErrorContent.LogsErrorContent;
|
|
21
|
-
exports.LogsLayout = domains_logs_components_logsLayout.LogsLayout;
|
|
22
20
|
exports.LogsListView = domains_logs_components_logsListView.LogsListView;
|
|
23
21
|
exports.LogsToolbar = domains_logs_components_logsToolbar.LogsToolbar;
|
|
24
22
|
exports.NoLogsInfo = domains_logs_components_noLogsInfo.NoLogsInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logs.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/domains/logs.es.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { LogDataPanel } from './logs/components/log-data-panel.es.js';
|
|
2
2
|
export { LogsErrorContent } from './logs/components/logs-error-content.es.js';
|
|
3
|
-
export { LogsLayout } from './logs/components/logs-layout.es.js';
|
|
4
3
|
export { LogsListView } from './logs/components/logs-list-view.es.js';
|
|
5
4
|
export { LogsToolbar } from './logs/components/logs-toolbar.es.js';
|
|
6
5
|
export { NoLogsInfo } from './logs/components/no-logs-info.es.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logs.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useMemo, useEffect } from 'react';
|
|
3
3
|
import { C as Checkbox } from '../../../checkbox-CQedzgsi.js';
|
|
4
|
-
import { C as CodeDiff } from '../../../code-diff-
|
|
4
|
+
import { C as CodeDiff } from '../../../code-diff-Hao35skN.js';
|
|
5
5
|
import { E as EmptyState } from '../../../EmptyState-Bc4nJ9QH.js';
|
|
6
6
|
import { S as Skeleton } from '../../../skeleton-BsRAXyh5.js';
|
|
7
7
|
import { c as cn } from '../../../cn-65Adrsfj.js';
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const React = require('react');
|
|
7
|
-
const dataList = require('../../../data-list-
|
|
7
|
+
const dataList = require('../../../data-list-PwFpP_mo.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-DCCHIG-z.cjs');
|
|
9
9
|
const tabsContent = require('../../../tabs-content-DlCJoQUW.cjs');
|
|
10
10
|
const tabsRoot = require('../../../tabs-root-COCL6jcx.cjs');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
|
-
import { D as DataList } from '../../../data-list-
|
|
3
|
+
import { D as DataList } from '../../../data-list-DisTjDHP.js';
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-Bzm6m1dy.js';
|
|
5
5
|
import { T as TabContent } from '../../../tabs-content-7ODUUdQ0.js';
|
|
6
6
|
import { a as Tabs, T as TabList } from '../../../tabs-root-UNPxoGhW.js';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
const dataList = require('../../../data-list-
|
|
6
|
+
const dataList = require('../../../data-list-PwFpP_mo.cjs');
|
|
7
7
|
const metricsCard = require('../../../metrics-card-DCCHIG-z.cjs');
|
|
8
8
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
9
9
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { D as DataList } from '../../../data-list-
|
|
2
|
+
import { D as DataList } from '../../../data-list-DisTjDHP.js';
|
|
3
3
|
import { M as MetricsCard } from '../../../metrics-card-Bzm6m1dy.js';
|
|
4
4
|
import { formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils.es.js';
|
|
5
5
|
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const React = require('react');
|
|
7
|
-
const dataList = require('../../../data-list-
|
|
7
|
+
const dataList = require('../../../data-list-PwFpP_mo.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-DCCHIG-z.cjs');
|
|
9
9
|
const metricsLineChart = require('../../../metrics-line-chart-0FR3SYSt.cjs');
|
|
10
10
|
const tabsContent = require('../../../tabs-content-DlCJoQUW.cjs');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
|
-
import { D as DataList } from '../../../data-list-
|
|
3
|
+
import { D as DataList } from '../../../data-list-DisTjDHP.js';
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-Bzm6m1dy.js';
|
|
5
5
|
import { M as MetricsLineChart } from '../../../metrics-line-chart-knlgw8bV.js';
|
|
6
6
|
import { T as TabContent } from '../../../tabs-content-7ODUUdQ0.js';
|