@flanksource/clicky-ui 0.3.54 → 0.3.56
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/NOTICE.md +6 -0
- package/dist/ai.cjs +6 -0
- package/dist/ai.js +3 -1
- package/dist/chat.cjs +2 -0
- package/dist/chat.d.ts +1 -0
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +2 -1
- package/dist/comments/CommentCard.cjs +37 -7
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts +11 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +37 -7
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +9 -4
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +9 -4
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/CommentComposer.cjs +8 -8
- package/dist/comments/CommentComposer.cjs.map +1 -1
- package/dist/comments/CommentComposer.d.ts.map +1 -1
- package/dist/comments/CommentComposer.js +8 -8
- package/dist/comments/CommentComposer.js.map +1 -1
- package/dist/comments/CommentProvider.cjs +5 -1
- package/dist/comments/CommentProvider.cjs.map +1 -1
- package/dist/comments/CommentProvider.d.ts +1 -1
- package/dist/comments/CommentProvider.d.ts.map +1 -1
- package/dist/comments/CommentProvider.js +5 -1
- package/dist/comments/CommentProvider.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +17 -11
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts +6 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +17 -11
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +4 -1
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +4 -1
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +4 -1
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +6 -3
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +7 -2
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +6 -3
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/comments/MentionTextarea.cjs +1 -1
- package/dist/comments/MentionTextarea.cjs.map +1 -1
- package/dist/comments/MentionTextarea.d.ts.map +1 -1
- package/dist/comments/MentionTextarea.js +1 -1
- package/dist/comments/MentionTextarea.js.map +1 -1
- package/dist/comments/comment-assign.cjs +68 -0
- package/dist/comments/comment-assign.cjs.map +1 -0
- package/dist/comments/comment-assign.d.ts +31 -0
- package/dist/comments/comment-assign.d.ts.map +1 -0
- package/dist/comments/comment-assign.js +67 -0
- package/dist/comments/comment-assign.js.map +1 -0
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +39 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/comments/comment-utils.cjs +2 -0
- package/dist/comments/comment-utils.cjs.map +1 -1
- package/dist/comments/comment-utils.d.ts +2 -0
- package/dist/comments/comment-utils.d.ts.map +1 -1
- package/dist/comments/comment-utils.js +2 -0
- package/dist/comments/comment-utils.js.map +1 -1
- package/dist/comments.cjs +3 -0
- package/dist/comments.d.ts +1 -0
- package/dist/comments.d.ts.map +1 -1
- package/dist/comments.js +2 -1
- package/dist/components/ComboboxMenu.cjs +23 -13
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +23 -13
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/FilterBar.cjs +29 -6
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +3 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +29 -6
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/ItemActions.cjs +1 -1
- package/dist/components/ItemActions.cjs.map +1 -1
- package/dist/components/ItemActions.js +1 -1
- package/dist/components/ItemActions.js.map +1 -1
- package/dist/components/ListMenu.cjs +33 -3
- package/dist/components/ListMenu.cjs.map +1 -1
- package/dist/components/ListMenu.d.ts +4 -1
- package/dist/components/ListMenu.d.ts.map +1 -1
- package/dist/components/ListMenu.js +33 -3
- package/dist/components/ListMenu.js.map +1 -1
- package/dist/components/ListMenuItems.cjs +80 -0
- package/dist/components/ListMenuItems.cjs.map +1 -0
- package/dist/components/ListMenuItems.d.ts +8 -0
- package/dist/components/ListMenuItems.d.ts.map +1 -0
- package/dist/components/ListMenuItems.js +80 -0
- package/dist/components/ListMenuItems.js.map +1 -0
- package/dist/components/LocalPathPicker.cjs +182 -0
- package/dist/components/LocalPathPicker.cjs.map +1 -0
- package/dist/components/LocalPathPicker.d.ts +11 -0
- package/dist/components/LocalPathPicker.d.ts.map +1 -0
- package/dist/components/LocalPathPicker.js +182 -0
- package/dist/components/LocalPathPicker.js.map +1 -0
- package/dist/components/LocalPathTree.cjs +89 -0
- package/dist/components/LocalPathTree.cjs.map +1 -0
- package/dist/components/LocalPathTree.d.ts +9 -0
- package/dist/components/LocalPathTree.d.ts.map +1 -0
- package/dist/components/LocalPathTree.js +89 -0
- package/dist/components/LocalPathTree.js.map +1 -0
- package/dist/components/RangeSlider.cjs +10 -30
- package/dist/components/RangeSlider.cjs.map +1 -1
- package/dist/components/RangeSlider.d.ts.map +1 -1
- package/dist/components/RangeSlider.js +4 -24
- package/dist/components/RangeSlider.js.map +1 -1
- package/dist/components/Slider.cjs +79 -0
- package/dist/components/Slider.cjs.map +1 -0
- package/dist/components/Slider.d.ts +23 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Slider.js +79 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/combobox-types.d.ts +4 -1
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/filter-bar-field-utils.cjs +3 -5
- package/dist/components/filter-bar-field-utils.cjs.map +1 -1
- package/dist/components/filter-bar-field-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-field-utils.js +3 -5
- package/dist/components/filter-bar-field-utils.js.map +1 -1
- package/dist/components/filter-bar-tree-model.cjs +22 -0
- package/dist/components/filter-bar-tree-model.cjs.map +1 -0
- package/dist/components/filter-bar-tree-model.d.ts +33 -0
- package/dist/components/filter-bar-tree-model.d.ts.map +1 -0
- package/dist/components/filter-bar-tree-model.js +21 -0
- package/dist/components/filter-bar-tree-model.js.map +1 -0
- package/dist/components/filter-bar-tree.cjs +84 -0
- package/dist/components/filter-bar-tree.cjs.map +1 -0
- package/dist/components/filter-bar-tree.d.ts +7 -0
- package/dist/components/filter-bar-tree.d.ts.map +1 -0
- package/dist/components/filter-bar-tree.js +84 -0
- package/dist/components/filter-bar-tree.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +2 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -1
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -1
- package/dist/components/json-schema-form-debug-glyph-map.js +2 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -1
- package/dist/components/json-schema-form-help-links.cjs +18 -0
- package/dist/components/json-schema-form-help-links.cjs.map +1 -0
- package/dist/components/json-schema-form-help-links.d.ts +5 -0
- package/dist/components/json-schema-form-help-links.d.ts.map +1 -0
- package/dist/components/json-schema-form-help-links.js +18 -0
- package/dist/components/json-schema-form-help-links.js.map +1 -0
- package/dist/components/json-schema-form-help-model.cjs +7 -0
- package/dist/components/json-schema-form-help-model.cjs.map +1 -0
- package/dist/components/json-schema-form-help-model.d.ts +3 -0
- package/dist/components/json-schema-form-help-model.d.ts.map +1 -0
- package/dist/components/json-schema-form-help-model.js +7 -0
- package/dist/components/json-schema-form-help-model.js.map +1 -0
- package/dist/components/json-schema-form-json.cjs +48 -0
- package/dist/components/json-schema-form-json.cjs.map +1 -0
- package/dist/components/json-schema-form-json.d.ts +7 -0
- package/dist/components/json-schema-form-json.d.ts.map +1 -0
- package/dist/components/json-schema-form-json.js +48 -0
- package/dist/components/json-schema-form-json.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +7 -5
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +2 -2
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +7 -5
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +2 -13
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +2 -13
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-refs.cjs +1 -1
- package/dist/components/json-schema-form-refs.cjs.map +1 -1
- package/dist/components/json-schema-form-refs.d.ts.map +1 -1
- package/dist/components/json-schema-form-refs.js +1 -1
- package/dist/components/json-schema-form-refs.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +20 -6
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +20 -6
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +22 -2
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +22 -2
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +5 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-union-model.cjs +46 -0
- package/dist/components/json-schema-form-union-model.cjs.map +1 -0
- package/dist/components/json-schema-form-union-model.d.ts +6 -0
- package/dist/components/json-schema-form-union-model.d.ts.map +1 -0
- package/dist/components/json-schema-form-union-model.js +43 -0
- package/dist/components/json-schema-form-union-model.js.map +1 -0
- package/dist/components/json-schema-form-union.cjs +52 -0
- package/dist/components/json-schema-form-union.cjs.map +1 -0
- package/dist/components/json-schema-form-union.d.ts +7 -0
- package/dist/components/json-schema-form-union.d.ts.map +1 -0
- package/dist/components/json-schema-form-union.js +52 -0
- package/dist/components/json-schema-form-union.js.map +1 -0
- package/dist/components/list-menu-virtual.cjs +5 -0
- package/dist/components/list-menu-virtual.cjs.map +1 -0
- package/dist/components/list-menu-virtual.d.ts +12 -0
- package/dist/components/list-menu-virtual.d.ts.map +1 -0
- package/dist/components/list-menu-virtual.js +6 -0
- package/dist/components/list-menu-virtual.js.map +1 -0
- package/dist/components/local-path.cjs +12 -0
- package/dist/components/local-path.cjs.map +1 -0
- package/dist/components/local-path.d.ts +14 -0
- package/dist/components/local-path.d.ts.map +1 -0
- package/dist/components/local-path.js +12 -0
- package/dist/components/local-path.js.map +1 -0
- package/dist/components/slider-shared.cjs +32 -0
- package/dist/components/slider-shared.cjs.map +1 -0
- package/dist/components/slider-shared.d.ts +18 -0
- package/dist/components/slider-shared.d.ts.map +1 -0
- package/dist/components/slider-shared.js +27 -0
- package/dist/components/slider-shared.js.map +1 -0
- package/dist/components.cjs +8 -0
- package/dist/components.d.ts +6 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +5 -1
- package/dist/connections/ConnectionsPage.cjs +51 -19
- package/dist/connections/ConnectionsPage.cjs.map +1 -1
- package/dist/connections/ConnectionsPage.d.ts +9 -1
- package/dist/connections/ConnectionsPage.d.ts.map +1 -1
- package/dist/connections/ConnectionsPage.js +52 -20
- package/dist/connections/ConnectionsPage.js.map +1 -1
- package/dist/connections/connectionDashboard.cjs +13 -8
- package/dist/connections/connectionDashboard.cjs.map +1 -1
- package/dist/connections/connectionDashboard.d.ts +8 -3
- package/dist/connections/connectionDashboard.d.ts.map +1 -1
- package/dist/connections/connectionDashboard.js +14 -9
- package/dist/connections/connectionDashboard.js.map +1 -1
- package/dist/connections/connectionDashboardModel.cjs.map +1 -1
- package/dist/connections/connectionDashboardModel.d.ts +4 -0
- package/dist/connections/connectionDashboardModel.d.ts.map +1 -1
- package/dist/connections/connectionDashboardModel.js.map +1 -1
- package/dist/connections/connectionDashboardRow.cjs +75 -55
- package/dist/connections/connectionDashboardRow.cjs.map +1 -1
- package/dist/connections/connectionDashboardRow.d.ts +3 -2
- package/dist/connections/connectionDashboardRow.d.ts.map +1 -1
- package/dist/connections/connectionDashboardRow.js +75 -55
- package/dist/connections/connectionDashboardRow.js.map +1 -1
- package/dist/connections/connectionNamespaceField.cjs +17 -0
- package/dist/connections/connectionNamespaceField.cjs.map +1 -0
- package/dist/connections/connectionNamespaceField.d.ts +10 -0
- package/dist/connections/connectionNamespaceField.d.ts.map +1 -0
- package/dist/connections/connectionNamespaceField.js +17 -0
- package/dist/connections/connectionNamespaceField.js.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.cjs +98 -0
- package/dist/connections/connectionSchemaFormExtensions.cjs.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.d.ts +41 -0
- package/dist/connections/connectionSchemaFormExtensions.d.ts.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.js +96 -0
- package/dist/connections/connectionSchemaFormExtensions.js.map +1 -0
- package/dist/connections/connectionsPageModel.cjs +11 -0
- package/dist/connections/connectionsPageModel.cjs.map +1 -1
- package/dist/connections/connectionsPageModel.d.ts +5 -0
- package/dist/connections/connectionsPageModel.d.ts.map +1 -1
- package/dist/connections/connectionsPageModel.js +11 -1
- package/dist/connections/connectionsPageModel.js.map +1 -1
- package/dist/connections.cjs +5 -0
- package/dist/connections.d.ts +2 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +3 -2
- package/dist/data/AvatarBadge.cjs +3 -3
- package/dist/data/AvatarBadge.cjs.map +1 -1
- package/dist/data/AvatarBadge.js +3 -3
- package/dist/data/AvatarBadge.js.map +1 -1
- package/dist/data/CodeDiff.cjs +2 -0
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.js +2 -0
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/DataTable.cjs +3 -2
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +3 -2
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Gauge.cjs +1 -1
- package/dist/data/Gauge.cjs.map +1 -1
- package/dist/data/Gauge.js +1 -1
- package/dist/data/Gauge.js.map +1 -1
- package/dist/data/HighlightedTokens.cjs +2 -10
- package/dist/data/HighlightedTokens.cjs.map +1 -1
- package/dist/data/HighlightedTokens.d.ts.map +1 -1
- package/dist/data/HighlightedTokens.js +1 -9
- package/dist/data/HighlightedTokens.js.map +1 -1
- package/dist/data/Markdown.cjs +38 -11
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +9 -1
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +39 -12
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/MultiGaugeBar.cjs +157 -0
- package/dist/data/MultiGaugeBar.cjs.map +1 -0
- package/dist/data/MultiGaugeBar.d.ts +29 -0
- package/dist/data/MultiGaugeBar.d.ts.map +1 -0
- package/dist/data/MultiGaugeBar.js +157 -0
- package/dist/data/MultiGaugeBar.js.map +1 -0
- package/dist/data/OpenInFilesLink.cjs +27 -0
- package/dist/data/OpenInFilesLink.cjs.map +1 -0
- package/dist/data/OpenInFilesLink.d.ts +15 -0
- package/dist/data/OpenInFilesLink.d.ts.map +1 -0
- package/dist/data/OpenInFilesLink.js +27 -0
- package/dist/data/OpenInFilesLink.js.map +1 -0
- package/dist/data/ProgressBar.cjs +5 -3
- package/dist/data/ProgressBar.cjs.map +1 -1
- package/dist/data/ProgressBar.d.ts +5 -1
- package/dist/data/ProgressBar.d.ts.map +1 -1
- package/dist/data/ProgressBar.js +5 -3
- package/dist/data/ProgressBar.js.map +1 -1
- package/dist/data/ProgressBars.cjs +13 -5
- package/dist/data/ProgressBars.cjs.map +1 -1
- package/dist/data/ProgressBars.d.ts +6 -1
- package/dist/data/ProgressBars.d.ts.map +1 -1
- package/dist/data/ProgressBars.js +13 -5
- package/dist/data/ProgressBars.js.map +1 -1
- package/dist/data/Properties.cjs +3 -3
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.js +3 -3
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/TaskProgress.cjs +14 -6
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +3 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +14 -6
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskPrompts.cjs +96 -0
- package/dist/data/TaskPrompts.cjs.map +1 -0
- package/dist/data/TaskPrompts.d.ts +6 -0
- package/dist/data/TaskPrompts.d.ts.map +1 -0
- package/dist/data/TaskPrompts.js +96 -0
- package/dist/data/TaskPrompts.js.map +1 -0
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +3 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.cjs +7 -3
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +8 -4
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesGauge.cjs +12 -5
- package/dist/data/TimeseriesGauge.cjs.map +1 -1
- package/dist/data/TimeseriesGauge.d.ts.map +1 -1
- package/dist/data/TimeseriesGauge.js +13 -6
- package/dist/data/TimeseriesGauge.js.map +1 -1
- package/dist/data/TimeseriesPanel.cjs +10 -9
- package/dist/data/TimeseriesPanel.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.d.ts +1 -1
- package/dist/data/TimeseriesPanel.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.js +11 -10
- package/dist/data/TimeseriesPanel.js.map +1 -1
- package/dist/data/TimeseriesPanel.model.cjs +62 -10
- package/dist/data/TimeseriesPanel.model.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.model.d.ts +40 -1
- package/dist/data/TimeseriesPanel.model.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.model.js +62 -11
- package/dist/data/TimeseriesPanel.model.js.map +1 -1
- package/dist/data/WorkloadCard.cjs +7 -3
- package/dist/data/WorkloadCard.cjs.map +1 -1
- package/dist/data/WorkloadCard.d.ts +3 -1
- package/dist/data/WorkloadCard.d.ts.map +1 -1
- package/dist/data/WorkloadCard.js +7 -3
- package/dist/data/WorkloadCard.js.map +1 -1
- package/dist/data/WorkloadCard.model.cjs.map +1 -1
- package/dist/data/WorkloadCard.model.d.ts +2 -0
- package/dist/data/WorkloadCard.model.d.ts.map +1 -1
- package/dist/data/WorkloadCard.model.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +2 -1
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.placement.d.ts +1 -1
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.placement.js +2 -1
- package/dist/data/ai/ChatWindow.placement.js.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.cjs +2 -2
- package/dist/data/ai/SpecRuntimeBar.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.d.ts +4 -1
- package/dist/data/ai/SpecRuntimeBar.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.js +2 -2
- package/dist/data/ai/SpecRuntimeBar.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs +2 -2
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.js +2 -2
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/index.d.ts +2 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-prompt-run-stream.cjs +126 -0
- package/dist/data/ai/use-prompt-run-stream.cjs.map +1 -0
- package/dist/data/ai/use-prompt-run-stream.d.ts +52 -0
- package/dist/data/ai/use-prompt-run-stream.d.ts.map +1 -0
- package/dist/data/ai/use-prompt-run-stream.js +126 -0
- package/dist/data/ai/use-prompt-run-stream.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -1
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -1
- package/dist/data/cache-browser/CacheBrowser.js +1 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -1
- package/dist/data/charts/BarChart.cjs +194 -0
- package/dist/data/charts/BarChart.cjs.map +1 -0
- package/dist/data/charts/BarChart.d.ts +19 -0
- package/dist/data/charts/BarChart.d.ts.map +1 -0
- package/dist/data/charts/BarChart.js +194 -0
- package/dist/data/charts/BarChart.js.map +1 -0
- package/dist/data/charts/ChartLegend.cjs +54 -0
- package/dist/data/charts/ChartLegend.cjs.map +1 -0
- package/dist/data/charts/ChartLegend.d.ts +17 -0
- package/dist/data/charts/ChartLegend.d.ts.map +1 -0
- package/dist/data/charts/ChartLegend.js +54 -0
- package/dist/data/charts/ChartLegend.js.map +1 -0
- package/dist/data/charts/Sparkline.cjs +56 -0
- package/dist/data/charts/Sparkline.cjs.map +1 -0
- package/dist/data/charts/Sparkline.d.ts +15 -0
- package/dist/data/charts/Sparkline.d.ts.map +1 -0
- package/dist/data/charts/Sparkline.js +56 -0
- package/dist/data/charts/Sparkline.js.map +1 -0
- package/dist/data/charts/StackedBarChart.cjs +241 -0
- package/dist/data/charts/StackedBarChart.cjs.map +1 -0
- package/dist/data/charts/StackedBarChart.d.ts +20 -0
- package/dist/data/charts/StackedBarChart.d.ts.map +1 -0
- package/dist/data/charts/StackedBarChart.js +241 -0
- package/dist/data/charts/StackedBarChart.js.map +1 -0
- package/dist/data/charts/TrendChart.cjs +157 -0
- package/dist/data/charts/TrendChart.cjs.map +1 -0
- package/dist/data/charts/TrendChart.d.ts +20 -0
- package/dist/data/charts/TrendChart.d.ts.map +1 -0
- package/dist/data/charts/TrendChart.js +157 -0
- package/dist/data/charts/TrendChart.js.map +1 -0
- package/dist/data/charts/chart-marks.cjs +115 -0
- package/dist/data/charts/chart-marks.cjs.map +1 -0
- package/dist/data/charts/chart-marks.d.ts +39 -0
- package/dist/data/charts/chart-marks.d.ts.map +1 -0
- package/dist/data/charts/chart-marks.js +112 -0
- package/dist/data/charts/chart-marks.js.map +1 -0
- package/dist/data/charts/chart-palette.cjs +74 -0
- package/dist/data/charts/chart-palette.cjs.map +1 -0
- package/dist/data/charts/chart-palette.d.ts +58 -0
- package/dist/data/charts/chart-palette.d.ts.map +1 -0
- package/dist/data/charts/chart-palette.js +72 -0
- package/dist/data/charts/chart-palette.js.map +1 -0
- package/dist/data/charts/chart-scale.cjs +115 -0
- package/dist/data/charts/chart-scale.cjs.map +1 -0
- package/dist/data/charts/chart-scale.d.ts +41 -0
- package/dist/data/charts/chart-scale.d.ts.map +1 -0
- package/dist/data/charts/chart-scale.js +104 -0
- package/dist/data/charts/chart-scale.js.map +1 -0
- package/dist/data/charts/chart.test-utils.d.ts +7 -0
- package/dist/data/charts/chart.test-utils.d.ts.map +1 -0
- package/dist/data/charts/index.d.ts +7 -0
- package/dist/data/charts/index.d.ts.map +1 -0
- package/dist/data/chat/MessageActions.cjs +1 -1
- package/dist/data/chat/MessageActions.cjs.map +1 -1
- package/dist/data/chat/MessageActions.js +1 -1
- package/dist/data/chat/MessageActions.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +9 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +9 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/ProblemActions.cjs +37 -0
- package/dist/data/diagnostics/ProblemActions.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemActions.d.ts +6 -0
- package/dist/data/diagnostics/ProblemActions.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemActions.js +37 -0
- package/dist/data/diagnostics/ProblemActions.js.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.cjs +33 -0
- package/dist/data/diagnostics/ProblemFacet.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.d.ts +9 -0
- package/dist/data/diagnostics/ProblemFacet.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.js +33 -0
- package/dist/data/diagnostics/ProblemFacet.js.map +1 -0
- package/dist/data/diagnostics/ProblemRow.cjs +62 -0
- package/dist/data/diagnostics/ProblemRow.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemRow.d.ts +14 -0
- package/dist/data/diagnostics/ProblemRow.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemRow.js +62 -0
- package/dist/data/diagnostics/ProblemRow.js.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.cjs +18 -0
- package/dist/data/diagnostics/ProblemViewOptions.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.d.ts +6 -0
- package/dist/data/diagnostics/ProblemViewOptions.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.js +18 -0
- package/dist/data/diagnostics/ProblemViewOptions.js.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.cjs +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.js +1 -1
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
- package/dist/data/diagnostics/diagnostic-identity.cjs +14 -0
- package/dist/data/diagnostics/diagnostic-identity.cjs.map +1 -0
- package/dist/data/diagnostics/diagnostic-identity.d.ts +3 -0
- package/dist/data/diagnostics/diagnostic-identity.d.ts.map +1 -0
- package/dist/data/diagnostics/diagnostic-identity.js +14 -0
- package/dist/data/diagnostics/diagnostic-identity.js.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.cjs +16 -0
- package/dist/data/diagnostics/use-problem-expansion.cjs.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.d.ts +3 -0
- package/dist/data/diagnostics/use-problem-expansion.d.ts.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.js +16 -0
- package/dist/data/diagnostics/use-problem-expansion.js.map +1 -0
- package/dist/data/git/GitChangeList.cjs +9 -6
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +6 -0
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +9 -6
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/git/pickers/GitPickersDemo.d.ts.map +1 -1
- package/dist/data/git/pickers/ReferencePicker.cjs +1 -0
- package/dist/data/git/pickers/ReferencePicker.cjs.map +1 -1
- package/dist/data/git/pickers/ReferencePicker.js +1 -0
- package/dist/data/git/pickers/ReferencePicker.js.map +1 -1
- package/dist/data/lint/LintDetail.cjs +230 -189
- package/dist/data/lint/LintDetail.cjs.map +1 -1
- package/dist/data/lint/LintDetail.d.ts +25 -3
- package/dist/data/lint/LintDetail.d.ts.map +1 -1
- package/dist/data/lint/LintDetail.js +231 -192
- package/dist/data/lint/LintDetail.js.map +1 -1
- package/dist/data/lint/LintFilterBar.cjs +78 -83
- package/dist/data/lint/LintFilterBar.cjs.map +1 -1
- package/dist/data/lint/LintFilterBar.d.ts +23 -6
- package/dist/data/lint/LintFilterBar.d.ts.map +1 -1
- package/dist/data/lint/LintFilterBar.js +78 -85
- package/dist/data/lint/LintFilterBar.js.map +1 -1
- package/dist/data/lint/LintIgnoreMenu.cjs +59 -0
- package/dist/data/lint/LintIgnoreMenu.cjs.map +1 -0
- package/dist/data/lint/LintIgnoreMenu.d.ts +20 -0
- package/dist/data/lint/LintIgnoreMenu.d.ts.map +1 -0
- package/dist/data/lint/LintIgnoreMenu.js +58 -0
- package/dist/data/lint/LintIgnoreMenu.js.map +1 -0
- package/dist/data/lint/LintResults.cjs +59 -14
- package/dist/data/lint/LintResults.cjs.map +1 -1
- package/dist/data/lint/LintResults.d.ts +25 -1
- package/dist/data/lint/LintResults.d.ts.map +1 -1
- package/dist/data/lint/LintResults.fixtures.d.ts +19 -0
- package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -1
- package/dist/data/lint/LintResults.js +60 -15
- package/dist/data/lint/LintResults.js.map +1 -1
- package/dist/data/lint/LintTable.cjs +156 -0
- package/dist/data/lint/LintTable.cjs.map +1 -0
- package/dist/data/lint/LintTable.d.ts +13 -0
- package/dist/data/lint/LintTable.d.ts.map +1 -0
- package/dist/data/lint/LintTable.js +156 -0
- package/dist/data/lint/LintTable.js.map +1 -0
- package/dist/data/lint/LintTreeNode.cjs +42 -19
- package/dist/data/lint/LintTreeNode.cjs.map +1 -1
- package/dist/data/lint/LintTreeNode.d.ts +7 -2
- package/dist/data/lint/LintTreeNode.d.ts.map +1 -1
- package/dist/data/lint/LintTreeNode.js +44 -21
- package/dist/data/lint/LintTreeNode.js.map +1 -1
- package/dist/data/lint/ViolationSnippet.cjs +113 -0
- package/dist/data/lint/ViolationSnippet.cjs.map +1 -0
- package/dist/data/lint/ViolationSnippet.d.ts +20 -0
- package/dist/data/lint/ViolationSnippet.d.ts.map +1 -0
- package/dist/data/lint/ViolationSnippet.js +112 -0
- package/dist/data/lint/ViolationSnippet.js.map +1 -0
- package/dist/data/lint/actions.cjs +44 -16
- package/dist/data/lint/actions.cjs.map +1 -1
- package/dist/data/lint/actions.d.ts +7 -3
- package/dist/data/lint/actions.d.ts.map +1 -1
- package/dist/data/lint/actions.js +44 -16
- package/dist/data/lint/actions.js.map +1 -1
- package/dist/data/lint/grouping.cjs +105 -8
- package/dist/data/lint/grouping.cjs.map +1 -1
- package/dist/data/lint/grouping.d.ts +21 -1
- package/dist/data/lint/grouping.d.ts.map +1 -1
- package/dist/data/lint/grouping.js +105 -10
- package/dist/data/lint/grouping.js.map +1 -1
- package/dist/data/lint/ignore-menu-items.cjs +18 -0
- package/dist/data/lint/ignore-menu-items.cjs.map +1 -0
- package/dist/data/lint/ignore-menu-items.d.ts +6 -0
- package/dist/data/lint/ignore-menu-items.d.ts.map +1 -0
- package/dist/data/lint/ignore-menu-items.js +17 -0
- package/dist/data/lint/ignore-menu-items.js.map +1 -0
- package/dist/data/lint/index.d.ts +7 -5
- package/dist/data/lint/index.d.ts.map +1 -1
- package/dist/data/lint/stats.cjs +19 -4
- package/dist/data/lint/stats.cjs.map +1 -1
- package/dist/data/lint/stats.d.ts +13 -3
- package/dist/data/lint/stats.d.ts.map +1 -1
- package/dist/data/lint/stats.js +17 -5
- package/dist/data/lint/stats.js.map +1 -1
- package/dist/data/lint/types.cjs +8 -0
- package/dist/data/lint/types.cjs.map +1 -1
- package/dist/data/lint/types.d.ts +47 -0
- package/dist/data/lint/types.d.ts.map +1 -1
- package/dist/data/lint/types.js +8 -1
- package/dist/data/lint/types.js.map +1 -1
- package/dist/data/lint/violation-menu-items.cjs +31 -0
- package/dist/data/lint/violation-menu-items.cjs.map +1 -0
- package/dist/data/lint/violation-menu-items.d.ts +12 -0
- package/dist/data/lint/violation-menu-items.d.ts.map +1 -0
- package/dist/data/lint/violation-menu-items.js +31 -0
- package/dist/data/lint/violation-menu-items.js.map +1 -0
- package/dist/data/markdown-source-blocks.cjs +38 -0
- package/dist/data/markdown-source-blocks.cjs.map +1 -0
- package/dist/data/markdown-source-blocks.d.ts +32 -0
- package/dist/data/markdown-source-blocks.d.ts.map +1 -0
- package/dist/data/markdown-source-blocks.js +35 -0
- package/dist/data/markdown-source-blocks.js.map +1 -0
- package/dist/data/test-runner/FilterFacet.cjs +52 -0
- package/dist/data/test-runner/FilterFacet.cjs.map +1 -0
- package/dist/data/test-runner/FilterFacet.d.ts +13 -0
- package/dist/data/test-runner/FilterFacet.d.ts.map +1 -0
- package/dist/data/test-runner/FilterFacet.js +52 -0
- package/dist/data/test-runner/FilterFacet.js.map +1 -0
- package/dist/data/test-runner/MatrixMarks.cjs +42 -40
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +20 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +43 -42
- package/dist/data/test-runner/MatrixMarks.js.map +1 -1
- package/dist/data/test-runner/TestAttemptDetail.cjs +1 -1
- package/dist/data/test-runner/TestAttemptDetail.js +1 -1
- package/dist/data/test-runner/TestDetailPanel.cjs +11 -0
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +11 -0
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +3 -44
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +3 -44
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +3 -1
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +7 -1
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +3 -1
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +3 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/index.d.ts +2 -2
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/matrix-marks.cjs +2 -11
- package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
- package/dist/data/test-runner/matrix-marks.d.ts +2 -4
- package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
- package/dist/data/test-runner/matrix-marks.js +3 -11
- package/dist/data/test-runner/matrix-marks.js.map +1 -1
- package/dist/data/test-runner/types.d.ts +2 -0
- package/dist/data/test-runner/types.d.ts.map +1 -1
- package/dist/data/timeseries-query.cjs +98 -2
- package/dist/data/timeseries-query.cjs.map +1 -1
- package/dist/data/timeseries-query.d.ts +31 -5
- package/dist/data/timeseries-query.d.ts.map +1 -1
- package/dist/data/timeseries-query.js +98 -3
- package/dist/data/timeseries-query.js.map +1 -1
- package/dist/data/timeseries-stream-provider.cjs +38 -0
- package/dist/data/timeseries-stream-provider.cjs.map +1 -0
- package/dist/data/timeseries-stream-provider.d.ts +26 -0
- package/dist/data/timeseries-stream-provider.d.ts.map +1 -0
- package/dist/data/timeseries-stream-provider.js +38 -0
- package/dist/data/timeseries-stream-provider.js.map +1 -0
- package/dist/data/timeseries-stream.cjs +304 -0
- package/dist/data/timeseries-stream.cjs.map +1 -0
- package/dist/data/timeseries-stream.d.ts +81 -0
- package/dist/data/timeseries-stream.d.ts.map +1 -0
- package/dist/data/timeseries-stream.fixtures.d.ts +36 -0
- package/dist/data/timeseries-stream.fixtures.d.ts.map +1 -0
- package/dist/data/timeseries-stream.js +296 -0
- package/dist/data/timeseries-stream.js.map +1 -0
- package/dist/data/token-style.cjs +13 -0
- package/dist/data/token-style.cjs.map +1 -0
- package/dist/data/token-style.d.ts +4 -0
- package/dist/data/token-style.d.ts.map +1 -0
- package/dist/data/token-style.js +13 -0
- package/dist/data/token-style.js.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.cjs +1 -1
- package/dist/data/traces/ProcessTraceDetail.js +1 -1
- package/dist/data/traces/index.d.ts +1 -1
- package/dist/data/traces/index.d.ts.map +1 -1
- package/dist/data/use-data-table-virtual.d.ts +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data/workload-panel/MemoryStack.cjs +49 -0
- package/dist/data/workload-panel/MemoryStack.cjs.map +1 -0
- package/dist/data/workload-panel/MemoryStack.d.ts +11 -0
- package/dist/data/workload-panel/MemoryStack.d.ts.map +1 -0
- package/dist/data/workload-panel/MemoryStack.js +48 -0
- package/dist/data/workload-panel/MemoryStack.js.map +1 -0
- package/dist/data/workload-panel/Metrics.cjs +197 -0
- package/dist/data/workload-panel/Metrics.cjs.map +1 -0
- package/dist/data/workload-panel/Metrics.d.ts +11 -0
- package/dist/data/workload-panel/Metrics.d.ts.map +1 -0
- package/dist/data/workload-panel/Metrics.js +196 -0
- package/dist/data/workload-panel/Metrics.js.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.cjs +66 -0
- package/dist/data/workload-panel/WorkloadPanel.cjs.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.d.ts +3 -0
- package/dist/data/workload-panel/WorkloadPanel.d.ts.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.js +66 -0
- package/dist/data/workload-panel/WorkloadPanel.js.map +1 -0
- package/dist/data/workload-panel/fixtures.d.ts +60 -0
- package/dist/data/workload-panel/fixtures.d.ts.map +1 -0
- package/dist/data/workload-panel/model.cjs +137 -0
- package/dist/data/workload-panel/model.cjs.map +1 -0
- package/dist/data/workload-panel/model.d.ts +53 -0
- package/dist/data/workload-panel/model.d.ts.map +1 -0
- package/dist/data/workload-panel/model.js +133 -0
- package/dist/data/workload-panel/model.js.map +1 -0
- package/dist/data/workload-panel/types.d.ts +56 -0
- package/dist/data/workload-panel/types.d.ts.map +1 -0
- package/dist/data.cjs +58 -7
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +29 -12
- package/dist/file-findings/AnnotatedCode.cjs +243 -0
- package/dist/file-findings/AnnotatedCode.cjs.map +1 -0
- package/dist/file-findings/AnnotatedCode.d.ts +30 -0
- package/dist/file-findings/AnnotatedCode.d.ts.map +1 -0
- package/dist/file-findings/AnnotatedCode.js +243 -0
- package/dist/file-findings/AnnotatedCode.js.map +1 -0
- package/dist/file-findings/FileFindingsView.cjs +213 -0
- package/dist/file-findings/FileFindingsView.cjs.map +1 -0
- package/dist/file-findings/FileFindingsView.d.ts +35 -0
- package/dist/file-findings/FileFindingsView.d.ts.map +1 -0
- package/dist/file-findings/FileFindingsView.js +213 -0
- package/dist/file-findings/FileFindingsView.js.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.cjs +22 -0
- package/dist/file-findings/LazyAnnotatedCode.cjs.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.d.ts +5 -0
- package/dist/file-findings/LazyAnnotatedCode.d.ts.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.js +22 -0
- package/dist/file-findings/LazyAnnotatedCode.js.map +1 -0
- package/dist/file-findings/adapters.cjs +155 -0
- package/dist/file-findings/adapters.cjs.map +1 -0
- package/dist/file-findings/adapters.d.ts +24 -0
- package/dist/file-findings/adapters.d.ts.map +1 -0
- package/dist/file-findings/adapters.js +153 -0
- package/dist/file-findings/adapters.js.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.cjs +97 -0
- package/dist/file-findings/file-review/CommentDraft.cjs.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.d.ts +25 -0
- package/dist/file-findings/file-review/CommentDraft.d.ts.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.js +97 -0
- package/dist/file-findings/file-review/CommentDraft.js.map +1 -0
- package/dist/file-findings/file-review/FileReview.cjs +863 -0
- package/dist/file-findings/file-review/FileReview.cjs.map +1 -0
- package/dist/file-findings/file-review/FileReview.d.ts +79 -0
- package/dist/file-findings/file-review/FileReview.d.ts.map +1 -0
- package/dist/file-findings/file-review/FileReview.fixtures.d.ts +25 -0
- package/dist/file-findings/file-review/FileReview.fixtures.d.ts.map +1 -0
- package/dist/file-findings/file-review/FileReview.js +863 -0
- package/dist/file-findings/file-review/FileReview.js.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.cjs +77 -0
- package/dist/file-findings/file-review/InlineAuthors.cjs.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.d.ts +9 -0
- package/dist/file-findings/file-review/InlineAuthors.d.ts.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.js +77 -0
- package/dist/file-findings/file-review/InlineAuthors.js.map +1 -0
- package/dist/file-findings/file-review/InlineThread.cjs +77 -0
- package/dist/file-findings/file-review/InlineThread.cjs.map +1 -0
- package/dist/file-findings/file-review/InlineThread.d.ts +27 -0
- package/dist/file-findings/file-review/InlineThread.d.ts.map +1 -0
- package/dist/file-findings/file-review/InlineThread.js +77 -0
- package/dist/file-findings/file-review/InlineThread.js.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.cjs +164 -0
- package/dist/file-findings/file-review/ProblemsList.cjs.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.d.ts +15 -0
- package/dist/file-findings/file-review/ProblemsList.d.ts.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.js +164 -0
- package/dist/file-findings/file-review/ProblemsList.js.map +1 -0
- package/dist/file-findings/file-review/SourceView.cjs +179 -0
- package/dist/file-findings/file-review/SourceView.cjs.map +1 -0
- package/dist/file-findings/file-review/SourceView.d.ts +29 -0
- package/dist/file-findings/file-review/SourceView.d.ts.map +1 -0
- package/dist/file-findings/file-review/SourceView.js +179 -0
- package/dist/file-findings/file-review/SourceView.js.map +1 -0
- package/dist/file-findings/file-review/blame.cjs +35 -0
- package/dist/file-findings/file-review/blame.cjs.map +1 -0
- package/dist/file-findings/file-review/blame.d.ts +28 -0
- package/dist/file-findings/file-review/blame.d.ts.map +1 -0
- package/dist/file-findings/file-review/blame.js +33 -0
- package/dist/file-findings/file-review/blame.js.map +1 -0
- package/dist/file-findings/file-review/geometry.cjs +101 -0
- package/dist/file-findings/file-review/geometry.cjs.map +1 -0
- package/dist/file-findings/file-review/geometry.d.ts +45 -0
- package/dist/file-findings/file-review/geometry.d.ts.map +1 -0
- package/dist/file-findings/file-review/geometry.js +98 -0
- package/dist/file-findings/file-review/geometry.js.map +1 -0
- package/dist/file-findings/file-review/hooks.cjs +101 -0
- package/dist/file-findings/file-review/hooks.cjs.map +1 -0
- package/dist/file-findings/file-review/hooks.d.ts +22 -0
- package/dist/file-findings/file-review/hooks.d.ts.map +1 -0
- package/dist/file-findings/file-review/hooks.js +99 -0
- package/dist/file-findings/file-review/hooks.js.map +1 -0
- package/dist/file-findings/file-review/marks.cjs +52 -0
- package/dist/file-findings/file-review/marks.cjs.map +1 -0
- package/dist/file-findings/file-review/marks.d.ts +23 -0
- package/dist/file-findings/file-review/marks.d.ts.map +1 -0
- package/dist/file-findings/file-review/marks.js +47 -0
- package/dist/file-findings/file-review/marks.js.map +1 -0
- package/dist/file-findings/file-review/problem-filters.cjs +14 -0
- package/dist/file-findings/file-review/problem-filters.cjs.map +1 -0
- package/dist/file-findings/file-review/problem-filters.d.ts +10 -0
- package/dist/file-findings/file-review/problem-filters.d.ts.map +1 -0
- package/dist/file-findings/file-review/problem-filters.js +13 -0
- package/dist/file-findings/file-review/problem-filters.js.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.cjs +234 -0
- package/dist/file-findings/file-review/quote-anchor.cjs.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.d.ts +54 -0
- package/dist/file-findings/file-review/quote-anchor.d.ts.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.js +226 -0
- package/dist/file-findings/file-review/quote-anchor.js.map +1 -0
- package/dist/file-findings/file-review/source-anchor.cjs +104 -0
- package/dist/file-findings/file-review/source-anchor.cjs.map +1 -0
- package/dist/file-findings/file-review/source-anchor.d.ts +27 -0
- package/dist/file-findings/file-review/source-anchor.d.ts.map +1 -0
- package/dist/file-findings/file-review/source-anchor.js +99 -0
- package/dist/file-findings/file-review/source-anchor.js.map +1 -0
- package/dist/file-findings/file-review/source-marks.cjs +71 -0
- package/dist/file-findings/file-review/source-marks.cjs.map +1 -0
- package/dist/file-findings/file-review/source-marks.d.ts +27 -0
- package/dist/file-findings/file-review/source-marks.d.ts.map +1 -0
- package/dist/file-findings/file-review/source-marks.js +68 -0
- package/dist/file-findings/file-review/source-marks.js.map +1 -0
- package/dist/file-findings/findings-comments.cjs +136 -0
- package/dist/file-findings/findings-comments.cjs.map +1 -0
- package/dist/file-findings/findings-comments.d.ts +28 -0
- package/dist/file-findings/findings-comments.d.ts.map +1 -0
- package/dist/file-findings/findings-comments.js +131 -0
- package/dist/file-findings/findings-comments.js.map +1 -0
- package/dist/file-findings/findings-languages.cjs +53 -0
- package/dist/file-findings/findings-languages.cjs.map +1 -0
- package/dist/file-findings/findings-languages.d.ts +11 -0
- package/dist/file-findings/findings-languages.d.ts.map +1 -0
- package/dist/file-findings/findings-languages.js +53 -0
- package/dist/file-findings/findings-languages.js.map +1 -0
- package/dist/file-findings/mdx-source.cjs +48 -0
- package/dist/file-findings/mdx-source.cjs.map +1 -0
- package/dist/file-findings/mdx-source.d.ts +7 -0
- package/dist/file-findings/mdx-source.d.ts.map +1 -0
- package/dist/file-findings/mdx-source.js +48 -0
- package/dist/file-findings/mdx-source.js.map +1 -0
- package/dist/file-findings/monaco-language.cjs +73 -0
- package/dist/file-findings/monaco-language.cjs.map +1 -0
- package/dist/file-findings/monaco-language.d.ts +11 -0
- package/dist/file-findings/monaco-language.d.ts.map +1 -0
- package/dist/file-findings/monaco-language.js +72 -0
- package/dist/file-findings/monaco-language.js.map +1 -0
- package/dist/file-findings/severity-counts.cjs +20 -0
- package/dist/file-findings/severity-counts.cjs.map +1 -0
- package/dist/file-findings/severity-counts.d.ts +5 -0
- package/dist/file-findings/severity-counts.d.ts.map +1 -0
- package/dist/file-findings/severity-counts.js +19 -0
- package/dist/file-findings/severity-counts.js.map +1 -0
- package/dist/file-findings/types.cjs +12 -0
- package/dist/file-findings/types.cjs.map +1 -0
- package/dist/file-findings/types.d.ts +43 -0
- package/dist/file-findings/types.d.ts.map +1 -0
- package/dist/file-findings/types.js +11 -0
- package/dist/file-findings/types.js.map +1 -0
- package/dist/file-findings.cjs +47 -0
- package/dist/file-findings.d.ts +15 -0
- package/dist/file-findings.d.ts.map +1 -0
- package/dist/file-findings.js +15 -0
- package/dist/hooks/event-hub.cjs +22 -8
- package/dist/hooks/event-hub.cjs.map +1 -1
- package/dist/hooks/event-hub.d.ts.map +1 -1
- package/dist/hooks/event-hub.js +22 -8
- package/dist/hooks/event-hub.js.map +1 -1
- package/dist/icons/components/UiBrowser.cjs +51 -0
- package/dist/icons/components/UiBrowser.cjs.map +1 -0
- package/dist/icons/components/UiBrowser.d.ts +15 -0
- package/dist/icons/components/UiBrowser.d.ts.map +1 -0
- package/dist/icons/components/UiBrowser.js +48 -0
- package/dist/icons/components/UiBrowser.js.map +1 -0
- package/dist/icons/components/UiCreditCard.cjs +51 -0
- package/dist/icons/components/UiCreditCard.cjs.map +1 -0
- package/dist/icons/components/UiCreditCard.d.ts +15 -0
- package/dist/icons/components/UiCreditCard.d.ts.map +1 -0
- package/dist/icons/components/UiCreditCard.js +48 -0
- package/dist/icons/components/UiCreditCard.js.map +1 -0
- package/dist/icons/components/UiShoppingCart.cjs +51 -0
- package/dist/icons/components/UiShoppingCart.cjs.map +1 -0
- package/dist/icons/components/UiShoppingCart.d.ts +15 -0
- package/dist/icons/components/UiShoppingCart.d.ts.map +1 -0
- package/dist/icons/components/UiShoppingCart.js +48 -0
- package/dist/icons/components/UiShoppingCart.js.map +1 -0
- package/dist/icons/index.d.ts +6 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +6 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +6 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +9 -0
- package/dist/icons.js +4 -1
- package/dist/index.cjs +76 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -14
- package/dist/layout/AppShell.cjs +37 -21
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +13 -2
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +37 -21
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +7 -6
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +7 -6
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/layout/SplitPane.cjs +16 -6
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts +12 -2
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +16 -6
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/layout/Workspace.cjs +37 -33
- package/dist/layout/Workspace.cjs.map +1 -1
- package/dist/layout/Workspace.d.ts.map +1 -1
- package/dist/layout/Workspace.js +37 -33
- package/dist/layout/Workspace.js.map +1 -1
- package/dist/layout/Workspace.regions.cjs +3 -3
- package/dist/layout/Workspace.regions.cjs.map +1 -1
- package/dist/layout/Workspace.regions.js +3 -3
- package/dist/layout/Workspace.regions.js.map +1 -1
- package/dist/lib/breakpoints.cjs +102 -0
- package/dist/lib/breakpoints.cjs.map +1 -0
- package/dist/lib/breakpoints.d.ts +36 -0
- package/dist/lib/breakpoints.d.ts.map +1 -0
- package/dist/lib/breakpoints.js +99 -0
- package/dist/lib/breakpoints.js.map +1 -0
- package/dist/lib/combobox.cjs +2 -1
- package/dist/lib/combobox.cjs.map +1 -1
- package/dist/lib/combobox.d.ts +1 -1
- package/dist/lib/combobox.d.ts.map +1 -1
- package/dist/lib/combobox.js +2 -1
- package/dist/lib/combobox.js.map +1 -1
- package/dist/lib/path-tree.cjs +21 -0
- package/dist/lib/path-tree.cjs.map +1 -1
- package/dist/lib/path-tree.d.ts +15 -0
- package/dist/lib/path-tree.d.ts.map +1 -1
- package/dist/lib/path-tree.js +21 -1
- package/dist/lib/path-tree.js.map +1 -1
- package/dist/overlay/Modal.cjs +2 -1
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +2 -1
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/dropdownMenuContext.d.ts +1 -1
- package/dist/profiles/editor/profileEditor.cjs +1 -1
- package/dist/profiles/editor/profileEditor.cjs.map +1 -1
- package/dist/profiles/editor/profileEditor.js +1 -1
- package/dist/profiles/editor/profileEditor.js.map +1 -1
- package/dist/profiles/editor/profileEditorSections.cjs +2 -2
- package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
- package/dist/profiles/editor/profileEditorSections.js +2 -2
- package/dist/profiles/editor/profileEditorSections.js.map +1 -1
- package/dist/profiles/query/prometheusResults.cjs +24 -36
- package/dist/profiles/query/prometheusResults.cjs.map +1 -1
- package/dist/profiles/query/prometheusResults.d.ts.map +1 -1
- package/dist/profiles/query/prometheusResults.js +24 -36
- package/dist/profiles/query/prometheusResults.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +1 -1
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.js +1 -1
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/classify.cjs +1 -1
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +1 -1
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/useOperations.d.ts +24 -24
- package/dist/rpc.cjs +0 -2
- package/dist/rpc.d.ts +0 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +1 -2
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +6 -0
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -2
- package/package.json +9 -3
- package/schemas/json-schema-form.schema.json +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeseriesPanel.js","names":["_Fragment"],"sources":["../../src/data/TimeseriesPanel.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n Line,\n LineChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { cn } from \"../lib/utils\";\nimport { resolveCssColor } from \"../lib/color\";\nimport { formatUnit } from \"../lib/format\";\nimport { Modal } from \"../overlay/Modal\";\nimport { ProgressBar, type ProgressSegment } from \"./ProgressBar\";\nimport { UiFullscreen } from \"../icons\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { assignAxes, latestOf } from \"./TimeseriesPanel.axes\";\nimport {\n mergeSeries,\n resolveBreakdown,\n resolveSeries,\n type BreakdownItem,\n type MergedRow,\n type ResolvedSeries,\n type TimeseriesPanelProps,\n type TimeseriesReferenceLine,\n} from \"./TimeseriesPanel.model\";\nimport { defaultTimeseriesFetcher, useTimeseriesQueries } from \"./timeseries-query\";\n\nexport type { AxisAssignment, AxisOrientation, AxisSpec } from \"./TimeseriesPanel.axes\";\nexport type {\n BreakdownItem,\n MergedRow,\n ResolvedSeries,\n SeriesLoadContext,\n SeriesLoader,\n TimeseriesPanelProps,\n TimeseriesPoint,\n TimeseriesReferenceLine,\n TimeseriesResponse,\n TimeseriesSeries,\n} from \"./TimeseriesPanel.model\";\n\nfunction formatClock(at: string): string {\n const date = new Date(at);\n if (Number.isNaN(date.getTime())) return \"\";\n return date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\nexport function TimeseriesPanel(props: TimeseriesPanelProps) {\n const {\n title,\n icon,\n unit,\n range = \"1h\",\n refreshMs = 5000,\n height = 160,\n variant = \"area\",\n expandable = true,\n total,\n referenceLines,\n fetcher = defaultTimeseriesFetcher,\n className,\n } = props;\n const isBreakdown = variant === \"breakdown\";\n // The inline chart (non-breakdown only) and the expand modal both need a\n // time-series variant; breakdown has no inline chart and expands to \"area\".\n const chartVariant: ChartVariant = isBreakdown ? \"area\" : variant;\n const expandVariant = props.expandVariant ?? chartVariant;\n\n const [expanded, setExpanded] = useState(false);\n\n const series = useMemo(() => resolveSeries(props), [props]);\n const results = useTimeseriesQueries(\n series.map((s) => ({ id: s.key, load: s.load })),\n { baseUrl: props.baseUrl ?? \"\", range, refreshMs, fetcher },\n );\n const refs = referenceLines ?? [];\n\n const isError = results.some((r) => r.isError);\n const error = results.find((r) => r.isError)?.error;\n const isLoading = results.some((r) => r.isLoading) && results.every((r) => !r.data);\n const pointsBySeries = results.map((r) => r.data?.points);\n const rows = useMemo(() => mergeSeries(series, pointsBySeries), [series, pointsBySeries]);\n const hasMirrored = series.some((s) => s.transform);\n const breakdown = useMemo(\n () => (isBreakdown ? resolveBreakdown(series, rows, total) : null),\n [isBreakdown, series, rows, total],\n );\n\n // Breakdown renders instantly from `current`; the modal still needs polled\n // history. Other variants gate on having ≥2 points to draw a line.\n const canExpand = expandable && rows.length >= 2;\n\n return (\n <div className={cn(\"flex flex-col rounded-lg border border-border bg-card p-3\", className)}>\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon ? <PanelIcon icon={icon} /> : null}\n <span className=\"truncate font-medium text-foreground\">{title}</span>\n </span>\n <span className=\"inline-flex shrink-0 items-center gap-1.5\">\n {breakdown ? (\n <BreakdownReadout total={breakdown.total} unit={unit} items={breakdown.items} />\n ) : (\n <LatestReadout series={series} rows={rows} />\n )}\n {canExpand ? (\n <button\n type=\"button\"\n aria-label=\"Expand chart\"\n onClick={() => setExpanded(true)}\n className=\"text-muted-foreground transition-colors hover:text-foreground\"\n >\n <Icon icon={UiFullscreen} width={14} height={14} />\n </button>\n ) : null}\n </span>\n </div>\n <div className=\"mt-2\" style={breakdown ? undefined : { height }}>\n {breakdown ? (\n <BreakdownView total={breakdown.total} unit={unit} items={breakdown.items} />\n ) : isError ? (\n <PanelMessage>{(error as Error)?.message ?? \"Failed to load metric\"}</PanelMessage>\n ) : isLoading ? (\n <PanelMessage>Loading…</PanelMessage>\n ) : rows.length < 2 ? (\n <PanelMessage>Collecting data…</PanelMessage>\n ) : (\n <Chart\n rows={rows}\n series={series}\n variant={chartVariant}\n unit={unit}\n showZeroLine={hasMirrored}\n referenceLines={refs}\n />\n )}\n </div>\n {!breakdown && !isError && !isLoading && rows.length >= 2 && series.length + refs.length > 1 ? (\n <ChartLegend series={series} rows={rows} referenceLines={refs} unit={unit} />\n ) : null}\n {canExpand ? (\n <Modal open={expanded} onClose={() => setExpanded(false)} title={title} size=\"xl\">\n <div style={{ height: 360 }}>\n <Chart\n rows={rows}\n series={series}\n variant={expandVariant}\n unit={unit}\n showZeroLine={hasMirrored}\n referenceLines={refs}\n />\n </div>\n {series.length + refs.length > 1 ? (\n <ChartLegend series={series} rows={rows} referenceLines={refs} unit={unit} />\n ) : null}\n </Modal>\n ) : null}\n </div>\n );\n}\n\n/**\n * Header readout for a single-series panel: the latest value, formatted with the\n * series' unit. Multi-series panels render the per-series values in {@link ChartLegend}\n * below the chart instead, so this returns null for them to avoid overlapping the title.\n */\nfunction LatestReadout({ series, rows }: { series: ResolvedSeries[]; rows: MergedRow[] }) {\n const only = series.length === 1 ? series[0] : undefined;\n if (!only) return null;\n const v = latestOf(rows, only.key);\n if (v === undefined) return null;\n return <span className=\"tabular-nums\">{formatUnit(Math.abs(v), only.unit)}</span>;\n}\n\nconst REFERENCE_LINE_COLOR = \"var(--muted-foreground, #64748b)\";\n\nfunction referenceColor(ref: TimeseriesReferenceLine): string {\n return resolveCssColor(ref.color ?? REFERENCE_LINE_COLOR);\n}\n\n/**\n * Wrapping color-keyed legend for the time-series variants: dot + label + latest\n * value, then each reference line with its fixed value.\n */\nfunction ChartLegend({\n series,\n rows,\n referenceLines,\n unit,\n}: {\n series: ResolvedSeries[];\n rows: MergedRow[];\n referenceLines: TimeseriesReferenceLine[];\n unit: string | undefined;\n}) {\n return (\n <ul className=\"mt-1.5 flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground\">\n {series.map((s) => {\n const v = latestOf(rows, s.key);\n return (\n <li key={s.key} className=\"inline-flex min-w-0 items-center gap-1.5\">\n <span\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: resolveCssColor(s.color) }}\n aria-hidden\n />\n <span className=\"truncate text-foreground\">{s.label}</span>\n {v !== undefined ? (\n <span className=\"tabular-nums\">{formatUnit(Math.abs(v), s.unit)}</span>\n ) : null}\n </li>\n );\n })}\n {referenceLines.map((ref, i) => (\n <li key={`ref-${i}`} className=\"inline-flex min-w-0 items-center gap-1.5\">\n <span\n className=\"h-0.5 w-2.5 shrink-0\"\n style={{ backgroundColor: referenceColor(ref) }}\n aria-hidden\n />\n <span className=\"truncate text-foreground\">{ref.label}</span>\n <span className=\"tabular-nums\">{formatUnit(ref.value, ref.unit ?? unit)}</span>\n </li>\n ))}\n </ul>\n );\n}\n\n/** Breakdown header readout: `used / total · pct%`, where used is the sum of segments. */\nfunction BreakdownReadout({\n total,\n unit,\n items,\n}: {\n total: number;\n unit: string | undefined;\n items: BreakdownItem[];\n}) {\n const used = items.reduce((acc, it) => acc + it.value, 0);\n const pct = total > 0 ? Math.min(100, (used / total) * 100) : 0;\n return (\n <span className=\"font-mono tabular-nums\">\n {formatUnit(used, unit)} / {formatUnit(total, unit)} · {pct.toFixed(0)}%\n </span>\n );\n}\n\n/** Instantaneous stacked bar + legend list. The expand button (in the panel header) opens the graph. */\nfunction BreakdownView({\n total,\n unit,\n items,\n}: {\n total: number;\n unit: string | undefined;\n items: BreakdownItem[];\n}) {\n const segments: ProgressSegment[] = items.map((it) => ({\n count: it.value,\n color: it.color,\n label: it.label,\n }));\n return (\n <div className=\"flex flex-col gap-2\">\n <ProgressBar segments={segments} total={total > 0 ? total : 1} height=\"h-3\" />\n {items.length > 0 ? (\n <ul className=\"grid grid-cols-1 gap-y-1 text-xs\">\n {items.map((it) => (\n <li key={it.key} className=\"flex items-center gap-2\">\n <span\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: resolveCssColor(it.color) }}\n aria-hidden\n />\n <span className=\"min-w-0 flex-1 truncate font-mono text-muted-foreground\">\n {it.label}\n </span>\n <span className=\"font-mono tabular-nums text-foreground\">\n {formatUnit(it.value, it.unit ?? unit)}\n </span>\n <span className=\"w-10 text-right font-mono tabular-nums text-muted-foreground\">\n {it.percent.toFixed(0)}%\n </span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\ntype ChartVariant = \"area\" | \"line\" | \"stacked\";\n\nfunction Chart({\n rows,\n series,\n variant,\n unit,\n showZeroLine,\n referenceLines,\n}: {\n rows: MergedRow[];\n series: ResolvedSeries[];\n variant: ChartVariant;\n unit: string | undefined;\n showZeroLine: boolean;\n referenceLines: TimeseriesReferenceLine[];\n}) {\n const stacked = variant === \"stacked\";\n // Mirrored series carry negative values; show magnitudes on axis and tooltip.\n const seriesByKey = new Map(series.map((s) => [s.key, s]));\n // recharts needs a CSS color value; a series may carry a Tailwind class.\n const strokeOf = (s: ResolvedSeries) => resolveCssColor(s.color);\n // Distinct units map to a left and (when present) right axis; each series draws\n // against the axis for its unit so mixed-unit panels keep independent scales.\n const { axes: yAxes, axisOfKey } = useMemo(() => assignAxes(series), [series]);\n const axisOf = (key: string): \"left\" | \"right\" => axisOfKey.get(key) ?? \"left\";\n // A reference line draws against the axis formatting its unit, else the left.\n const axisOfUnit = (u: string | undefined): \"left\" | \"right\" =>\n yAxes.find((ax) => ax.unit === u)?.id ?? \"left\";\n const axes = (\n <>\n <CartesianGrid strokeOpacity={0.12} vertical={false} />\n <XAxis\n dataKey=\"at\"\n tickFormatter={formatClock}\n tick={{ fontSize: 10 }}\n stroke=\"currentColor\"\n strokeOpacity={0.35}\n minTickGap={32}\n />\n {yAxes.map((ax) => (\n <YAxis\n key={ax.id}\n yAxisId={ax.id}\n orientation={ax.orientation}\n tick={{ fontSize: 10 }}\n stroke=\"currentColor\"\n strokeOpacity={0.35}\n width={40}\n tickFormatter={(v: number) => formatUnit(Math.abs(v), ax.unit)}\n />\n ))}\n <Tooltip\n labelFormatter={(label) => formatClock(String(label))}\n formatter={(value, name) => {\n const s = seriesByKey.get(String(name));\n return [formatUnit(Math.abs(Number(value) || 0), s?.unit ?? unit), s?.label ?? String(name)];\n }}\n contentStyle={{ fontSize: 12 }}\n />\n {showZeroLine ? (\n <ReferenceLine yAxisId=\"left\" y={0} stroke=\"currentColor\" strokeOpacity={0.35} />\n ) : null}\n {referenceLines.map((ref, i) => (\n <ReferenceLine\n key={`ref-${i}`}\n yAxisId={axisOfUnit(ref.unit ?? unit)}\n y={ref.value}\n stroke={referenceColor(ref)}\n strokeDasharray=\"4 4\"\n ifOverflow=\"extendDomain\"\n />\n ))}\n </>\n );\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {variant === \"line\" ? (\n <LineChart data={rows} margin={{ top: 4, right: 8, bottom: 0, left: 0 }}>\n {axes}\n {series.map((s) => (\n <Line\n key={s.key}\n yAxisId={axisOf(s.key)}\n type=\"monotone\"\n dataKey={s.key}\n name={s.key}\n stroke={strokeOf(s)}\n strokeWidth={2}\n dot={false}\n connectNulls\n isAnimationActive={false}\n />\n ))}\n </LineChart>\n ) : (\n <AreaChart data={rows} margin={{ top: 4, right: 8, bottom: 0, left: 0 }}>\n {axes}\n {series.map((s) => (\n <Area\n key={s.key}\n yAxisId={axisOf(s.key)}\n type=\"monotone\"\n dataKey={s.key}\n name={s.key}\n stroke={strokeOf(s)}\n fill={strokeOf(s)}\n {...(stacked ? { stackId: `stack-${axisOf(s.key)}` } : {})}\n fillOpacity={stacked ? 0.7 : 0.12}\n strokeWidth={stacked ? 0 : 2}\n connectNulls\n isAnimationActive={false}\n />\n ))}\n </AreaChart>\n )}\n </ResponsiveContainer>\n );\n}\n\nfunction PanelMessage({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex h-full items-center justify-center text-xs text-muted-foreground\">\n {children}\n </div>\n );\n}\n\nfunction PanelIcon({ icon }: { icon: string | StaticIconComponent }) {\n if (typeof icon === \"string\") {\n return <Icon name={icon} width={16} height={16} className=\"text-muted-foreground\" />;\n }\n return <Icon icon={icon} width={16} height={16} className=\"text-muted-foreground\" />;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TimeseriesPanel.js","names":["_Fragment"],"sources":["../../src/data/TimeseriesPanel.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n Line,\n LineChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { cn } from \"../lib/utils\";\nimport { resolveCssColor } from \"../lib/color\";\nimport { formatUnit } from \"../lib/format\";\nimport { Modal } from \"../overlay/Modal\";\nimport { ProgressBar, type ProgressSegment } from \"./ProgressBar\";\nimport { UiFullscreen } from \"../icons\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { assignAxes, latestOf } from \"./TimeseriesPanel.axes\";\nimport {\n expandServedSeries,\n mergeSeries,\n resolveBreakdown,\n resolveSeries,\n type BreakdownItem,\n type MergedRow,\n type ResolvedSeries,\n type TimeseriesPanelProps,\n type TimeseriesReferenceLine,\n} from \"./TimeseriesPanel.model\";\nimport { defaultTimeseriesFetcher, useTimeseriesQueries } from \"./timeseries-query\";\n\nexport type { AxisAssignment, AxisOrientation, AxisSpec } from \"./TimeseriesPanel.axes\";\nexport type {\n BreakdownItem,\n DisplaySeries,\n MergedRow,\n ResolvedSeries,\n SeriesLoadContext,\n SeriesLoader,\n TimeseriesPanelProps,\n TimeseriesPoint,\n TimeseriesReferenceLine,\n TimeseriesResponse,\n TimeseriesSeries,\n TimeseriesServerSeries,\n} from \"./TimeseriesPanel.model\";\n\nfunction formatClock(at: string): string {\n const date = new Date(at);\n if (Number.isNaN(date.getTime())) return \"\";\n return date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\nexport function TimeseriesPanel(props: TimeseriesPanelProps) {\n const {\n title,\n icon,\n unit,\n range = \"1h\",\n refreshMs = 5000,\n height = 160,\n variant = \"area\",\n expandable = true,\n total,\n referenceLines,\n fetcher = defaultTimeseriesFetcher,\n className,\n } = props;\n const isBreakdown = variant === \"breakdown\";\n // The inline chart (non-breakdown only) and the expand modal both need a\n // time-series variant; breakdown has no inline chart and expands to \"area\".\n const chartVariant: ChartVariant = isBreakdown ? \"area\" : variant;\n const expandVariant = props.expandVariant ?? chartVariant;\n\n const [expanded, setExpanded] = useState(false);\n\n const requested = useMemo(() => resolveSeries(props), [props]);\n const results = useTimeseriesQueries(\n requested.map((s) => ({ id: s.key, load: s.load })),\n { baseUrl: props.baseUrl ?? \"\", range, refreshMs, fetcher },\n );\n const refs = referenceLines ?? [];\n\n const error = results.find((r) => r.error)?.error ?? null;\n const isError = error !== null;\n const isLoading = results.some((r) => r.isLoading) && results.every((r) => !r.series);\n const served = results.map((r) => r.series);\n const { series, points } = useMemo(() => expandServedSeries(props, served), [props, served]);\n const rows = useMemo(() => mergeSeries(series, points), [series, points]);\n const hasMirrored = series.some((s) => s.transform);\n const breakdown = useMemo(\n () => (isBreakdown ? resolveBreakdown(series, rows, total) : null),\n [isBreakdown, series, rows, total],\n );\n\n // Breakdown renders instantly from `current`; the modal still needs polled\n // history. Other variants gate on having ≥2 points to draw a line.\n const canExpand = expandable && rows.length >= 2;\n\n return (\n <div className={cn(\"flex flex-col rounded-lg border border-border bg-card p-3\", className)}>\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon ? <PanelIcon icon={icon} /> : null}\n <span className=\"truncate font-medium text-foreground\">{title}</span>\n </span>\n <span className=\"inline-flex shrink-0 items-center gap-1.5\">\n {breakdown ? (\n <BreakdownReadout total={breakdown.total} unit={unit} items={breakdown.items} />\n ) : (\n <LatestReadout series={series} rows={rows} />\n )}\n {canExpand ? (\n <button\n type=\"button\"\n aria-label=\"Expand chart\"\n onClick={() => setExpanded(true)}\n className=\"text-muted-foreground transition-colors hover:text-foreground\"\n >\n <Icon icon={UiFullscreen} width={14} height={14} />\n </button>\n ) : null}\n </span>\n </div>\n <div className=\"mt-2\" style={breakdown ? undefined : { height }}>\n {error ? (\n <PanelMessage>{error.message || \"Failed to load metric\"}</PanelMessage>\n ) : breakdown ? (\n <BreakdownView total={breakdown.total} unit={unit} items={breakdown.items} />\n ) : isLoading ? (\n <PanelMessage>Loading…</PanelMessage>\n ) : rows.length < 2 ? (\n <PanelMessage>Collecting data…</PanelMessage>\n ) : (\n <Chart\n rows={rows}\n series={series}\n variant={chartVariant}\n unit={unit}\n showZeroLine={hasMirrored}\n referenceLines={refs}\n />\n )}\n </div>\n {!breakdown && !isError && !isLoading && rows.length >= 2 && series.length + refs.length > 1 ? (\n <ChartLegend series={series} rows={rows} referenceLines={refs} unit={unit} />\n ) : null}\n {canExpand ? (\n <Modal open={expanded} onClose={() => setExpanded(false)} title={title} size=\"xl\">\n <div style={{ height: 360 }}>\n <Chart\n rows={rows}\n series={series}\n variant={expandVariant}\n unit={unit}\n showZeroLine={hasMirrored}\n referenceLines={refs}\n />\n </div>\n {series.length + refs.length > 1 ? (\n <ChartLegend series={series} rows={rows} referenceLines={refs} unit={unit} />\n ) : null}\n </Modal>\n ) : null}\n </div>\n );\n}\n\n/**\n * Header readout for a single-series panel: the latest value, formatted with the\n * series' unit. Multi-series panels render the per-series values in {@link ChartLegend}\n * below the chart instead, so this returns null for them to avoid overlapping the title.\n */\nfunction LatestReadout({ series, rows }: { series: ResolvedSeries[]; rows: MergedRow[] }) {\n const only = series.length === 1 ? series[0] : undefined;\n if (!only) return null;\n const v = latestOf(rows, only.key);\n if (v === undefined) return null;\n return <span className=\"tabular-nums\">{formatUnit(Math.abs(v), only.unit)}</span>;\n}\n\nconst REFERENCE_LINE_COLOR = \"var(--muted-foreground, #64748b)\";\n\nfunction referenceColor(ref: TimeseriesReferenceLine): string {\n return resolveCssColor(ref.color ?? REFERENCE_LINE_COLOR);\n}\n\n/**\n * Wrapping color-keyed legend for the time-series variants: dot + label + latest\n * value, then each reference line with its fixed value.\n */\nfunction ChartLegend({\n series,\n rows,\n referenceLines,\n unit,\n}: {\n series: ResolvedSeries[];\n rows: MergedRow[];\n referenceLines: TimeseriesReferenceLine[];\n unit: string | undefined;\n}) {\n return (\n <ul className=\"mt-1.5 flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground\">\n {series.map((s) => {\n const v = latestOf(rows, s.key);\n return (\n <li key={s.key} className=\"inline-flex min-w-0 items-center gap-1.5\">\n <span\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: resolveCssColor(s.color) }}\n aria-hidden\n />\n <span className=\"truncate text-foreground\">{s.label}</span>\n {v !== undefined ? (\n <span className=\"tabular-nums\">{formatUnit(Math.abs(v), s.unit)}</span>\n ) : null}\n </li>\n );\n })}\n {referenceLines.map((ref, i) => (\n <li key={`ref-${i}`} className=\"inline-flex min-w-0 items-center gap-1.5\">\n <span\n className=\"h-0.5 w-2.5 shrink-0\"\n style={{ backgroundColor: referenceColor(ref) }}\n aria-hidden\n />\n <span className=\"truncate text-foreground\">{ref.label}</span>\n <span className=\"tabular-nums\">{formatUnit(ref.value, ref.unit ?? unit)}</span>\n </li>\n ))}\n </ul>\n );\n}\n\n/** Breakdown header readout: `used / total · pct%`, where used is the sum of segments. */\nfunction BreakdownReadout({\n total,\n unit,\n items,\n}: {\n total: number;\n unit: string | undefined;\n items: BreakdownItem[];\n}) {\n const used = items.reduce((acc, it) => acc + it.value, 0);\n const pct = total > 0 ? Math.min(100, (used / total) * 100) : 0;\n return (\n <span className=\"font-mono tabular-nums\">\n {formatUnit(used, unit)} / {formatUnit(total, unit)} · {pct.toFixed(0)}%\n </span>\n );\n}\n\n/** Instantaneous stacked bar + legend list. The expand button (in the panel header) opens the graph. */\nfunction BreakdownView({\n total,\n unit,\n items,\n}: {\n total: number;\n unit: string | undefined;\n items: BreakdownItem[];\n}) {\n const segments: ProgressSegment[] = items.map((it) => ({\n count: it.value,\n color: it.color,\n label: it.label,\n }));\n return (\n <div className=\"flex flex-col gap-2\">\n <ProgressBar segments={segments} total={total > 0 ? total : 1} height=\"h-3\" />\n {items.length > 0 ? (\n <ul className=\"grid grid-cols-1 gap-y-1 text-xs\">\n {items.map((it) => (\n <li key={it.key} className=\"flex items-center gap-2\">\n <span\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: resolveCssColor(it.color) }}\n aria-hidden\n />\n <span className=\"min-w-0 flex-1 truncate font-mono text-muted-foreground\">\n {it.label}\n </span>\n <span className=\"font-mono tabular-nums text-foreground\">\n {formatUnit(it.value, it.unit ?? unit)}\n </span>\n <span className=\"w-10 text-right font-mono tabular-nums text-muted-foreground\">\n {it.percent.toFixed(0)}%\n </span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\ntype ChartVariant = \"area\" | \"line\" | \"stacked\";\n\nfunction Chart({\n rows,\n series,\n variant,\n unit,\n showZeroLine,\n referenceLines,\n}: {\n rows: MergedRow[];\n series: ResolvedSeries[];\n variant: ChartVariant;\n unit: string | undefined;\n showZeroLine: boolean;\n referenceLines: TimeseriesReferenceLine[];\n}) {\n const stacked = variant === \"stacked\";\n // Mirrored series carry negative values; show magnitudes on axis and tooltip.\n const seriesByKey = new Map(series.map((s) => [s.key, s]));\n // recharts needs a CSS color value; a series may carry a Tailwind class.\n const strokeOf = (s: ResolvedSeries) => resolveCssColor(s.color);\n // Distinct units map to a left and (when present) right axis; each series draws\n // against the axis for its unit so mixed-unit panels keep independent scales.\n const { axes: yAxes, axisOfKey } = useMemo(() => assignAxes(series), [series]);\n const axisOf = (key: string): \"left\" | \"right\" => axisOfKey.get(key) ?? \"left\";\n // A reference line draws against the axis formatting its unit, else the left.\n const axisOfUnit = (u: string | undefined): \"left\" | \"right\" =>\n yAxes.find((ax) => ax.unit === u)?.id ?? \"left\";\n const axes = (\n <>\n <CartesianGrid strokeOpacity={0.12} vertical={false} />\n <XAxis\n dataKey=\"at\"\n tickFormatter={formatClock}\n tick={{ fontSize: 10 }}\n stroke=\"currentColor\"\n strokeOpacity={0.35}\n minTickGap={32}\n />\n {yAxes.map((ax) => (\n <YAxis\n key={ax.id}\n yAxisId={ax.id}\n orientation={ax.orientation}\n tick={{ fontSize: 10 }}\n stroke=\"currentColor\"\n strokeOpacity={0.35}\n width={40}\n tickFormatter={(v: number) => formatUnit(Math.abs(v), ax.unit)}\n />\n ))}\n <Tooltip\n labelFormatter={(label) => formatClock(String(label))}\n formatter={(value, name) => {\n const s = seriesByKey.get(String(name));\n return [formatUnit(Math.abs(Number(value) || 0), s?.unit ?? unit), s?.label ?? String(name)];\n }}\n contentStyle={{ fontSize: 12 }}\n />\n {showZeroLine ? (\n <ReferenceLine yAxisId=\"left\" y={0} stroke=\"currentColor\" strokeOpacity={0.35} />\n ) : null}\n {referenceLines.map((ref, i) => (\n <ReferenceLine\n key={`ref-${i}`}\n yAxisId={axisOfUnit(ref.unit ?? unit)}\n y={ref.value}\n stroke={referenceColor(ref)}\n strokeDasharray=\"4 4\"\n ifOverflow=\"extendDomain\"\n />\n ))}\n </>\n );\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {variant === \"line\" ? (\n <LineChart data={rows} margin={{ top: 4, right: 8, bottom: 0, left: 0 }}>\n {axes}\n {series.map((s) => (\n <Line\n key={s.key}\n yAxisId={axisOf(s.key)}\n type=\"monotone\"\n dataKey={s.key}\n name={s.key}\n stroke={strokeOf(s)}\n strokeWidth={2}\n dot={false}\n connectNulls\n isAnimationActive={false}\n />\n ))}\n </LineChart>\n ) : (\n <AreaChart data={rows} margin={{ top: 4, right: 8, bottom: 0, left: 0 }}>\n {axes}\n {series.map((s) => (\n <Area\n key={s.key}\n yAxisId={axisOf(s.key)}\n type=\"monotone\"\n dataKey={s.key}\n name={s.key}\n stroke={strokeOf(s)}\n fill={strokeOf(s)}\n {...(stacked ? { stackId: `stack-${axisOf(s.key)}` } : {})}\n fillOpacity={stacked ? 0.7 : 0.12}\n strokeWidth={stacked ? 0 : 2}\n connectNulls\n isAnimationActive={false}\n />\n ))}\n </AreaChart>\n )}\n </ResponsiveContainer>\n );\n}\n\nfunction PanelMessage({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex h-full items-center justify-center text-xs text-muted-foreground\">\n {children}\n </div>\n );\n}\n\nfunction PanelIcon({ icon }: { icon: string | StaticIconComponent }) {\n if (typeof icon === \"string\") {\n return <Icon name={icon} width={16} height={16} className=\"text-muted-foreground\" />;\n }\n return <Icon icon={icon} width={16} height={16} className=\"text-muted-foreground\" />;\n}\n"],"mappings":";;;;;;;;;;;;;;AAkDA,SAAS,YAAY,IAAoB;CACvC,MAAM,OAAO,IAAI,KAAK,EAAE;CACxB,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG,OAAO;CACzC,OAAO,KAAK,mBAAmB,CAAC,GAAG;EAAE,MAAM;EAAW,QAAQ;CAAU,CAAC;AAC3E;AAEA,SAAgB,gBAAgB,OAA6B;CAC3D,MAAM,EACJ,OACA,MACA,MACA,QAAQ,MACR,YAAY,KACZ,SAAS,KACT,UAAU,QACV,aAAa,MACb,OACA,gBACA,UAAU,0BACV,cACE;CACJ,MAAM,cAAc,YAAY;CAGhC,MAAM,eAA6B,cAAc,SAAS;CAC1D,MAAM,gBAAgB,MAAM,iBAAiB;CAE7C,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAE9C,MAAM,YAAY,cAAc,cAAc,KAAK,GAAG,CAAC,KAAK,CAAC;CAC7D,MAAM,UAAU,qBACd,UAAU,KAAK,OAAO;EAAE,IAAI,EAAE;EAAK,MAAM,EAAE;CAAK,EAAE,GAClD;EAAE,SAAS,MAAM,WAAW;EAAI;EAAO;EAAW;CAAQ,CAC5D;CACA,MAAM,OAAO,kBAAkB,CAAC;CAEhC,MAAM,QAAQ,QAAQ,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS;CACrD,MAAM,UAAU,UAAU;CAC1B,MAAM,YAAY,QAAQ,MAAM,MAAM,EAAE,SAAS,KAAK,QAAQ,OAAO,MAAM,CAAC,EAAE,MAAM;CACpF,MAAM,SAAS,QAAQ,KAAK,MAAM,EAAE,MAAM;CAC1C,MAAM,EAAE,QAAQ,WAAW,cAAc,mBAAmB,OAAO,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC;CAC3F,MAAM,OAAO,cAAc,YAAY,QAAQ,MAAM,GAAG,CAAC,QAAQ,MAAM,CAAC;CACxE,MAAM,cAAc,OAAO,MAAM,MAAM,EAAE,SAAS;CAClD,MAAM,YAAY,cACT,cAAc,iBAAiB,QAAQ,MAAM,KAAK,IAAI,MAC7D;EAAC;EAAa;EAAQ;EAAM;CAAK,CACnC;CAIA,MAAM,YAAY,cAAc,KAAK,UAAU;CAE/C,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,6DAA6D,SAAS;EAAzF,UAAA;GACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACG,OAAO,oBAAC,WAAD,EAAiB,KAAO,CAAA,IAAI,MACpC,oBAAC,QAAD;MAAM,WAAU;MAAwC,UAAA;KAAY,CAAA,CAChE;IACN,CAAA,GAAA,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACG,YACC,oBAAC,kBAAD;MAAkB,OAAO,UAAU;MAAa;MAAM,OAAO,UAAU;KAAQ,CAAA,IAE/E,oBAAC,eAAD;MAAuB;MAAc;KAAO,CAAA,GAE7C,YACC,oBAAC,UAAD;MACE,MAAK;MACL,cAAW;MACX,eAAe,YAAY,IAAI;MAC/B,WAAU;MAEV,UAAA,oBAAC,MAAD;OAAM,MAAM;OAAc,OAAO;OAAI,QAAQ;MAAK,CAAA;KAC5C,CAAA,IACN,IACA;IACH,CAAA,CAAA;;GACL,oBAAC,OAAD;IAAK,WAAU;IAAO,OAAO,YAAY,KAAA,IAAY,EAAE,OAAO;IAC3D,UAAA,QACC,oBAAC,cAAD,EAAA,UAAe,MAAM,WAAW,wBAAsC,CAAA,IACpE,YACF,oBAAC,eAAD;KAAe,OAAO,UAAU;KAAa;KAAM,OAAO,UAAU;IAAQ,CAAA,IAC1E,YACF,oBAAC,cAAD,EAAA,UAAc,WAAsB,CAAA,IAClC,KAAK,SAAS,IAChB,oBAAC,cAAD,EAAA,UAAc,mBAA8B,CAAA,IAE5C,oBAAC,OAAD;KACQ;KACE;KACR,SAAS;KACH;KACN,cAAc;KACd,gBAAgB;IACjB,CAAA;GAEA,CAAA;GACJ,CAAC,aAAa,CAAC,WAAW,CAAC,aAAa,KAAK,UAAU,KAAK,OAAO,SAAS,KAAK,SAAS,IACzF,oBAAC,aAAD;IAAqB;IAAc;IAAM,gBAAgB;IAAY;GAAO,CAAA,IAC1E;GACH,YACC,qBAAC,OAAD;IAAO,MAAM;IAAU,eAAe,YAAY,KAAK;IAAU;IAAO,MAAK;IAA7E,UAAA,CACE,oBAAC,OAAD;KAAK,OAAO,EAAE,QAAQ,IAAI;KACxB,UAAA,oBAAC,OAAD;MACQ;MACE;MACR,SAAS;MACH;MACN,cAAc;MACd,gBAAgB;KACjB,CAAA;IACE,CAAA,GACJ,OAAO,SAAS,KAAK,SAAS,IAC7B,oBAAC,aAAD;KAAqB;KAAc;KAAM,gBAAgB;KAAY;IAAO,CAAA,IAC1E,IACC;GACL,CAAA,IAAA;EACD;;AAET;;;;;;AAOA,SAAS,cAAc,EAAE,QAAQ,QAAyD;CACxF,MAAM,OAAO,OAAO,WAAW,IAAI,OAAO,KAAK,KAAA;CAC/C,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,IAAI,SAAS,MAAM,KAAK,GAAG;CACjC,IAAI,MAAM,KAAA,GAAW,OAAO;CAC5B,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAgB,UAAA,WAAW,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI;CAAQ,CAAA;AAClF;AAEA,IAAM,uBAAuB;AAE7B,SAAS,eAAe,KAAsC;CAC5D,OAAO,gBAAgB,IAAI,SAAS,oBAAoB;AAC1D;;;;;AAMA,SAAS,YAAY,EACnB,QACA,MACA,gBACA,QAMC;CACD,OACE,qBAAC,MAAD;EAAI,WAAU;EAAd,UAAA,CACG,OAAO,KAAK,MAAM;GACjB,MAAM,IAAI,SAAS,MAAM,EAAE,GAAG;GAC9B,OACE,qBAAC,MAAD;IAAgB,WAAU;IAA1B,UAAA;KACE,oBAAC,QAAD;MACE,WAAU;MACV,OAAO,EAAE,iBAAiB,gBAAgB,EAAE,KAAK,EAAE;MACnD,eAAA;KACD,CAAA;KACD,oBAAC,QAAD;MAAM,WAAU;MAA4B,UAAA,EAAE;KAAY,CAAA;KACzD,MAAM,KAAA,IACL,oBAAC,QAAD;MAAM,WAAU;MAAgB,UAAA,WAAW,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI;KAAQ,CAAA,IACpE;IACF;GAVK,GAAA,EAAE,GAUP;EAER,CAAC,GACA,eAAe,KAAK,KAAK,MACxB,qBAAC,MAAD;GAAqB,WAAU;GAA/B,UAAA;IACE,oBAAC,QAAD;KACE,WAAU;KACV,OAAO,EAAE,iBAAiB,eAAe,GAAG,EAAE;KAC9C,eAAA;IACD,CAAA;IACD,oBAAC,QAAD;KAAM,WAAU;KAA4B,UAAA,IAAI;IAAY,CAAA;IAC5D,oBAAC,QAAD;KAAM,WAAU;KAAgB,UAAA,WAAW,IAAI,OAAO,IAAI,QAAQ,IAAI;IAAQ,CAAA;GAC5E;EARK,GAAA,OAAO,GAQZ,CACL,CACC;;AAER;;AAGA,SAAS,iBAAiB,EACxB,OACA,MACA,SAKC;CACD,MAAM,OAAO,MAAM,QAAQ,KAAK,OAAO,MAAM,GAAG,OAAO,CAAC;CACxD,MAAM,MAAM,QAAQ,IAAI,KAAK,IAAI,KAAM,OAAO,QAAS,GAAG,IAAI;CAC9D,OACE,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA;GACG,WAAW,MAAM,IAAI;GAAE;GAAI,WAAW,OAAO,IAAI;GAAE;GAAI,IAAI,QAAQ,CAAC;GAAE;EACnE;;AAEV;;AAGA,SAAS,cAAc,EACrB,OACA,MACA,SAKC;CACD,MAAM,WAA8B,MAAM,KAAK,QAAQ;EACrD,OAAO,GAAG;EACV,OAAO,GAAG;EACV,OAAO,GAAG;CACZ,EAAE;CACF,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,aAAD;GAAuB;GAAU,OAAO,QAAQ,IAAI,QAAQ;GAAG,QAAO;EAAO,CAAA,GAC5E,MAAM,SAAS,IACd,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,MAAM,KAAK,OACV,qBAAC,MAAD;IAAiB,WAAU;IAA3B,UAAA;KACE,oBAAC,QAAD;MACE,WAAU;MACV,OAAO,EAAE,iBAAiB,gBAAgB,GAAG,KAAK,EAAE;MACpD,eAAA;KACD,CAAA;KACD,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,GAAG;KACA,CAAA;KACN,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,WAAW,GAAG,OAAO,GAAG,QAAQ,IAAI;KACjC,CAAA;KACN,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACG,GAAG,QAAQ,QAAQ,CAAC,GAAE,GACnB;;IACJ;GAfK,GAAA,GAAG,GAeR,CACL;EACC,CAAA,IACF,IACD;;AAET;AAIA,SAAS,MAAM,EACb,MACA,QACA,SACA,MACA,cACA,kBAQC;CACD,MAAM,UAAU,YAAY;CAE5B,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;CAEzD,MAAM,YAAY,MAAsB,gBAAgB,EAAE,KAAK;CAG/D,MAAM,EAAE,MAAM,OAAO,cAAc,cAAc,WAAW,MAAM,GAAG,CAAC,MAAM,CAAC;CAC7E,MAAM,UAAU,QAAkC,UAAU,IAAI,GAAG,KAAK;CAExE,MAAM,cAAc,MAClB,MAAM,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM;CAC3C,MAAM,OACJ,qBAAAA,YAAA,EAAA,UAAA;EACE,oBAAC,eAAD;GAAe,eAAe;GAAM,UAAU;EAAQ,CAAA;EACtD,oBAAC,OAAD;GACE,SAAQ;GACR,eAAe;GACf,MAAM,EAAE,UAAU,GAAG;GACrB,QAAO;GACP,eAAe;GACf,YAAY;EACb,CAAA;EACA,MAAM,KAAK,OACV,oBAAC,OAAD;GAEE,SAAS,GAAG;GACZ,aAAa,GAAG;GAChB,MAAM,EAAE,UAAU,GAAG;GACrB,QAAO;GACP,eAAe;GACf,OAAO;GACP,gBAAgB,MAAc,WAAW,KAAK,IAAI,CAAC,GAAG,GAAG,IAAI;EAC9D,GARM,GAAG,EAQT,CACF;EACD,oBAAC,SAAD;GACE,iBAAiB,UAAU,YAAY,OAAO,KAAK,CAAC;GACpD,YAAY,OAAO,SAAS;IAC1B,MAAM,IAAI,YAAY,IAAI,OAAO,IAAI,CAAC;IACtC,OAAO,CAAC,WAAW,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,GAAG,QAAQ,IAAI,GAAG,GAAG,SAAS,OAAO,IAAI,CAAC;GAC7F;GACA,cAAc,EAAE,UAAU,GAAG;EAC9B,CAAA;EACA,eACC,oBAAC,eAAD;GAAe,SAAQ;GAAO,GAAG;GAAG,QAAO;GAAe,eAAe;EAAO,CAAA,IAC9E;EACH,eAAe,KAAK,KAAK,MACxB,oBAAC,eAAD;GAEE,SAAS,WAAW,IAAI,QAAQ,IAAI;GACpC,GAAG,IAAI;GACP,QAAQ,eAAe,GAAG;GAC1B,iBAAgB;GAChB,YAAW;EACZ,GANM,OAAO,GAMb,CACF;CACD,EAAA,CAAA;CAGJ,OACE,oBAAC,qBAAD;EAAqB,OAAM;EAAO,QAAO;EACtC,UAAA,YAAY,SACX,qBAAC,WAAD;GAAW,MAAM;GAAM,QAAQ;IAAE,KAAK;IAAG,OAAO;IAAG,QAAQ;IAAG,MAAM;GAAE;GAAtE,UAAA,CACG,MACA,OAAO,KAAK,MACX,oBAAC,MAAD;IAEE,SAAS,OAAO,EAAE,GAAG;IACrB,MAAK;IACL,SAAS,EAAE;IACX,MAAM,EAAE;IACR,QAAQ,SAAS,CAAC;IAClB,aAAa;IACb,KAAK;IACL,cAAA;IACA,mBAAmB;GACpB,GAVM,EAAE,GAUR,CACF,CACQ;EAEX,CAAA,IAAA,qBAAC,WAAD;GAAW,MAAM;GAAM,QAAQ;IAAE,KAAK;IAAG,OAAO;IAAG,QAAQ;IAAG,MAAM;GAAE;GAAtE,UAAA,CACG,MACA,OAAO,KAAK,MACX,oBAAC,MAAD;IAEE,SAAS,OAAO,EAAE,GAAG;IACrB,MAAK;IACL,SAAS,EAAE;IACX,MAAM,EAAE;IACR,QAAQ,SAAS,CAAC;IAClB,MAAM,SAAS,CAAC;IAChB,GAAK,UAAU,EAAE,SAAS,SAAS,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC;IACxD,aAAa,UAAU,KAAM;IAC7B,aAAa,UAAU,IAAI;IAC3B,cAAA;IACA,mBAAmB;GACpB,GAZM,EAAE,GAYR,CACF,CACQ;;CAEM,CAAA;AAEzB;AAEA,SAAS,aAAa,EAAE,YAA2C;CACjE,OACE,oBAAC,OAAD;EAAK,WAAU;EACZ;CACE,CAAA;AAET;AAEA,SAAS,UAAU,EAAE,QAAgD;CACnE,IAAI,OAAO,SAAS,UAClB,OAAO,oBAAC,MAAD;EAAM,MAAM;EAAM,OAAO;EAAI,QAAQ;EAAI,WAAU;CAAyB,CAAA;CAErF,OAAO,oBAAC,MAAD;EAAY;EAAM,OAAO;EAAI,QAAQ;EAAI,WAAU;CAAyB,CAAA;AACrF"}
|
|
@@ -9,19 +9,70 @@ var SERIES_PALETTE = [
|
|
|
9
9
|
function paletteColor(index) {
|
|
10
10
|
return SERIES_PALETTE[index % SERIES_PALETTE.length] ?? SERIES_PALETTE[0];
|
|
11
11
|
}
|
|
12
|
-
/**
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
/** The label-set values in key order, e.g. `{ pod: "api", ns: "x" }` → "x, api". */
|
|
13
|
+
function labelValues(labels) {
|
|
14
|
+
if (!labels) return void 0;
|
|
15
|
+
const values = Object.keys(labels).sort().map((key) => labels[key]);
|
|
16
|
+
return values.length > 0 ? values.join(", ") : void 0;
|
|
17
|
+
}
|
|
18
|
+
function requestedSeries(props) {
|
|
19
|
+
return props.series ?? (props.url ? [{ id: props.url }] : []);
|
|
20
|
+
}
|
|
21
|
+
function resolveEntry(s, index, props, servedUnit) {
|
|
22
|
+
const unit = s.unit ?? servedUnit ?? props.unit;
|
|
23
|
+
return {
|
|
16
24
|
key: s.id,
|
|
17
|
-
url:
|
|
18
|
-
label: s.label ?? s.id,
|
|
19
|
-
color: s.color ?? paletteColor(
|
|
20
|
-
...
|
|
25
|
+
url: (props.baseUrl ?? "") + s.id,
|
|
26
|
+
label: s.label ?? labelValues(s.labels) ?? s.id,
|
|
27
|
+
color: s.color ?? paletteColor(index),
|
|
28
|
+
...unit ? { unit } : {},
|
|
21
29
|
...s.transform ? { transform: s.transform } : {},
|
|
22
30
|
...s.load ? { load: s.load } : {},
|
|
23
|
-
...s.current !== void 0 ? { current: s.current } : {}
|
|
24
|
-
|
|
31
|
+
...s.current !== void 0 ? { current: s.current } : {},
|
|
32
|
+
...s.labels ? { labels: s.labels } : {},
|
|
33
|
+
...s.source ? { source: s.source } : {}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Normalises the single-url and baseUrl+series forms to one list. */
|
|
37
|
+
function resolveSeries(props) {
|
|
38
|
+
return requestedSeries(props).map((s, i) => resolveEntry(s, i, props));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolves what a panel plots from what its requested series were answered
|
|
42
|
+
* with (`served`, index-aligned with the requested series; undefined while a
|
|
43
|
+
* series is loading). A requested id answered by its own series alone keeps
|
|
44
|
+
* the panel's label, color and `current`; an id that expanded into several
|
|
45
|
+
* series plots each one, labelled by its `label` or label values. A series
|
|
46
|
+
* without a unit of its own takes the served unit, then the panel `unit`.
|
|
47
|
+
*/
|
|
48
|
+
function expandServedSeries(props, served) {
|
|
49
|
+
const series = [];
|
|
50
|
+
const points = [];
|
|
51
|
+
requestedSeries(props).forEach((requested, i) => {
|
|
52
|
+
const answer = served[i];
|
|
53
|
+
const [first] = answer ?? [];
|
|
54
|
+
if (!answer || !first || answer.length === 1 && first.id === requested.id) {
|
|
55
|
+
series.push(resolveEntry(requested, series.length, props, first?.unit));
|
|
56
|
+
points.push(answer ? first?.points ?? [] : void 0);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const s of answer) {
|
|
60
|
+
const expanded = {
|
|
61
|
+
id: s.id,
|
|
62
|
+
source: requested.id,
|
|
63
|
+
...s.label ? { label: s.label } : {},
|
|
64
|
+
...s.labels ? { labels: s.labels } : {},
|
|
65
|
+
...requested.unit ? { unit: requested.unit } : {},
|
|
66
|
+
...requested.transform ? { transform: requested.transform } : {}
|
|
67
|
+
};
|
|
68
|
+
series.push(resolveEntry(expanded, series.length, props, s.unit));
|
|
69
|
+
points.push(s.points);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
series,
|
|
74
|
+
points
|
|
75
|
+
};
|
|
25
76
|
}
|
|
26
77
|
function resolveBreakdown(series, rows, total) {
|
|
27
78
|
const withValue = series.map((s) => ({
|
|
@@ -52,6 +103,7 @@ function mergeSeries(series, pointsBySeries) {
|
|
|
52
103
|
});
|
|
53
104
|
return [...rows.values()].sort((a, b) => a.at.localeCompare(b.at));
|
|
54
105
|
}
|
|
106
|
+
exports.expandServedSeries = expandServedSeries;
|
|
55
107
|
exports.mergeSeries = mergeSeries;
|
|
56
108
|
exports.resolveBreakdown = resolveBreakdown;
|
|
57
109
|
exports.resolveSeries = resolveSeries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeseriesPanel.model.cjs","names":["latestOf"],"sources":["../../src/data/TimeseriesPanel.model.ts"],"sourcesContent":["import type { StaticIconComponent } from \"./Icon\";\nimport { latestOf } from \"./TimeseriesPanel.axes\";\n\nexport interface TimeseriesPoint {\n at: string;\n value: number;\n}\n\nexport interface TimeseriesResponse {\n id: string;\n points: TimeseriesPoint[];\n}\n\n/** What a {@link SeriesLoader} receives from the widget polling it. */\nexport interface SeriesLoadContext {\n /** The widget's look-back window, e.g. \"1h\". */\n range: string;\n /** Aborted when the query is cancelled, e.g. the widget unmounts mid-request. */\n signal: AbortSignal;\n}\n\n/**\n * Loads a series directly, instead of the widget requesting `baseUrl + id`\n * through its `fetcher`. Called again whenever the range changes and on every\n * poll.\n */\nexport type SeriesLoader = (ctx: SeriesLoadContext) => Promise<TimeseriesResponse>;\n\n/**\n * One metric plotted on a panel. Its request URL is `baseUrl + id`, unless a\n * `load` function supplies the data.\n */\nexport interface TimeseriesSeries {\n /**\n * Metric id appended to the panel's baseUrl, e.g. \"sqlserver.iops.read\".\n * With `load`, the id is the series' cache identity instead: loaded series\n * are cached under `[\"timeseries\", \"load\", id, range]`, so it must be unique\n * per data source (two series sharing an id share one cached response).\n */\n id: string;\n /** Loads the series' points; when set, `baseUrl` and `fetcher` are not used. */\n load?: SeriesLoader;\n /** Tooltip/legend label; defaults to the id. */\n label?: string;\n /**\n * Maps each point's value before plotting, e.g. writes pass `(v) => -v` to\n * render below the zero axis. Identity when omitted.\n */\n transform?: (value: number) => number;\n /**\n * Stroke/fill override as a CSS color value or a Tailwind color class.\n * Defaults cycle a small palette by index.\n */\n color?: string;\n /**\n * Grafana-style unit key for this series' readout/tooltip. Falls back to the\n * panel-level `unit`.\n */\n unit?: string;\n /**\n * Instantaneous value for the `breakdown` variant. When omitted, the\n * breakdown falls back to the latest polled point.\n */\n current?: number;\n}\n\n/** A horizontal marker line at a fixed value, e.g. a static capacity. */\nexport interface TimeseriesReferenceLine {\n value: number;\n /** Legend label, e.g. \"capacity\". */\n label: string;\n /** CSS color value or Tailwind color class; defaults to the muted foreground. */\n color?: string;\n /** Grafana-style unit key for the legend value; falls back to the panel `unit`. */\n unit?: string;\n}\n\nexport interface TimeseriesPanelProps {\n url?: string;\n baseUrl?: string;\n series?: TimeseriesSeries[];\n title: string;\n icon?: string | StaticIconComponent;\n unit?: string;\n range?: string;\n refreshMs?: number;\n height?: number;\n variant?: \"area\" | \"line\" | \"stacked\" | \"breakdown\";\n expandVariant?: \"area\" | \"line\" | \"stacked\";\n total?: number;\n /** Flat lines drawn across the time-series chart, e.g. a fixed capacity. */\n referenceLines?: TimeseriesReferenceLine[];\n expandable?: boolean;\n fetcher?: (url: string) => Promise<TimeseriesResponse>;\n className?: string;\n}\n\nconst SERIES_PALETTE = [\n \"var(--chart-1, #3b82f6)\",\n \"var(--chart-2, #ef4444)\",\n \"var(--chart-3, #10b981)\",\n \"var(--chart-4, #f59e0b)\",\n] as const;\n\nfunction paletteColor(index: number): string {\n return SERIES_PALETTE[index % SERIES_PALETTE.length] ?? SERIES_PALETTE[0];\n}\n\n/** A series with its full request URL, resolved label, color, and unit. */\nexport interface ResolvedSeries {\n key: string;\n url: string;\n label: string;\n color: string;\n unit?: string;\n transform?: (value: number) => number;\n load?: SeriesLoader;\n current?: number;\n}\n\n/** Normalises the single-url and baseUrl+series forms to one list. */\nexport function resolveSeries(props: TimeseriesPanelProps): ResolvedSeries[] {\n const base = props.baseUrl ?? \"\";\n const list = props.series ?? (props.url ? [{ id: props.url }] : []);\n return list.map((s, i) => ({\n key: s.id,\n url: base + s.id,\n label: s.label ?? s.id,\n color: s.color ?? paletteColor(i),\n ...(s.unit ?? props.unit ? { unit: s.unit ?? props.unit } : {}),\n ...(s.transform ? { transform: s.transform } : {}),\n ...(s.load ? { load: s.load } : {}),\n ...(s.current !== undefined ? { current: s.current } : {}),\n }));\n}\n\n/** One legend/bar row of the breakdown variant. */\nexport interface BreakdownItem {\n key: string;\n label: string;\n color: string;\n unit?: string;\n value: number;\n percent: number;\n}\n\n/**\n * One row of the merged chart data: the timestamp in `at` plus each series'\n * value under its key.\n */\nexport interface MergedRow {\n at: string;\n [seriesKey: string]: string | number | undefined;\n}\n\nexport function resolveBreakdown(\n series: ResolvedSeries[],\n rows: MergedRow[],\n total?: number,\n): { items: BreakdownItem[]; total: number } {\n const withValue = series.map((s) => ({ s, value: s.current ?? latestOf(rows, s.key) ?? 0 }));\n const denom = total ?? withValue.reduce((acc, w) => acc + w.value, 0);\n const items = withValue.map(({ s, value }) => ({\n key: s.key,\n label: s.label,\n color: s.color,\n ...(s.unit ? { unit: s.unit } : {}),\n value,\n percent: denom > 0 ? Math.min(100, Math.max(0, (value / denom) * 100)) : 0,\n }));\n return { items, total: denom };\n}\n\nexport function mergeSeries(\n series: ResolvedSeries[],\n pointsBySeries: (TimeseriesPoint[] | undefined)[],\n): MergedRow[] {\n const rows = new Map<string, MergedRow>();\n series.forEach((s, i) => {\n for (const p of pointsBySeries[i] ?? []) {\n const row = rows.get(p.at) ?? { at: p.at };\n row[s.key] = s.transform ? s.transform(p.value) : p.value;\n rows.set(p.at, row);\n }\n });\n return [...rows.values()].sort((a, b) => a.at.localeCompare(b.at));\n}\n"],"mappings":";;AAiGA,IAAM,iBAAiB;CACrB;CACA;CACA;CACA;AACF;AAEA,SAAS,aAAa,OAAuB;CAC3C,OAAO,eAAe,QAAQ,eAAe,WAAW,eAAe;AACzE;;AAeA,SAAgB,cAAc,OAA+C;CAC3E,MAAM,OAAO,MAAM,WAAW;CAE9B,QADa,MAAM,WAAW,MAAM,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,GAAA,CACrD,KAAK,GAAG,OAAO;EACzB,KAAK,EAAE;EACP,KAAK,OAAO,EAAE;EACd,OAAO,EAAE,SAAS,EAAE;EACpB,OAAO,EAAE,SAAS,aAAa,CAAC;EAChC,GAAI,EAAE,QAAQ,MAAM,OAAO,EAAE,MAAM,EAAE,QAAQ,MAAM,KAAK,IAAI,CAAC;EAC7D,GAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;EAChD,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;EACjC,GAAI,EAAE,YAAY,KAAA,IAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;CAC1D,EAAE;AACJ;AAqBA,SAAgB,iBACd,QACA,MACA,OAC2C;CAC3C,MAAM,YAAY,OAAO,KAAK,OAAO;EAAE;EAAG,OAAO,EAAE,WAAWA,6BAAAA,SAAS,MAAM,EAAE,GAAG,KAAK;CAAE,EAAE;CAC3F,MAAM,QAAQ,SAAS,UAAU,QAAQ,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;CASpE,OAAO;EAAE,OARK,UAAU,KAAK,EAAE,GAAG,aAAa;GAC7C,KAAK,EAAE;GACP,OAAO,EAAE;GACT,OAAO,EAAE;GACT,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;GACjC;GACA,SAAS,QAAQ,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAI,QAAQ,QAAS,GAAG,CAAC,IAAI;EAC3E,EACS;EAAO,OAAO;CAAM;AAC/B;AAEA,SAAgB,YACd,QACA,gBACa;CACb,MAAM,uBAAO,IAAI,IAAuB;CACxC,OAAO,SAAS,GAAG,MAAM;EACvB,KAAK,MAAM,KAAK,eAAe,MAAM,CAAC,GAAG;GACvC,MAAM,MAAM,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG;GACzC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE;GACpD,KAAK,IAAI,EAAE,IAAI,GAAG;EACpB;CACF,CAAC;CACD,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AACnE"}
|
|
1
|
+
{"version":3,"file":"TimeseriesPanel.model.cjs","names":["latestOf"],"sources":["../../src/data/TimeseriesPanel.model.ts"],"sourcesContent":["import type { StaticIconComponent } from \"./Icon\";\nimport { latestOf } from \"./TimeseriesPanel.axes\";\n\nexport interface TimeseriesPoint {\n at: string;\n value: number;\n}\n\nexport interface TimeseriesResponse {\n id: string;\n points: TimeseriesPoint[];\n}\n\n/**\n * One series as the metrics stream serves it. `source` is the id a panel\n * requested; one requested id can expand into several series (a profile\n * grouped by pod, say), each with its own `id` (`<source>#<labels>`) and\n * `labels`. For a plain metric id, `id === source`.\n */\nexport interface TimeseriesServerSeries {\n id: string;\n source: string;\n label?: string;\n labels?: Record<string, string>;\n /** A `formatUnit` key, used when the panel series names no unit. */\n unit?: string;\n points: TimeseriesPoint[];\n}\n\n/** What a {@link SeriesLoader} receives from the widget polling it. */\nexport interface SeriesLoadContext {\n /** The widget's look-back window, e.g. \"1h\". */\n range: string;\n /** Aborted when the query is cancelled, e.g. the widget unmounts mid-request. */\n signal: AbortSignal;\n}\n\n/**\n * Loads a series directly, instead of the widget requesting `baseUrl + id`\n * through its `fetcher`. Called again whenever the range changes and on every\n * poll.\n */\nexport type SeriesLoader = (ctx: SeriesLoadContext) => Promise<TimeseriesResponse>;\n\n/**\n * One metric plotted on a panel. Its request URL is `baseUrl + id`, unless a\n * `load` function supplies the data.\n */\nexport interface TimeseriesSeries {\n /**\n * Metric id appended to the panel's baseUrl, e.g. \"sqlserver.iops.read\".\n * With `load`, the id is the series' cache identity instead: loaded series\n * are cached under `[\"timeseries\", \"load\", id, range]`, so it must be unique\n * per data source (two series sharing an id share one cached response).\n */\n id: string;\n /** Loads the series' points; when set, `baseUrl` and `fetcher` are not used. */\n load?: SeriesLoader;\n /** Tooltip/legend label; defaults to the `labels` values, then the id. */\n label?: string;\n /** The series' label set, e.g. `{ pod: \"api\" }`; its values label the series when `label` is unset. */\n labels?: Record<string, string>;\n /**\n * The requested id this series was expanded from, when one id answers with\n * several series (see {@link TimeseriesServerSeries}). Unset on requested series.\n */\n source?: string;\n /**\n * Maps each point's value before plotting, e.g. writes pass `(v) => -v` to\n * render below the zero axis. Identity when omitted.\n */\n transform?: (value: number) => number;\n /**\n * Stroke/fill override as a CSS color value or a Tailwind color class.\n * Defaults cycle a small palette by index.\n */\n color?: string;\n /**\n * Grafana-style unit key for this series' readout/tooltip. Falls back to the\n * panel-level `unit`.\n */\n unit?: string;\n /**\n * Instantaneous value for the `breakdown` variant. When omitted, the\n * breakdown falls back to the latest polled point.\n */\n current?: number;\n}\n\n/** A horizontal marker line at a fixed value, e.g. a static capacity. */\nexport interface TimeseriesReferenceLine {\n value: number;\n /** Legend label, e.g. \"capacity\". */\n label: string;\n /** CSS color value or Tailwind color class; defaults to the muted foreground. */\n color?: string;\n /** Grafana-style unit key for the legend value; falls back to the panel `unit`. */\n unit?: string;\n}\n\nexport interface TimeseriesPanelProps {\n url?: string;\n baseUrl?: string;\n series?: TimeseriesSeries[];\n title: string;\n icon?: string | StaticIconComponent;\n unit?: string;\n range?: string;\n refreshMs?: number;\n height?: number;\n variant?: \"area\" | \"line\" | \"stacked\" | \"breakdown\";\n expandVariant?: \"area\" | \"line\" | \"stacked\";\n total?: number;\n /** Flat lines drawn across the time-series chart, e.g. a fixed capacity. */\n referenceLines?: TimeseriesReferenceLine[];\n expandable?: boolean;\n fetcher?: (url: string) => Promise<TimeseriesResponse>;\n className?: string;\n}\n\nconst SERIES_PALETTE = [\n \"var(--chart-1, #3b82f6)\",\n \"var(--chart-2, #ef4444)\",\n \"var(--chart-3, #10b981)\",\n \"var(--chart-4, #f59e0b)\",\n] as const;\n\nfunction paletteColor(index: number): string {\n return SERIES_PALETTE[index % SERIES_PALETTE.length] ?? SERIES_PALETTE[0];\n}\n\n/** A series with its full request URL, resolved label, color, and unit. */\nexport interface ResolvedSeries {\n key: string;\n url: string;\n label: string;\n color: string;\n unit?: string;\n transform?: (value: number) => number;\n load?: SeriesLoader;\n current?: number;\n labels?: Record<string, string>;\n /** The requested id an expanded series came from; unset on requested series. */\n source?: string;\n}\n\n/** The label-set values in key order, e.g. `{ pod: \"api\", ns: \"x\" }` → \"x, api\". */\nfunction labelValues(labels: Record<string, string> | undefined): string | undefined {\n if (!labels) return undefined;\n const values = Object.keys(labels)\n .sort()\n .map((key) => labels[key]);\n return values.length > 0 ? values.join(\", \") : undefined;\n}\n\nfunction requestedSeries(props: TimeseriesPanelProps): TimeseriesSeries[] {\n return props.series ?? (props.url ? [{ id: props.url }] : []);\n}\n\nfunction resolveEntry(\n s: TimeseriesSeries,\n index: number,\n props: TimeseriesPanelProps,\n servedUnit?: string,\n): ResolvedSeries {\n const unit = s.unit ?? servedUnit ?? props.unit;\n return {\n key: s.id,\n url: (props.baseUrl ?? \"\") + s.id,\n label: s.label ?? labelValues(s.labels) ?? s.id,\n color: s.color ?? paletteColor(index),\n ...(unit ? { unit } : {}),\n ...(s.transform ? { transform: s.transform } : {}),\n ...(s.load ? { load: s.load } : {}),\n ...(s.current !== undefined ? { current: s.current } : {}),\n ...(s.labels ? { labels: s.labels } : {}),\n ...(s.source ? { source: s.source } : {}),\n };\n}\n\n/** Normalises the single-url and baseUrl+series forms to one list. */\nexport function resolveSeries(props: TimeseriesPanelProps): ResolvedSeries[] {\n return requestedSeries(props).map((s, i) => resolveEntry(s, i, props));\n}\n\n/** The series a panel plots, index-aligned with each one's points (undefined while loading). */\nexport interface DisplaySeries {\n series: ResolvedSeries[];\n points: (TimeseriesPoint[] | undefined)[];\n}\n\n/**\n * Resolves what a panel plots from what its requested series were answered\n * with (`served`, index-aligned with the requested series; undefined while a\n * series is loading). A requested id answered by its own series alone keeps\n * the panel's label, color and `current`; an id that expanded into several\n * series plots each one, labelled by its `label` or label values. A series\n * without a unit of its own takes the served unit, then the panel `unit`.\n */\nexport function expandServedSeries(\n props: TimeseriesPanelProps,\n served: readonly (readonly TimeseriesServerSeries[] | undefined)[],\n): DisplaySeries {\n const series: ResolvedSeries[] = [];\n const points: (TimeseriesPoint[] | undefined)[] = [];\n requestedSeries(props).forEach((requested, i) => {\n const answer = served[i];\n const [first] = answer ?? [];\n if (!answer || !first || (answer.length === 1 && first.id === requested.id)) {\n series.push(resolveEntry(requested, series.length, props, first?.unit));\n points.push(answer ? (first?.points ?? []) : undefined);\n return;\n }\n for (const s of answer) {\n const expanded: TimeseriesSeries = {\n id: s.id,\n source: requested.id,\n ...(s.label ? { label: s.label } : {}),\n ...(s.labels ? { labels: s.labels } : {}),\n ...(requested.unit ? { unit: requested.unit } : {}),\n ...(requested.transform ? { transform: requested.transform } : {}),\n };\n series.push(resolveEntry(expanded, series.length, props, s.unit));\n points.push(s.points);\n }\n });\n return { series, points };\n}\n\n/** One legend/bar row of the breakdown variant. */\nexport interface BreakdownItem {\n key: string;\n label: string;\n color: string;\n unit?: string;\n value: number;\n percent: number;\n}\n\n/**\n * One row of the merged chart data: the timestamp in `at` plus each series'\n * value under its key.\n */\nexport interface MergedRow {\n at: string;\n [seriesKey: string]: string | number | undefined;\n}\n\nexport function resolveBreakdown(\n series: ResolvedSeries[],\n rows: MergedRow[],\n total?: number,\n): { items: BreakdownItem[]; total: number } {\n const withValue = series.map((s) => ({ s, value: s.current ?? latestOf(rows, s.key) ?? 0 }));\n const denom = total ?? withValue.reduce((acc, w) => acc + w.value, 0);\n const items = withValue.map(({ s, value }) => ({\n key: s.key,\n label: s.label,\n color: s.color,\n ...(s.unit ? { unit: s.unit } : {}),\n value,\n percent: denom > 0 ? Math.min(100, Math.max(0, (value / denom) * 100)) : 0,\n }));\n return { items, total: denom };\n}\n\nexport function mergeSeries(\n series: ResolvedSeries[],\n pointsBySeries: (TimeseriesPoint[] | undefined)[],\n): MergedRow[] {\n const rows = new Map<string, MergedRow>();\n series.forEach((s, i) => {\n for (const p of pointsBySeries[i] ?? []) {\n const row = rows.get(p.at) ?? { at: p.at };\n row[s.key] = s.transform ? s.transform(p.value) : p.value;\n rows.set(p.at, row);\n }\n });\n return [...rows.values()].sort((a, b) => a.at.localeCompare(b.at));\n}\n"],"mappings":"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"}
|
|
@@ -7,6 +7,21 @@ export interface TimeseriesResponse {
|
|
|
7
7
|
id: string;
|
|
8
8
|
points: TimeseriesPoint[];
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* One series as the metrics stream serves it. `source` is the id a panel
|
|
12
|
+
* requested; one requested id can expand into several series (a profile
|
|
13
|
+
* grouped by pod, say), each with its own `id` (`<source>#<labels>`) and
|
|
14
|
+
* `labels`. For a plain metric id, `id === source`.
|
|
15
|
+
*/
|
|
16
|
+
export interface TimeseriesServerSeries {
|
|
17
|
+
id: string;
|
|
18
|
+
source: string;
|
|
19
|
+
label?: string;
|
|
20
|
+
labels?: Record<string, string>;
|
|
21
|
+
/** A `formatUnit` key, used when the panel series names no unit. */
|
|
22
|
+
unit?: string;
|
|
23
|
+
points: TimeseriesPoint[];
|
|
24
|
+
}
|
|
10
25
|
/** What a {@link SeriesLoader} receives from the widget polling it. */
|
|
11
26
|
export interface SeriesLoadContext {
|
|
12
27
|
/** The widget's look-back window, e.g. "1h". */
|
|
@@ -34,8 +49,15 @@ export interface TimeseriesSeries {
|
|
|
34
49
|
id: string;
|
|
35
50
|
/** Loads the series' points; when set, `baseUrl` and `fetcher` are not used. */
|
|
36
51
|
load?: SeriesLoader;
|
|
37
|
-
/** Tooltip/legend label; defaults to the id. */
|
|
52
|
+
/** Tooltip/legend label; defaults to the `labels` values, then the id. */
|
|
38
53
|
label?: string;
|
|
54
|
+
/** The series' label set, e.g. `{ pod: "api" }`; its values label the series when `label` is unset. */
|
|
55
|
+
labels?: Record<string, string>;
|
|
56
|
+
/**
|
|
57
|
+
* The requested id this series was expanded from, when one id answers with
|
|
58
|
+
* several series (see {@link TimeseriesServerSeries}). Unset on requested series.
|
|
59
|
+
*/
|
|
60
|
+
source?: string;
|
|
39
61
|
/**
|
|
40
62
|
* Maps each point's value before plotting, e.g. writes pass `(v) => -v` to
|
|
41
63
|
* render below the zero axis. Identity when omitted.
|
|
@@ -96,9 +118,26 @@ export interface ResolvedSeries {
|
|
|
96
118
|
transform?: (value: number) => number;
|
|
97
119
|
load?: SeriesLoader;
|
|
98
120
|
current?: number;
|
|
121
|
+
labels?: Record<string, string>;
|
|
122
|
+
/** The requested id an expanded series came from; unset on requested series. */
|
|
123
|
+
source?: string;
|
|
99
124
|
}
|
|
100
125
|
/** Normalises the single-url and baseUrl+series forms to one list. */
|
|
101
126
|
export declare function resolveSeries(props: TimeseriesPanelProps): ResolvedSeries[];
|
|
127
|
+
/** The series a panel plots, index-aligned with each one's points (undefined while loading). */
|
|
128
|
+
export interface DisplaySeries {
|
|
129
|
+
series: ResolvedSeries[];
|
|
130
|
+
points: (TimeseriesPoint[] | undefined)[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolves what a panel plots from what its requested series were answered
|
|
134
|
+
* with (`served`, index-aligned with the requested series; undefined while a
|
|
135
|
+
* series is loading). A requested id answered by its own series alone keeps
|
|
136
|
+
* the panel's label, color and `current`; an id that expanded into several
|
|
137
|
+
* series plots each one, labelled by its `label` or label values. A series
|
|
138
|
+
* without a unit of its own takes the served unit, then the panel `unit`.
|
|
139
|
+
*/
|
|
140
|
+
export declare function expandServedSeries(props: TimeseriesPanelProps, served: readonly (readonly TimeseriesServerSeries[] | undefined)[]): DisplaySeries;
|
|
102
141
|
/** One legend/bar row of the breakdown variant. */
|
|
103
142
|
export interface BreakdownItem {
|
|
104
143
|
key: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeseriesPanel.model.d.ts","sourceRoot":"","sources":["../../src/data/TimeseriesPanel.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAGlD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEnF;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,gFAAgF;IAChF,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"TimeseriesPanel.model.d.ts","sourceRoot":"","sources":["../../src/data/TimeseriesPanel.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,19 +9,70 @@ var SERIES_PALETTE = [
|
|
|
9
9
|
function paletteColor(index) {
|
|
10
10
|
return SERIES_PALETTE[index % SERIES_PALETTE.length] ?? SERIES_PALETTE[0];
|
|
11
11
|
}
|
|
12
|
-
/**
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
/** The label-set values in key order, e.g. `{ pod: "api", ns: "x" }` → "x, api". */
|
|
13
|
+
function labelValues(labels) {
|
|
14
|
+
if (!labels) return void 0;
|
|
15
|
+
const values = Object.keys(labels).sort().map((key) => labels[key]);
|
|
16
|
+
return values.length > 0 ? values.join(", ") : void 0;
|
|
17
|
+
}
|
|
18
|
+
function requestedSeries(props) {
|
|
19
|
+
return props.series ?? (props.url ? [{ id: props.url }] : []);
|
|
20
|
+
}
|
|
21
|
+
function resolveEntry(s, index, props, servedUnit) {
|
|
22
|
+
const unit = s.unit ?? servedUnit ?? props.unit;
|
|
23
|
+
return {
|
|
16
24
|
key: s.id,
|
|
17
|
-
url:
|
|
18
|
-
label: s.label ?? s.id,
|
|
19
|
-
color: s.color ?? paletteColor(
|
|
20
|
-
...
|
|
25
|
+
url: (props.baseUrl ?? "") + s.id,
|
|
26
|
+
label: s.label ?? labelValues(s.labels) ?? s.id,
|
|
27
|
+
color: s.color ?? paletteColor(index),
|
|
28
|
+
...unit ? { unit } : {},
|
|
21
29
|
...s.transform ? { transform: s.transform } : {},
|
|
22
30
|
...s.load ? { load: s.load } : {},
|
|
23
|
-
...s.current !== void 0 ? { current: s.current } : {}
|
|
24
|
-
|
|
31
|
+
...s.current !== void 0 ? { current: s.current } : {},
|
|
32
|
+
...s.labels ? { labels: s.labels } : {},
|
|
33
|
+
...s.source ? { source: s.source } : {}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Normalises the single-url and baseUrl+series forms to one list. */
|
|
37
|
+
function resolveSeries(props) {
|
|
38
|
+
return requestedSeries(props).map((s, i) => resolveEntry(s, i, props));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolves what a panel plots from what its requested series were answered
|
|
42
|
+
* with (`served`, index-aligned with the requested series; undefined while a
|
|
43
|
+
* series is loading). A requested id answered by its own series alone keeps
|
|
44
|
+
* the panel's label, color and `current`; an id that expanded into several
|
|
45
|
+
* series plots each one, labelled by its `label` or label values. A series
|
|
46
|
+
* without a unit of its own takes the served unit, then the panel `unit`.
|
|
47
|
+
*/
|
|
48
|
+
function expandServedSeries(props, served) {
|
|
49
|
+
const series = [];
|
|
50
|
+
const points = [];
|
|
51
|
+
requestedSeries(props).forEach((requested, i) => {
|
|
52
|
+
const answer = served[i];
|
|
53
|
+
const [first] = answer ?? [];
|
|
54
|
+
if (!answer || !first || answer.length === 1 && first.id === requested.id) {
|
|
55
|
+
series.push(resolveEntry(requested, series.length, props, first?.unit));
|
|
56
|
+
points.push(answer ? first?.points ?? [] : void 0);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const s of answer) {
|
|
60
|
+
const expanded = {
|
|
61
|
+
id: s.id,
|
|
62
|
+
source: requested.id,
|
|
63
|
+
...s.label ? { label: s.label } : {},
|
|
64
|
+
...s.labels ? { labels: s.labels } : {},
|
|
65
|
+
...requested.unit ? { unit: requested.unit } : {},
|
|
66
|
+
...requested.transform ? { transform: requested.transform } : {}
|
|
67
|
+
};
|
|
68
|
+
series.push(resolveEntry(expanded, series.length, props, s.unit));
|
|
69
|
+
points.push(s.points);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
series,
|
|
74
|
+
points
|
|
75
|
+
};
|
|
25
76
|
}
|
|
26
77
|
function resolveBreakdown(series, rows, total) {
|
|
27
78
|
const withValue = series.map((s) => ({
|
|
@@ -52,6 +103,6 @@ function mergeSeries(series, pointsBySeries) {
|
|
|
52
103
|
});
|
|
53
104
|
return [...rows.values()].sort((a, b) => a.at.localeCompare(b.at));
|
|
54
105
|
}
|
|
55
|
-
export { mergeSeries, resolveBreakdown, resolveSeries };
|
|
106
|
+
export { expandServedSeries, mergeSeries, resolveBreakdown, resolveSeries };
|
|
56
107
|
|
|
57
108
|
//# sourceMappingURL=TimeseriesPanel.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeseriesPanel.model.js","names":[],"sources":["../../src/data/TimeseriesPanel.model.ts"],"sourcesContent":["import type { StaticIconComponent } from \"./Icon\";\nimport { latestOf } from \"./TimeseriesPanel.axes\";\n\nexport interface TimeseriesPoint {\n at: string;\n value: number;\n}\n\nexport interface TimeseriesResponse {\n id: string;\n points: TimeseriesPoint[];\n}\n\n/** What a {@link SeriesLoader} receives from the widget polling it. */\nexport interface SeriesLoadContext {\n /** The widget's look-back window, e.g. \"1h\". */\n range: string;\n /** Aborted when the query is cancelled, e.g. the widget unmounts mid-request. */\n signal: AbortSignal;\n}\n\n/**\n * Loads a series directly, instead of the widget requesting `baseUrl + id`\n * through its `fetcher`. Called again whenever the range changes and on every\n * poll.\n */\nexport type SeriesLoader = (ctx: SeriesLoadContext) => Promise<TimeseriesResponse>;\n\n/**\n * One metric plotted on a panel. Its request URL is `baseUrl + id`, unless a\n * `load` function supplies the data.\n */\nexport interface TimeseriesSeries {\n /**\n * Metric id appended to the panel's baseUrl, e.g. \"sqlserver.iops.read\".\n * With `load`, the id is the series' cache identity instead: loaded series\n * are cached under `[\"timeseries\", \"load\", id, range]`, so it must be unique\n * per data source (two series sharing an id share one cached response).\n */\n id: string;\n /** Loads the series' points; when set, `baseUrl` and `fetcher` are not used. */\n load?: SeriesLoader;\n /** Tooltip/legend label; defaults to the id. */\n label?: string;\n /**\n * Maps each point's value before plotting, e.g. writes pass `(v) => -v` to\n * render below the zero axis. Identity when omitted.\n */\n transform?: (value: number) => number;\n /**\n * Stroke/fill override as a CSS color value or a Tailwind color class.\n * Defaults cycle a small palette by index.\n */\n color?: string;\n /**\n * Grafana-style unit key for this series' readout/tooltip. Falls back to the\n * panel-level `unit`.\n */\n unit?: string;\n /**\n * Instantaneous value for the `breakdown` variant. When omitted, the\n * breakdown falls back to the latest polled point.\n */\n current?: number;\n}\n\n/** A horizontal marker line at a fixed value, e.g. a static capacity. */\nexport interface TimeseriesReferenceLine {\n value: number;\n /** Legend label, e.g. \"capacity\". */\n label: string;\n /** CSS color value or Tailwind color class; defaults to the muted foreground. */\n color?: string;\n /** Grafana-style unit key for the legend value; falls back to the panel `unit`. */\n unit?: string;\n}\n\nexport interface TimeseriesPanelProps {\n url?: string;\n baseUrl?: string;\n series?: TimeseriesSeries[];\n title: string;\n icon?: string | StaticIconComponent;\n unit?: string;\n range?: string;\n refreshMs?: number;\n height?: number;\n variant?: \"area\" | \"line\" | \"stacked\" | \"breakdown\";\n expandVariant?: \"area\" | \"line\" | \"stacked\";\n total?: number;\n /** Flat lines drawn across the time-series chart, e.g. a fixed capacity. */\n referenceLines?: TimeseriesReferenceLine[];\n expandable?: boolean;\n fetcher?: (url: string) => Promise<TimeseriesResponse>;\n className?: string;\n}\n\nconst SERIES_PALETTE = [\n \"var(--chart-1, #3b82f6)\",\n \"var(--chart-2, #ef4444)\",\n \"var(--chart-3, #10b981)\",\n \"var(--chart-4, #f59e0b)\",\n] as const;\n\nfunction paletteColor(index: number): string {\n return SERIES_PALETTE[index % SERIES_PALETTE.length] ?? SERIES_PALETTE[0];\n}\n\n/** A series with its full request URL, resolved label, color, and unit. */\nexport interface ResolvedSeries {\n key: string;\n url: string;\n label: string;\n color: string;\n unit?: string;\n transform?: (value: number) => number;\n load?: SeriesLoader;\n current?: number;\n}\n\n/** Normalises the single-url and baseUrl+series forms to one list. */\nexport function resolveSeries(props: TimeseriesPanelProps): ResolvedSeries[] {\n const base = props.baseUrl ?? \"\";\n const list = props.series ?? (props.url ? [{ id: props.url }] : []);\n return list.map((s, i) => ({\n key: s.id,\n url: base + s.id,\n label: s.label ?? s.id,\n color: s.color ?? paletteColor(i),\n ...(s.unit ?? props.unit ? { unit: s.unit ?? props.unit } : {}),\n ...(s.transform ? { transform: s.transform } : {}),\n ...(s.load ? { load: s.load } : {}),\n ...(s.current !== undefined ? { current: s.current } : {}),\n }));\n}\n\n/** One legend/bar row of the breakdown variant. */\nexport interface BreakdownItem {\n key: string;\n label: string;\n color: string;\n unit?: string;\n value: number;\n percent: number;\n}\n\n/**\n * One row of the merged chart data: the timestamp in `at` plus each series'\n * value under its key.\n */\nexport interface MergedRow {\n at: string;\n [seriesKey: string]: string | number | undefined;\n}\n\nexport function resolveBreakdown(\n series: ResolvedSeries[],\n rows: MergedRow[],\n total?: number,\n): { items: BreakdownItem[]; total: number } {\n const withValue = series.map((s) => ({ s, value: s.current ?? latestOf(rows, s.key) ?? 0 }));\n const denom = total ?? withValue.reduce((acc, w) => acc + w.value, 0);\n const items = withValue.map(({ s, value }) => ({\n key: s.key,\n label: s.label,\n color: s.color,\n ...(s.unit ? { unit: s.unit } : {}),\n value,\n percent: denom > 0 ? Math.min(100, Math.max(0, (value / denom) * 100)) : 0,\n }));\n return { items, total: denom };\n}\n\nexport function mergeSeries(\n series: ResolvedSeries[],\n pointsBySeries: (TimeseriesPoint[] | undefined)[],\n): MergedRow[] {\n const rows = new Map<string, MergedRow>();\n series.forEach((s, i) => {\n for (const p of pointsBySeries[i] ?? []) {\n const row = rows.get(p.at) ?? { at: p.at };\n row[s.key] = s.transform ? s.transform(p.value) : p.value;\n rows.set(p.at, row);\n }\n });\n return [...rows.values()].sort((a, b) => a.at.localeCompare(b.at));\n}\n"],"mappings":";;AAiGA,IAAM,iBAAiB;CACrB;CACA;CACA;CACA;AACF;AAEA,SAAS,aAAa,OAAuB;CAC3C,OAAO,eAAe,QAAQ,eAAe,WAAW,eAAe;AACzE;;AAeA,SAAgB,cAAc,OAA+C;CAC3E,MAAM,OAAO,MAAM,WAAW;CAE9B,QADa,MAAM,WAAW,MAAM,MAAM,CAAC,EAAE,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,GAAA,CACrD,KAAK,GAAG,OAAO;EACzB,KAAK,EAAE;EACP,KAAK,OAAO,EAAE;EACd,OAAO,EAAE,SAAS,EAAE;EACpB,OAAO,EAAE,SAAS,aAAa,CAAC;EAChC,GAAI,EAAE,QAAQ,MAAM,OAAO,EAAE,MAAM,EAAE,QAAQ,MAAM,KAAK,IAAI,CAAC;EAC7D,GAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;EAChD,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;EACjC,GAAI,EAAE,YAAY,KAAA,IAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;CAC1D,EAAE;AACJ;AAqBA,SAAgB,iBACd,QACA,MACA,OAC2C;CAC3C,MAAM,YAAY,OAAO,KAAK,OAAO;EAAE;EAAG,OAAO,EAAE,WAAW,SAAS,MAAM,EAAE,GAAG,KAAK;CAAE,EAAE;CAC3F,MAAM,QAAQ,SAAS,UAAU,QAAQ,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;CASpE,OAAO;EAAE,OARK,UAAU,KAAK,EAAE,GAAG,aAAa;GAC7C,KAAK,EAAE;GACP,OAAO,EAAE;GACT,OAAO,EAAE;GACT,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;GACjC;GACA,SAAS,QAAQ,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAI,QAAQ,QAAS,GAAG,CAAC,IAAI;EAC3E,EACS;EAAO,OAAO;CAAM;AAC/B;AAEA,SAAgB,YACd,QACA,gBACa;CACb,MAAM,uBAAO,IAAI,IAAuB;CACxC,OAAO,SAAS,GAAG,MAAM;EACvB,KAAK,MAAM,KAAK,eAAe,MAAM,CAAC,GAAG;GACvC,MAAM,MAAM,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG;GACzC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE;GACpD,KAAK,IAAI,EAAE,IAAI,GAAG;EACpB;CACF,CAAC;CACD,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AACnE"}
|
|
1
|
+
{"version":3,"file":"TimeseriesPanel.model.js","names":[],"sources":["../../src/data/TimeseriesPanel.model.ts"],"sourcesContent":["import type { StaticIconComponent } from \"./Icon\";\nimport { latestOf } from \"./TimeseriesPanel.axes\";\n\nexport interface TimeseriesPoint {\n at: string;\n value: number;\n}\n\nexport interface TimeseriesResponse {\n id: string;\n points: TimeseriesPoint[];\n}\n\n/**\n * One series as the metrics stream serves it. `source` is the id a panel\n * requested; one requested id can expand into several series (a profile\n * grouped by pod, say), each with its own `id` (`<source>#<labels>`) and\n * `labels`. For a plain metric id, `id === source`.\n */\nexport interface TimeseriesServerSeries {\n id: string;\n source: string;\n label?: string;\n labels?: Record<string, string>;\n /** A `formatUnit` key, used when the panel series names no unit. */\n unit?: string;\n points: TimeseriesPoint[];\n}\n\n/** What a {@link SeriesLoader} receives from the widget polling it. */\nexport interface SeriesLoadContext {\n /** The widget's look-back window, e.g. \"1h\". */\n range: string;\n /** Aborted when the query is cancelled, e.g. the widget unmounts mid-request. */\n signal: AbortSignal;\n}\n\n/**\n * Loads a series directly, instead of the widget requesting `baseUrl + id`\n * through its `fetcher`. Called again whenever the range changes and on every\n * poll.\n */\nexport type SeriesLoader = (ctx: SeriesLoadContext) => Promise<TimeseriesResponse>;\n\n/**\n * One metric plotted on a panel. Its request URL is `baseUrl + id`, unless a\n * `load` function supplies the data.\n */\nexport interface TimeseriesSeries {\n /**\n * Metric id appended to the panel's baseUrl, e.g. \"sqlserver.iops.read\".\n * With `load`, the id is the series' cache identity instead: loaded series\n * are cached under `[\"timeseries\", \"load\", id, range]`, so it must be unique\n * per data source (two series sharing an id share one cached response).\n */\n id: string;\n /** Loads the series' points; when set, `baseUrl` and `fetcher` are not used. */\n load?: SeriesLoader;\n /** Tooltip/legend label; defaults to the `labels` values, then the id. */\n label?: string;\n /** The series' label set, e.g. `{ pod: \"api\" }`; its values label the series when `label` is unset. */\n labels?: Record<string, string>;\n /**\n * The requested id this series was expanded from, when one id answers with\n * several series (see {@link TimeseriesServerSeries}). Unset on requested series.\n */\n source?: string;\n /**\n * Maps each point's value before plotting, e.g. writes pass `(v) => -v` to\n * render below the zero axis. Identity when omitted.\n */\n transform?: (value: number) => number;\n /**\n * Stroke/fill override as a CSS color value or a Tailwind color class.\n * Defaults cycle a small palette by index.\n */\n color?: string;\n /**\n * Grafana-style unit key for this series' readout/tooltip. Falls back to the\n * panel-level `unit`.\n */\n unit?: string;\n /**\n * Instantaneous value for the `breakdown` variant. When omitted, the\n * breakdown falls back to the latest polled point.\n */\n current?: number;\n}\n\n/** A horizontal marker line at a fixed value, e.g. a static capacity. */\nexport interface TimeseriesReferenceLine {\n value: number;\n /** Legend label, e.g. \"capacity\". */\n label: string;\n /** CSS color value or Tailwind color class; defaults to the muted foreground. */\n color?: string;\n /** Grafana-style unit key for the legend value; falls back to the panel `unit`. */\n unit?: string;\n}\n\nexport interface TimeseriesPanelProps {\n url?: string;\n baseUrl?: string;\n series?: TimeseriesSeries[];\n title: string;\n icon?: string | StaticIconComponent;\n unit?: string;\n range?: string;\n refreshMs?: number;\n height?: number;\n variant?: \"area\" | \"line\" | \"stacked\" | \"breakdown\";\n expandVariant?: \"area\" | \"line\" | \"stacked\";\n total?: number;\n /** Flat lines drawn across the time-series chart, e.g. a fixed capacity. */\n referenceLines?: TimeseriesReferenceLine[];\n expandable?: boolean;\n fetcher?: (url: string) => Promise<TimeseriesResponse>;\n className?: string;\n}\n\nconst SERIES_PALETTE = [\n \"var(--chart-1, #3b82f6)\",\n \"var(--chart-2, #ef4444)\",\n \"var(--chart-3, #10b981)\",\n \"var(--chart-4, #f59e0b)\",\n] as const;\n\nfunction paletteColor(index: number): string {\n return SERIES_PALETTE[index % SERIES_PALETTE.length] ?? SERIES_PALETTE[0];\n}\n\n/** A series with its full request URL, resolved label, color, and unit. */\nexport interface ResolvedSeries {\n key: string;\n url: string;\n label: string;\n color: string;\n unit?: string;\n transform?: (value: number) => number;\n load?: SeriesLoader;\n current?: number;\n labels?: Record<string, string>;\n /** The requested id an expanded series came from; unset on requested series. */\n source?: string;\n}\n\n/** The label-set values in key order, e.g. `{ pod: \"api\", ns: \"x\" }` → \"x, api\". */\nfunction labelValues(labels: Record<string, string> | undefined): string | undefined {\n if (!labels) return undefined;\n const values = Object.keys(labels)\n .sort()\n .map((key) => labels[key]);\n return values.length > 0 ? values.join(\", \") : undefined;\n}\n\nfunction requestedSeries(props: TimeseriesPanelProps): TimeseriesSeries[] {\n return props.series ?? (props.url ? [{ id: props.url }] : []);\n}\n\nfunction resolveEntry(\n s: TimeseriesSeries,\n index: number,\n props: TimeseriesPanelProps,\n servedUnit?: string,\n): ResolvedSeries {\n const unit = s.unit ?? servedUnit ?? props.unit;\n return {\n key: s.id,\n url: (props.baseUrl ?? \"\") + s.id,\n label: s.label ?? labelValues(s.labels) ?? s.id,\n color: s.color ?? paletteColor(index),\n ...(unit ? { unit } : {}),\n ...(s.transform ? { transform: s.transform } : {}),\n ...(s.load ? { load: s.load } : {}),\n ...(s.current !== undefined ? { current: s.current } : {}),\n ...(s.labels ? { labels: s.labels } : {}),\n ...(s.source ? { source: s.source } : {}),\n };\n}\n\n/** Normalises the single-url and baseUrl+series forms to one list. */\nexport function resolveSeries(props: TimeseriesPanelProps): ResolvedSeries[] {\n return requestedSeries(props).map((s, i) => resolveEntry(s, i, props));\n}\n\n/** The series a panel plots, index-aligned with each one's points (undefined while loading). */\nexport interface DisplaySeries {\n series: ResolvedSeries[];\n points: (TimeseriesPoint[] | undefined)[];\n}\n\n/**\n * Resolves what a panel plots from what its requested series were answered\n * with (`served`, index-aligned with the requested series; undefined while a\n * series is loading). A requested id answered by its own series alone keeps\n * the panel's label, color and `current`; an id that expanded into several\n * series plots each one, labelled by its `label` or label values. A series\n * without a unit of its own takes the served unit, then the panel `unit`.\n */\nexport function expandServedSeries(\n props: TimeseriesPanelProps,\n served: readonly (readonly TimeseriesServerSeries[] | undefined)[],\n): DisplaySeries {\n const series: ResolvedSeries[] = [];\n const points: (TimeseriesPoint[] | undefined)[] = [];\n requestedSeries(props).forEach((requested, i) => {\n const answer = served[i];\n const [first] = answer ?? [];\n if (!answer || !first || (answer.length === 1 && first.id === requested.id)) {\n series.push(resolveEntry(requested, series.length, props, first?.unit));\n points.push(answer ? (first?.points ?? []) : undefined);\n return;\n }\n for (const s of answer) {\n const expanded: TimeseriesSeries = {\n id: s.id,\n source: requested.id,\n ...(s.label ? { label: s.label } : {}),\n ...(s.labels ? { labels: s.labels } : {}),\n ...(requested.unit ? { unit: requested.unit } : {}),\n ...(requested.transform ? { transform: requested.transform } : {}),\n };\n series.push(resolveEntry(expanded, series.length, props, s.unit));\n points.push(s.points);\n }\n });\n return { series, points };\n}\n\n/** One legend/bar row of the breakdown variant. */\nexport interface BreakdownItem {\n key: string;\n label: string;\n color: string;\n unit?: string;\n value: number;\n percent: number;\n}\n\n/**\n * One row of the merged chart data: the timestamp in `at` plus each series'\n * value under its key.\n */\nexport interface MergedRow {\n at: string;\n [seriesKey: string]: string | number | undefined;\n}\n\nexport function resolveBreakdown(\n series: ResolvedSeries[],\n rows: MergedRow[],\n total?: number,\n): { items: BreakdownItem[]; total: number } {\n const withValue = series.map((s) => ({ s, value: s.current ?? latestOf(rows, s.key) ?? 0 }));\n const denom = total ?? withValue.reduce((acc, w) => acc + w.value, 0);\n const items = withValue.map(({ s, value }) => ({\n key: s.key,\n label: s.label,\n color: s.color,\n ...(s.unit ? { unit: s.unit } : {}),\n value,\n percent: denom > 0 ? Math.min(100, Math.max(0, (value / denom) * 100)) : 0,\n }));\n return { items, total: denom };\n}\n\nexport function mergeSeries(\n series: ResolvedSeries[],\n pointsBySeries: (TimeseriesPoint[] | undefined)[],\n): MergedRow[] {\n const rows = new Map<string, MergedRow>();\n series.forEach((s, i) => {\n for (const p of pointsBySeries[i] ?? []) {\n const row = rows.get(p.at) ?? { at: p.at };\n row[s.key] = s.transform ? s.transform(p.value) : p.value;\n rows.set(p.at, row);\n }\n });\n return [...rows.values()].sort((a, b) => a.at.localeCompare(b.at));\n}\n"],"mappings":"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"}
|
|
@@ -161,7 +161,11 @@ function headerMetaItems(workload, typeLabel) {
|
|
|
161
161
|
items.push({
|
|
162
162
|
key: `meta-${i}`,
|
|
163
163
|
content: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
164
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
164
|
+
item.icon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WorkloadIcon, {
|
|
165
|
+
icon: item.icon,
|
|
166
|
+
title: item.label,
|
|
167
|
+
className: "h-3.5 w-auto shrink-0"
|
|
168
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
165
169
|
className: "text-muted-foreground/70",
|
|
166
170
|
children: item.label
|
|
167
171
|
}),
|
|
@@ -185,7 +189,7 @@ function headerMetaItems(workload, typeLabel) {
|
|
|
185
189
|
* Like the timeseries widgets it renders, it needs a react-query
|
|
186
190
|
* `QueryClientProvider` above it.
|
|
187
191
|
*/
|
|
188
|
-
function WorkloadCard({ workload, metrics, baseUrl, range = "1h", refreshMs = 5e3, expandable = true, headerActions, size = "md", variant = "default", fetcher, className }) {
|
|
192
|
+
function WorkloadCard({ children, workload, metrics, baseUrl, range = "1h", refreshMs = 5e3, expandable = true, headerActions, size = "md", variant = "default", fetcher, className }) {
|
|
189
193
|
const [expanded, setExpanded] = (0, react.useState)(false);
|
|
190
194
|
const typeLabel = require_WorkloadCard_model.workloadTypeLabel(workload);
|
|
191
195
|
const statusLabel = require_WorkloadCard_model.workloadStatusLabel(workload.status);
|
|
@@ -280,7 +284,7 @@ function WorkloadCard({ workload, metrics, baseUrl, range = "1h", refreshMs = 5e
|
|
|
280
284
|
]
|
|
281
285
|
})]
|
|
282
286
|
}),
|
|
283
|
-
hasMetric(metrics) ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
287
|
+
children !== void 0 ? children : hasMetric(metrics) ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
284
288
|
className: require_utils.cn("grid items-start gap-3", sizeClasses.metricVariant === "cell" ? sizeClasses.metricGrid : require_utils.cn(metricGridClass(panelMetrics.length), sizeClasses.metricGrid)),
|
|
285
289
|
children: [
|
|
286
290
|
metrics.cpu ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TimeseriesCoreBars.TimeseriesCoreBars, {
|