@flanksource/clicky-ui 0.3.55 → 0.3.57
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/ErrorWrapper.cjs +15 -4
- package/dist/components/ErrorWrapper.cjs.map +1 -1
- package/dist/components/ErrorWrapper.d.ts +7 -0
- package/dist/components/ErrorWrapper.d.ts.map +1 -1
- package/dist/components/ErrorWrapper.js +15 -4
- package/dist/components/ErrorWrapper.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/PromptCatalog/PromptLayerStrip.cjs +6 -3
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.js +6 -3
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.cjs +2 -1
- package/dist/data/ai/PromptCatalog/PromptPage.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.js +2 -1
- package/dist/data/ai/PromptCatalog/PromptPage.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs +9 -6
- package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.js +9 -6
- package/dist/data/ai/PromptCatalog/PromptPageHeader.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs +3 -3
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts +2 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js +3 -3
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.cjs +4 -3
- package/dist/data/ai/PromptCatalog/prompt-page-model.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.js +4 -3
- package/dist/data/ai/PromptCatalog/prompt-page-model.js.map +1 -1
- package/dist/data/ai/PromptCatalog/types.d.ts +1 -0
- package/dist/data/ai/PromptCatalog/types.d.ts.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 +19 -29
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +4 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +19 -29
- 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/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 +8 -1
- package/dist/data/traces/index.d.ts.map +1 -1
- package/dist/data/traces/otel/OperationList.cjs +64 -0
- package/dist/data/traces/otel/OperationList.cjs.map +1 -0
- package/dist/data/traces/otel/OperationList.d.ts +10 -0
- package/dist/data/traces/otel/OperationList.d.ts.map +1 -0
- package/dist/data/traces/otel/OperationList.js +64 -0
- package/dist/data/traces/otel/OperationList.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.cjs +781 -0
- package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.d.ts +7 -0
- package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.js +781 -0
- package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.cjs +145 -0
- package/dist/data/traces/otel/OtelTraceSearch.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.d.ts +16 -0
- package/dist/data/traces/otel/OtelTraceSearch.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.js +145 -0
- package/dist/data/traces/otel/OtelTraceSearch.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.cjs +47 -0
- package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.d.ts +12 -0
- package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.js +47 -0
- package/dist/data/traces/otel/OtelTraceTable.js.map +1 -0
- package/dist/data/traces/otel/QueryBar.cjs +158 -0
- package/dist/data/traces/otel/QueryBar.cjs.map +1 -0
- package/dist/data/traces/otel/QueryBar.d.ts +12 -0
- package/dist/data/traces/otel/QueryBar.d.ts.map +1 -0
- package/dist/data/traces/otel/QueryBar.js +158 -0
- package/dist/data/traces/otel/QueryBar.js.map +1 -0
- package/dist/data/traces/otel/SpanCards.cjs +264 -0
- package/dist/data/traces/otel/SpanCards.cjs.map +1 -0
- package/dist/data/traces/otel/SpanCards.d.ts +17 -0
- package/dist/data/traces/otel/SpanCards.d.ts.map +1 -0
- package/dist/data/traces/otel/SpanCards.js +261 -0
- package/dist/data/traces/otel/SpanCards.js.map +1 -0
- package/dist/data/traces/otel/SpanCategory.cjs +18 -0
- package/dist/data/traces/otel/SpanCategory.cjs.map +1 -0
- package/dist/data/traces/otel/SpanCategory.d.ts +7 -0
- package/dist/data/traces/otel/SpanCategory.d.ts.map +1 -0
- package/dist/data/traces/otel/SpanCategory.js +18 -0
- package/dist/data/traces/otel/SpanCategory.js.map +1 -0
- package/dist/data/traces/otel/TraceResults.cjs +195 -0
- package/dist/data/traces/otel/TraceResults.cjs.map +1 -0
- package/dist/data/traces/otel/TraceResults.d.ts +19 -0
- package/dist/data/traces/otel/TraceResults.d.ts.map +1 -0
- package/dist/data/traces/otel/TraceResults.js +193 -0
- package/dist/data/traces/otel/TraceResults.js.map +1 -0
- package/dist/data/traces/otel/api.cjs +36 -0
- package/dist/data/traces/otel/api.cjs.map +1 -0
- package/dist/data/traces/otel/api.d.ts +87 -0
- package/dist/data/traces/otel/api.d.ts.map +1 -0
- package/dist/data/traces/otel/api.js +33 -0
- package/dist/data/traces/otel/api.js.map +1 -0
- package/dist/data/traces/otel/fixtures.d.ts +4 -0
- package/dist/data/traces/otel/fixtures.d.ts.map +1 -0
- package/dist/data/traces/otel/metrics.cjs +7 -0
- package/dist/data/traces/otel/metrics.cjs.map +1 -0
- package/dist/data/traces/otel/metrics.d.ts +2 -0
- package/dist/data/traces/otel/metrics.d.ts.map +1 -0
- package/dist/data/traces/otel/metrics.js +7 -0
- package/dist/data/traces/otel/metrics.js.map +1 -0
- package/dist/data/traces/otel/model.cjs +167 -0
- package/dist/data/traces/otel/model.cjs.map +1 -0
- package/dist/data/traces/otel/model.d.ts +81 -0
- package/dist/data/traces/otel/model.d.ts.map +1 -0
- package/dist/data/traces/otel/model.js +154 -0
- package/dist/data/traces/otel/model.js.map +1 -0
- package/dist/data/traces/otel/query.cjs +90 -0
- package/dist/data/traces/otel/query.cjs.map +1 -0
- package/dist/data/traces/otel/query.d.ts +20 -0
- package/dist/data/traces/otel/query.d.ts.map +1 -0
- package/dist/data/traces/otel/query.js +86 -0
- package/dist/data/traces/otel/query.js.map +1 -0
- package/dist/data/traces/otel/result-model.cjs +25 -0
- package/dist/data/traces/otel/result-model.cjs.map +1 -0
- package/dist/data/traces/otel/result-model.d.ts +5 -0
- package/dist/data/traces/otel/result-model.d.ts.map +1 -0
- package/dist/data/traces/otel/result-model.js +24 -0
- package/dist/data/traces/otel/result-model.js.map +1 -0
- package/dist/data/traces/otel/source.cjs +11 -0
- package/dist/data/traces/otel/source.cjs.map +1 -0
- package/dist/data/traces/otel/source.d.ts +5 -0
- package/dist/data/traces/otel/source.d.ts.map +1 -0
- package/dist/data/traces/otel/source.js +10 -0
- package/dist/data/traces/otel/source.js.map +1 -0
- package/dist/data/traces/otel/span-traces.cjs +39 -0
- package/dist/data/traces/otel/span-traces.cjs.map +1 -0
- package/dist/data/traces/otel/span-traces.d.ts +3 -0
- package/dist/data/traces/otel/span-traces.d.ts.map +1 -0
- package/dist/data/traces/otel/span-traces.js +39 -0
- package/dist/data/traces/otel/span-traces.js.map +1 -0
- 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 +68 -6
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +32 -10
- 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 +86 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -12
- 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 +6 -2
- package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
- package/dist/profiles/editor/profileEditorSections.d.ts.map +1 -1
- package/dist/profiles/editor/profileEditorSections.js +6 -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":"Modal.js","names":[],"sources":["../../src/overlay/Modal.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { Button } from \"../components/button\";\nimport {\n UiArrowLeft,\n UiClose,\n UiFullscreen,\n UiFullscreenFilled,\n} from \"../icons\";\nimport { mediaMatches } from \"../hooks/use-media-query\";\nimport { useEscapeLayer, useModalStack } from \"./modalStack\";\nimport { zIndex } from \"./zIndex\";\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n\n/** Copy for the discard-confirmation prompt shown before a guarded close. */\nexport type ConfirmCloseOptions = {\n /** Heading of the confirmation prompt. */\n title?: ReactNode;\n /** Body explaining what is lost on close. */\n message?: ReactNode;\n /** Label of the button that proceeds with closing. */\n confirmLabel?: string;\n /** Label of the button that dismisses the prompt and keeps the modal open. */\n cancelLabel?: string;\n};\n\nexport type ModalProps = {\n /** Controls whether the modal is mounted. */\n open: boolean;\n /** Called when the modal requests to close. */\n onClose: () => void;\n /**\n * Guard every close path (close button, Escape, backdrop) behind a discard\n * confirmation. `true` uses the default copy; pass options to customise it.\n * `onClose` only fires once the user confirms. Set this while the modal holds\n * unsaved edits and clear it (or pass `false`) once there is nothing to lose.\n */\n confirmClose?: boolean | ConfirmCloseOptions;\n /** Header title and accessible dialog label when it is a string. */\n title?: ReactNode;\n /**\n * Secondary header content rendered on its own row directly beneath the title.\n * The title stays a single row alongside the expand/close buttons, so a tall\n * subtitle (e.g. a tab switcher) never pushes those buttons down.\n */\n subtitle?: ReactNode;\n /** Width/height preset for the dialog. */\n size?: ModalSize;\n /** Close when the backdrop is clicked. Off by default; close via Escape or the close button. */\n closeOnBackdrop?: boolean;\n /** Close when Escape is pressed. */\n closeOnEsc?: boolean;\n /** Hide the close button. */\n hideClose?: boolean;\n /** Show an expand/restore button. */\n expandable?: boolean;\n /** Classes applied to the dialog panel. */\n className?: string;\n /** Extra header content rendered before the expand/close buttons. */\n headerSlot?: ReactNode;\n /** Footer content pinned below the scrollable body. */\n footer?: ReactNode;\n /**\n * Whether the body scrolls its overflow. Default `true`. Set `false` when the\n * body owns a single fill-height child that scrolls internally (e.g. a\n * DataTable with a sticky header): the body becomes a non-scrolling flex\n * column, so only that child's own scroll region moves.\n */\n scrollBody?: boolean;\n /** Modal body content. */\n children: ReactNode;\n};\n\nconst sizeClass: Record<ModalSize, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n \"2xl\": \"max-w-6xl\",\n full: \"max-w-[95vw]\",\n};\n\nconst DEFAULT_CONFIRM: Required<ConfirmCloseOptions> = {\n title: \"Discard changes?\",\n message: \"You have unsaved changes. Closing now will discard them.\",\n confirmLabel: \"Discard\",\n cancelLabel: \"Keep editing\",\n};\n\nconst MOBILE_QUERY = \"(max-width: 639px)\";\nconst REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst MOBILE_TRANSITION_MS = 200;\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nfunction visibleFocusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((element) => {\n const style = window.getComputedStyle(element);\n return (\n !element.hidden &&\n style.display !== \"none\" &&\n style.visibility !== \"hidden\"\n );\n });\n}\n\nexport function Modal({\n open,\n onClose,\n confirmClose = false,\n title,\n subtitle,\n size = \"md\",\n closeOnBackdrop = false,\n closeOnEsc = true,\n hideClose = false,\n expandable = true,\n className,\n headerSlot,\n footer,\n scrollBody = true,\n children,\n}: ModalProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const closeTimerRef = useRef<number | undefined>(undefined);\n const openFrameRef = useRef<number | undefined>(undefined);\n const [present, setPresent] = useState(open);\n const [mobileVisible, setMobileVisible] = useState(false);\n const { depth } = useModalStack(present);\n const [expanded, setExpanded] = useState(false);\n // When confirmClose is active, a close request opens this prompt instead of\n // closing outright; onClose only fires once the user confirms the discard.\n const [confirming, setConfirming] = useState(false);\n\n // requestClose is the single entry point for every close affordance. With the\n // guard on, it surfaces the confirmation; otherwise it closes immediately.\n const requestClose = () => {\n if (confirmClose) setConfirming(true);\n else onClose();\n };\n\n useEffect(() => {\n window.clearTimeout(closeTimerRef.current);\n window.cancelAnimationFrame(openFrameRef.current ?? 0);\n // Both false where the environment cannot be asked, which lands on the\n // desktop path: mount and unmount immediately, no deferred unmount to wait\n // on. That is the right answer under SSR and in a consumer's jsdom suite.\n const animateMobile =\n mediaMatches(MOBILE_QUERY) && !mediaMatches(REDUCED_MOTION_QUERY);\n\n if (open) {\n setPresent(true);\n if (animateMobile) {\n setMobileVisible(false);\n openFrameRef.current = window.requestAnimationFrame(() => {\n setMobileVisible(true);\n });\n } else {\n setMobileVisible(true);\n }\n } else if (animateMobile) {\n setMobileVisible(false);\n closeTimerRef.current = window.setTimeout(\n () => setPresent(false),\n MOBILE_TRANSITION_MS,\n );\n } else {\n setMobileVisible(false);\n setPresent(false);\n }\n\n return () => {\n window.clearTimeout(closeTimerRef.current);\n window.cancelAnimationFrame(openFrameRef.current ?? 0);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n setExpanded(false);\n setConfirming(false);\n }\n }, [open]);\n\n // A close guard that disappears mid-prompt (changes saved/reverted) should\n // not leave a stale confirmation dialog up.\n useEffect(() => {\n if (!confirmClose) setConfirming(false);\n }, [confirmClose]);\n\n useEscapeLayer(present, () => {\n if (!open || !closeOnEsc) return;\n // While the prompt is up, Escape dismisses the prompt rather than the modal.\n if (confirming) setConfirming(false);\n else requestClose();\n });\n\n useEffect(() => {\n if (!open) return;\n const prev = document.activeElement as HTMLElement | null;\n dialogRef.current?.focus();\n return () => prev?.focus?.();\n }, [open]);\n\n if (!present) return null;\n\n const overlay = (\n <div\n className={cn(\n \"fixed inset-0 flex items-center justify-center p-density-2 sm:p-density-4 max-sm:items-stretch max-sm:justify-end max-sm:p-0 max-sm:!bg-transparent\",\n // Nested modals dim less so the dialog they opened over stays visible.\n depth === 0 ? \"bg-black/40\" : \"bg-black/20\",\n )}\n // Sits in the modal band of the centralized z-index scale; +depth keeps\n // nested modals above their parent. Floating content (dropdowns, tooltips)\n // computes its z relative to this via useFloatingZIndex so it clears the\n // modal instead of rendering behind it.\n style={{ zIndex: zIndex.modal + depth * zIndex.modalStep }}\n onClick={closeOnBackdrop ? requestClose : undefined}\n role=\"presentation\"\n >\n <div\n ref={dialogRef}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === \"string\" ? title : undefined}\n data-state={mobileVisible ? \"open\" : \"closed\"}\n className={cn(\n \"relative flex w-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl\",\n \"max-sm:!h-dvh max-sm:!max-h-dvh max-sm:!max-w-none max-sm:!rounded-none max-sm:!border-0 max-sm:shadow-none\",\n \"max-sm:transition-transform max-sm:duration-200 max-sm:ease-out max-sm:motion-reduce:transition-none\",\n \"max-sm:data-[state=closed]:translate-x-full max-sm:data-[state=open]:translate-x-0\",\n expanded ? sizeClass.full : sizeClass[size],\n className,\n )}\n // Inline maxHeight (not an arbitrary Tailwind class) so the panel stays\n // viewport-bounded even when a consumer's Tailwind build can't generate\n // the dvh utility — e.g. www aliases clicky-ui to source but scans the\n // published dist. When expanded, fill the viewport.\n style={{\n maxHeight: \"calc(100dvh - 2rem)\",\n ...(expanded ? { height: \"calc(100dvh - 2rem)\" } : {}),\n }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(event) => {\n if (event.key !== \"Tab\") return;\n const scope = confirming\n ? dialogRef.current?.querySelector<HTMLElement>(\n \"[role='alertdialog']\",\n )\n : dialogRef.current;\n if (!scope) return;\n const focusable = visibleFocusableElements(scope);\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) {\n event.preventDefault();\n scope.focus();\n } else if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }}\n >\n {(title || subtitle || headerSlot || expandable || !hideClose) && (\n <div className=\"shrink-0 px-density-4 py-density-3 border-b border-border max-sm:min-h-14 max-sm:bg-background\">\n <div className=\"flex items-center gap-density-2\">\n {!hideClose && (\n <Button\n type=\"button\"\n onClick={requestClose}\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Back\"\n className=\"-ml-2 text-foreground sm:hidden\"\n >\n <Icon icon={UiArrowLeft} />\n </Button>\n )}\n {title ? (\n <h2 className=\"text-sm font-semibold flex-1 max-sm:text-base max-sm:leading-6\">\n {title}\n </h2>\n ) : (\n <span className=\"flex-1\" />\n )}\n {headerSlot}\n {expandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={\n expanded ? \"Restore size\" : \"Expand to fullscreen\"\n }\n className=\"text-muted-foreground hover:text-foreground max-sm:hidden\"\n >\n <Icon icon={expanded ? UiFullscreenFilled : UiFullscreen} />\n </button>\n )}\n {!hideClose && (\n <button\n type=\"button\"\n onClick={requestClose}\n aria-label=\"Close\"\n className=\"text-muted-foreground hover:text-foreground max-sm:hidden\"\n >\n <Icon icon={UiClose} />\n </button>\n )}\n </div>\n {subtitle ? <div className=\"mt-density-2\">{subtitle}</div> : null}\n </div>\n )}\n <div\n data-slot=\"modal-body\"\n className={cn(\n \"min-h-0 flex-1 px-density-4 py-density-3 max-sm:py-density-4\",\n scrollBody ? \"overflow-auto\" : \"flex flex-col overflow-hidden\",\n )}\n >\n {children}\n </div>\n {footer && (\n <div\n data-slot=\"modal-footer\"\n className=\"shrink-0 px-density-4 py-density-3 border-t border-border max-sm:py-density-4\"\n >\n {footer}\n </div>\n )}\n {confirming && (\n <ConfirmClosePrompt\n options={\n confirmClose === true\n ? DEFAULT_CONFIRM\n : { ...DEFAULT_CONFIRM, ...confirmClose }\n }\n onConfirm={() => {\n setConfirming(false);\n onClose();\n }}\n onCancel={() => setConfirming(false)}\n />\n )}\n </div>\n </div>\n );\n\n // Render into document.body so the fixed-position overlay escapes any ancestor\n // transform/overflow (e.g. a dropdown menu positioned via a CSS transform),\n // which would otherwise trap position:fixed inside that ancestor's box and clip\n // the modal to it.\n return typeof document !== \"undefined\"\n ? createPortal(overlay, document.body)\n : null;\n}\n\nfunction ConfirmClosePrompt({\n options,\n onConfirm,\n onCancel,\n}: {\n options: Required<ConfirmCloseOptions>;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n return (\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center rounded-lg bg-background/80 p-density-4 max-sm:rounded-none\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label={\n typeof options.title === \"string\" ? options.title : \"Confirm close\"\n }\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"w-full max-w-sm rounded-lg border border-border bg-background p-density-4 shadow-xl\">\n <h3 className=\"text-sm font-semibold\">{options.title}</h3>\n <p className=\"mt-density-2 text-sm text-muted-foreground\">\n {options.message}\n </p>\n <div className=\"mt-density-4 flex justify-end gap-density-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {options.cancelLabel}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={onConfirm}>\n {options.confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Modal.js","names":[],"sources":["../../src/overlay/Modal.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { Button } from \"../components/button\";\nimport {\n UiArrowLeft,\n UiClose,\n UiFullscreen,\n UiFullscreenFilled,\n} from \"../icons\";\nimport { mediaMatches } from \"../hooks/use-media-query\";\nimport { belowBreakpoint } from \"../lib/breakpoints\";\nimport { useEscapeLayer, useModalStack } from \"./modalStack\";\nimport { zIndex } from \"./zIndex\";\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n\n/** Copy for the discard-confirmation prompt shown before a guarded close. */\nexport type ConfirmCloseOptions = {\n /** Heading of the confirmation prompt. */\n title?: ReactNode;\n /** Body explaining what is lost on close. */\n message?: ReactNode;\n /** Label of the button that proceeds with closing. */\n confirmLabel?: string;\n /** Label of the button that dismisses the prompt and keeps the modal open. */\n cancelLabel?: string;\n};\n\nexport type ModalProps = {\n /** Controls whether the modal is mounted. */\n open: boolean;\n /** Called when the modal requests to close. */\n onClose: () => void;\n /**\n * Guard every close path (close button, Escape, backdrop) behind a discard\n * confirmation. `true` uses the default copy; pass options to customise it.\n * `onClose` only fires once the user confirms. Set this while the modal holds\n * unsaved edits and clear it (or pass `false`) once there is nothing to lose.\n */\n confirmClose?: boolean | ConfirmCloseOptions;\n /** Header title and accessible dialog label when it is a string. */\n title?: ReactNode;\n /**\n * Secondary header content rendered on its own row directly beneath the title.\n * The title stays a single row alongside the expand/close buttons, so a tall\n * subtitle (e.g. a tab switcher) never pushes those buttons down.\n */\n subtitle?: ReactNode;\n /** Width/height preset for the dialog. */\n size?: ModalSize;\n /** Close when the backdrop is clicked. Off by default; close via Escape or the close button. */\n closeOnBackdrop?: boolean;\n /** Close when Escape is pressed. */\n closeOnEsc?: boolean;\n /** Hide the close button. */\n hideClose?: boolean;\n /** Show an expand/restore button. */\n expandable?: boolean;\n /** Classes applied to the dialog panel. */\n className?: string;\n /** Extra header content rendered before the expand/close buttons. */\n headerSlot?: ReactNode;\n /** Footer content pinned below the scrollable body. */\n footer?: ReactNode;\n /**\n * Whether the body scrolls its overflow. Default `true`. Set `false` when the\n * body owns a single fill-height child that scrolls internally (e.g. a\n * DataTable with a sticky header): the body becomes a non-scrolling flex\n * column, so only that child's own scroll region moves.\n */\n scrollBody?: boolean;\n /** Modal body content. */\n children: ReactNode;\n};\n\nconst sizeClass: Record<ModalSize, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n \"2xl\": \"max-w-6xl\",\n full: \"max-w-[95vw]\",\n};\n\nconst DEFAULT_CONFIRM: Required<ConfirmCloseOptions> = {\n title: \"Discard changes?\",\n message: \"You have unsaved changes. Closing now will discard them.\",\n confirmLabel: \"Discard\",\n cancelLabel: \"Keep editing\",\n};\n\nconst MOBILE_QUERY = belowBreakpoint(\"sm\");\nconst REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst MOBILE_TRANSITION_MS = 200;\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nfunction visibleFocusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((element) => {\n const style = window.getComputedStyle(element);\n return (\n !element.hidden &&\n style.display !== \"none\" &&\n style.visibility !== \"hidden\"\n );\n });\n}\n\nexport function Modal({\n open,\n onClose,\n confirmClose = false,\n title,\n subtitle,\n size = \"md\",\n closeOnBackdrop = false,\n closeOnEsc = true,\n hideClose = false,\n expandable = true,\n className,\n headerSlot,\n footer,\n scrollBody = true,\n children,\n}: ModalProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const closeTimerRef = useRef<number | undefined>(undefined);\n const openFrameRef = useRef<number | undefined>(undefined);\n const [present, setPresent] = useState(open);\n const [mobileVisible, setMobileVisible] = useState(false);\n const { depth } = useModalStack(present);\n const [expanded, setExpanded] = useState(false);\n // When confirmClose is active, a close request opens this prompt instead of\n // closing outright; onClose only fires once the user confirms the discard.\n const [confirming, setConfirming] = useState(false);\n\n // requestClose is the single entry point for every close affordance. With the\n // guard on, it surfaces the confirmation; otherwise it closes immediately.\n const requestClose = () => {\n if (confirmClose) setConfirming(true);\n else onClose();\n };\n\n useEffect(() => {\n window.clearTimeout(closeTimerRef.current);\n window.cancelAnimationFrame(openFrameRef.current ?? 0);\n // Both false where the environment cannot be asked, which lands on the\n // desktop path: mount and unmount immediately, no deferred unmount to wait\n // on. That is the right answer under SSR and in a consumer's jsdom suite.\n const animateMobile =\n mediaMatches(MOBILE_QUERY) && !mediaMatches(REDUCED_MOTION_QUERY);\n\n if (open) {\n setPresent(true);\n if (animateMobile) {\n setMobileVisible(false);\n openFrameRef.current = window.requestAnimationFrame(() => {\n setMobileVisible(true);\n });\n } else {\n setMobileVisible(true);\n }\n } else if (animateMobile) {\n setMobileVisible(false);\n closeTimerRef.current = window.setTimeout(\n () => setPresent(false),\n MOBILE_TRANSITION_MS,\n );\n } else {\n setMobileVisible(false);\n setPresent(false);\n }\n\n return () => {\n window.clearTimeout(closeTimerRef.current);\n window.cancelAnimationFrame(openFrameRef.current ?? 0);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n setExpanded(false);\n setConfirming(false);\n }\n }, [open]);\n\n // A close guard that disappears mid-prompt (changes saved/reverted) should\n // not leave a stale confirmation dialog up.\n useEffect(() => {\n if (!confirmClose) setConfirming(false);\n }, [confirmClose]);\n\n useEscapeLayer(present, () => {\n if (!open || !closeOnEsc) return;\n // While the prompt is up, Escape dismisses the prompt rather than the modal.\n if (confirming) setConfirming(false);\n else requestClose();\n });\n\n useEffect(() => {\n if (!open) return;\n const prev = document.activeElement as HTMLElement | null;\n dialogRef.current?.focus();\n return () => prev?.focus?.();\n }, [open]);\n\n if (!present) return null;\n\n const overlay = (\n <div\n className={cn(\n \"fixed inset-0 flex items-center justify-center p-density-2 sm:p-density-4 max-sm:items-stretch max-sm:justify-end max-sm:p-0 max-sm:!bg-transparent\",\n // Nested modals dim less so the dialog they opened over stays visible.\n depth === 0 ? \"bg-black/40\" : \"bg-black/20\",\n )}\n // Sits in the modal band of the centralized z-index scale; +depth keeps\n // nested modals above their parent. Floating content (dropdowns, tooltips)\n // computes its z relative to this via useFloatingZIndex so it clears the\n // modal instead of rendering behind it.\n style={{ zIndex: zIndex.modal + depth * zIndex.modalStep }}\n onClick={closeOnBackdrop ? requestClose : undefined}\n role=\"presentation\"\n >\n <div\n ref={dialogRef}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === \"string\" ? title : undefined}\n data-state={mobileVisible ? \"open\" : \"closed\"}\n className={cn(\n \"relative flex w-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl\",\n \"max-sm:!h-dvh max-sm:!max-h-dvh max-sm:!max-w-none max-sm:!rounded-none max-sm:!border-0 max-sm:shadow-none\",\n \"max-sm:transition-transform max-sm:duration-200 max-sm:ease-out max-sm:motion-reduce:transition-none\",\n \"max-sm:data-[state=closed]:translate-x-full max-sm:data-[state=open]:translate-x-0\",\n expanded ? sizeClass.full : sizeClass[size],\n className,\n )}\n // Inline maxHeight (not an arbitrary Tailwind class) so the panel stays\n // viewport-bounded even when a consumer's Tailwind build can't generate\n // the dvh utility — e.g. www aliases clicky-ui to source but scans the\n // published dist. When expanded, fill the viewport.\n style={{\n maxHeight: \"calc(100dvh - 2rem)\",\n ...(expanded ? { height: \"calc(100dvh - 2rem)\" } : {}),\n }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(event) => {\n if (event.key !== \"Tab\") return;\n const scope = confirming\n ? dialogRef.current?.querySelector<HTMLElement>(\n \"[role='alertdialog']\",\n )\n : dialogRef.current;\n if (!scope) return;\n const focusable = visibleFocusableElements(scope);\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) {\n event.preventDefault();\n scope.focus();\n } else if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }}\n >\n {(title || subtitle || headerSlot || expandable || !hideClose) && (\n <div className=\"shrink-0 px-density-4 py-density-3 border-b border-border max-sm:min-h-14 max-sm:bg-background\">\n <div className=\"flex items-center gap-density-2\">\n {!hideClose && (\n <Button\n type=\"button\"\n onClick={requestClose}\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Back\"\n className=\"-ml-2 text-foreground sm:hidden\"\n >\n <Icon icon={UiArrowLeft} />\n </Button>\n )}\n {title ? (\n <h2 className=\"text-sm font-semibold flex-1 max-sm:text-base max-sm:leading-6\">\n {title}\n </h2>\n ) : (\n <span className=\"flex-1\" />\n )}\n {headerSlot}\n {expandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={\n expanded ? \"Restore size\" : \"Expand to fullscreen\"\n }\n className=\"text-muted-foreground hover:text-foreground max-sm:hidden\"\n >\n <Icon icon={expanded ? UiFullscreenFilled : UiFullscreen} />\n </button>\n )}\n {!hideClose && (\n <button\n type=\"button\"\n onClick={requestClose}\n aria-label=\"Close\"\n className=\"text-muted-foreground hover:text-foreground max-sm:hidden\"\n >\n <Icon icon={UiClose} />\n </button>\n )}\n </div>\n {subtitle ? <div className=\"mt-density-2\">{subtitle}</div> : null}\n </div>\n )}\n <div\n data-slot=\"modal-body\"\n className={cn(\n \"min-h-0 flex-1 px-density-4 py-density-3 max-sm:py-density-4\",\n scrollBody ? \"overflow-auto\" : \"flex flex-col overflow-hidden\",\n )}\n >\n {children}\n </div>\n {footer && (\n <div\n data-slot=\"modal-footer\"\n className=\"shrink-0 px-density-4 py-density-3 border-t border-border max-sm:py-density-4\"\n >\n {footer}\n </div>\n )}\n {confirming && (\n <ConfirmClosePrompt\n options={\n confirmClose === true\n ? DEFAULT_CONFIRM\n : { ...DEFAULT_CONFIRM, ...confirmClose }\n }\n onConfirm={() => {\n setConfirming(false);\n onClose();\n }}\n onCancel={() => setConfirming(false)}\n />\n )}\n </div>\n </div>\n );\n\n // Render into document.body so the fixed-position overlay escapes any ancestor\n // transform/overflow (e.g. a dropdown menu positioned via a CSS transform),\n // which would otherwise trap position:fixed inside that ancestor's box and clip\n // the modal to it.\n return typeof document !== \"undefined\"\n ? createPortal(overlay, document.body)\n : null;\n}\n\nfunction ConfirmClosePrompt({\n options,\n onConfirm,\n onCancel,\n}: {\n options: Required<ConfirmCloseOptions>;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n return (\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center rounded-lg bg-background/80 p-density-4 max-sm:rounded-none\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label={\n typeof options.title === \"string\" ? options.title : \"Confirm close\"\n }\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"w-full max-w-sm rounded-lg border border-border bg-background p-density-4 shadow-xl\">\n <h3 className=\"text-sm font-semibold\">{options.title}</h3>\n <p className=\"mt-density-2 text-sm text-muted-foreground\">\n {options.message}\n </p>\n <div className=\"mt-density-4 flex justify-end gap-density-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {options.cancelLabel}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={onConfirm}>\n {options.confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AA6EA,IAAM,YAAuC;CAC3C,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,MAAM;AACR;AAEA,IAAM,kBAAiD;CACrD,OAAO;CACP,SAAS;CACT,cAAc;CACd,aAAa;AACf;AAEA,IAAM,eAAe,gBAAgB,IAAI;AACzC,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;AAEV,SAAS,yBAAyB,WAAuC;CACvE,OAAO,MAAM,KACX,UAAU,iBAA8B,kBAAkB,CAC5D,CAAC,CAAC,QAAQ,YAAY;EACpB,MAAM,QAAQ,OAAO,iBAAiB,OAAO;EAC7C,OACE,CAAC,QAAQ,UACT,MAAM,YAAY,UAClB,MAAM,eAAe;CAEzB,CAAC;AACH;AAEA,SAAgB,MAAM,EACpB,MACA,SACA,eAAe,OACf,OACA,UACA,OAAO,MACP,kBAAkB,OAClB,aAAa,MACb,YAAY,OACZ,aAAa,MACb,WACA,YACA,QACA,aAAa,MACb,YACa;CACb,MAAM,YAAY,OAAuB,IAAI;CAC7C,MAAM,gBAAgB,OAA2B,KAAA,CAAS;CAC1D,MAAM,eAAe,OAA2B,KAAA,CAAS;CACzD,MAAM,CAAC,SAAS,cAAc,SAAS,IAAI;CAC3C,MAAM,CAAC,eAAe,oBAAoB,SAAS,KAAK;CACxD,MAAM,EAAE,UAAU,cAAc,OAAO;CACvC,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAG9C,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAIlD,MAAM,qBAAqB;EACzB,IAAI,cAAc,cAAc,IAAI;OAC/B,QAAQ;CACf;CAEA,gBAAgB;EACd,OAAO,aAAa,cAAc,OAAO;EACzC,OAAO,qBAAqB,aAAa,WAAW,CAAC;EAIrD,MAAM,gBACJ,aAAa,YAAY,KAAK,CAAC,aAAa,oBAAoB;EAElE,IAAI,MAAM;GACR,WAAW,IAAI;GACf,IAAI,eAAe;IACjB,iBAAiB,KAAK;IACtB,aAAa,UAAU,OAAO,4BAA4B;KACxD,iBAAiB,IAAI;IACvB,CAAC;GACH,OACE,iBAAiB,IAAI;EAEzB,OAAO,IAAI,eAAe;GACxB,iBAAiB,KAAK;GACtB,cAAc,UAAU,OAAO,iBACvB,WAAW,KAAK,GACtB,oBACF;EACF,OAAO;GACL,iBAAiB,KAAK;GACtB,WAAW,KAAK;EAClB;EAEA,aAAa;GACX,OAAO,aAAa,cAAc,OAAO;GACzC,OAAO,qBAAqB,aAAa,WAAW,CAAC;EACvD;CACF,GAAG,CAAC,IAAI,CAAC;CAET,gBAAgB;EACd,IAAI,CAAC,MAAM;GACT,YAAY,KAAK;GACjB,cAAc,KAAK;EACrB;CACF,GAAG,CAAC,IAAI,CAAC;CAIT,gBAAgB;EACd,IAAI,CAAC,cAAc,cAAc,KAAK;CACxC,GAAG,CAAC,YAAY,CAAC;CAEjB,eAAe,eAAe;EAC5B,IAAI,CAAC,QAAQ,CAAC,YAAY;EAE1B,IAAI,YAAY,cAAc,KAAK;OAC9B,aAAa;CACpB,CAAC;CAED,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,OAAO,SAAS;EACtB,UAAU,SAAS,MAAM;EACzB,aAAa,MAAM,QAAQ;CAC7B,GAAG,CAAC,IAAI,CAAC;CAET,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,UACJ,oBAAC,OAAD;EACE,WAAW,GACT,uJAEA,UAAU,IAAI,gBAAgB,aAChC;EAKA,OAAO,EAAE,QAAQ,OAAO,QAAQ,QAAQ,OAAO,UAAU;EACzD,SAAS,kBAAkB,eAAe,KAAA;EAC1C,MAAK;EAEL,UAAA,qBAAC,OAAD;GACE,KAAK;GACL,UAAU;GACV,MAAK;GACL,cAAW;GACX,cAAY,OAAO,UAAU,WAAW,QAAQ,KAAA;GAChD,cAAY,gBAAgB,SAAS;GACrC,WAAW,GACT,yGACA,+GACA,wGACA,sFACA,WAAW,UAAU,OAAO,UAAU,OACtC,SACF;GAKA,OAAO;IACL,WAAW;IACX,GAAI,WAAW,EAAE,QAAQ,sBAAsB,IAAI,CAAC;GACtD;GACA,UAAU,MAAM,EAAE,gBAAgB;GAClC,YAAY,UAAU;IACpB,IAAI,MAAM,QAAQ,OAAO;IACzB,MAAM,QAAQ,aACV,UAAU,SAAS,cACjB,sBACF,IACA,UAAU;IACd,IAAI,CAAC,OAAO;IACZ,MAAM,YAAY,yBAAyB,KAAK;IAChD,MAAM,QAAQ,UAAU;IACxB,MAAM,OAAO,UAAU,UAAU,SAAS;IAC1C,IAAI,CAAC,SAAS,CAAC,MAAM;KACnB,MAAM,eAAe;KACrB,MAAM,MAAM;IACd,OAAO,IAAI,MAAM,YAAY,SAAS,kBAAkB,OAAO;KAC7D,MAAM,eAAe;KACrB,KAAK,MAAM;IACb,OAAO,IAAI,CAAC,MAAM,YAAY,SAAS,kBAAkB,MAAM;KAC7D,MAAM,eAAe;KACrB,MAAM,MAAM;IACd;GACF;GA7CF,UAAA;KA+CI,SAAS,YAAY,cAAc,cAAc,CAAC,cAClD,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACG,CAAC,aACA,oBAAC,QAAD;QACE,MAAK;QACL,SAAS;QACT,SAAQ;QACR,MAAK;QACL,cAAW;QACX,WAAU;QAEV,UAAA,oBAAC,MAAD,EAAM,MAAM,YAAc,CAAA;OACpB,CAAA;OAET,QACC,oBAAC,MAAD;QAAI,WAAU;QACX,UAAA;OACC,CAAA,IAEJ,oBAAC,QAAD,EAAM,WAAU,SAAU,CAAA;OAE3B;OACA,cACC,oBAAC,UAAD;QACE,MAAK;QACL,eAAe,aAAa,MAAM,CAAC,CAAC;QACpC,cACE,WAAW,iBAAiB;QAE9B,WAAU;QAEV,UAAA,oBAAC,MAAD,EAAM,MAAM,WAAW,qBAAqB,aAAe,CAAA;OACrD,CAAA;OAET,CAAC,aACA,oBAAC,UAAD;QACE,MAAK;QACL,SAAS;QACT,cAAW;QACX,WAAU;QAEV,UAAA,oBAAC,MAAD,EAAM,MAAM,QAAU,CAAA;OAChB,CAAA;MAEP;KACJ,CAAA,GAAA,WAAW,oBAAC,OAAD;MAAK,WAAU;MAAgB,UAAA;KAAc,CAAA,IAAI,IAC1D;;IAEP,oBAAC,OAAD;KACE,aAAU;KACV,WAAW,GACT,gEACA,aAAa,kBAAkB,+BACjC;KAEC;IACE,CAAA;IACJ,UACC,oBAAC,OAAD;KACE,aAAU;KACV,WAAU;KAET,UAAA;IACE,CAAA;IAEN,cACC,oBAAC,oBAAD;KACE,SACE,iBAAiB,OACb,kBACA;MAAE,GAAG;MAAiB,GAAG;KAAa;KAE5C,iBAAiB;MACf,cAAc,KAAK;MACnB,QAAQ;KACV;KACA,gBAAgB,cAAc,KAAK;IACpC,CAAA;GAEA;;CACF,CAAA;CAOP,OAAO,OAAO,aAAa,cACvB,aAAa,SAAS,SAAS,IAAI,IACnC;AACN;AAEA,SAAS,mBAAmB,EAC1B,SACA,WACA,YAKC;CACD,OACE,oBAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,cAAW;EACX,cACE,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;EAEtD,UAAU,MAAM,EAAE,gBAAgB;EAElC,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,MAAD;KAAI,WAAU;KAAyB,UAAA,QAAQ;IAAU,CAAA;IACzD,oBAAC,KAAD;KAAG,WAAU;KACV,UAAA,QAAQ;IACR,CAAA;IACH,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,QAAD;MAAQ,SAAQ;MAAQ,MAAK;MAAK,SAAS;MACxC,UAAA,QAAQ;KACH,CAAA,GACR,oBAAC,QAAD;MAAQ,SAAQ;MAAc,MAAK;MAAK,SAAS;MAC9C,UAAA,QAAQ;KACH,CAAA,CACL;;GACF;;CACF,CAAA;AAET"}
|
|
@@ -3,7 +3,7 @@ export declare const MENU_POPOVER_CLASS = "min-w-[8rem] overflow-y-auto rounded-
|
|
|
3
3
|
export declare const menuViewportSize: {
|
|
4
4
|
name: string;
|
|
5
5
|
options?: any;
|
|
6
|
-
fn: (state: import('@floating-ui/
|
|
6
|
+
fn: (state: import('@floating-ui/dom').MiddlewareState) => import('@floating-ui/core').MiddlewareReturn | Promise<import('@floating-ui/core').MiddlewareReturn>;
|
|
7
7
|
};
|
|
8
8
|
/**
|
|
9
9
|
* Bridges a menu level to its item components: leaves and submenu triggers pull
|
|
@@ -133,7 +133,7 @@ function ProfileEditor({ client, action, surfaceKey, initialValue, onClose, onSu
|
|
|
133
133
|
setConfirmResetColumns(false);
|
|
134
134
|
};
|
|
135
135
|
const sectionContent = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
136
|
-
className: "h-full overflow-auto p-5",
|
|
136
|
+
className: "@container h-full overflow-auto p-5",
|
|
137
137
|
children: [
|
|
138
138
|
section === "general" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
139
139
|
className: "space-y-4",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileEditor.cjs","names":["lazy","useOperationLookupFetcher","useMemo","cloneProfileDraft","useState","profileSampleSignature","validateProfileEditorDraft","profileColumnResetState","useProfileFieldState","profileSchema","useCallback","resolveProfileUpdatePath","profileUpdateConflictTarget","mergeSampledProfileColumns","resetProfileColumns","ProfileGeneralSection","ProfileSchemaSection","profileGeneralOptionKeys","ProfileSourceSection","ProfileFieldEditorForm","profileFieldEditorEmptyMessage","ProfileParameterDetail","ProcessorPipeline","Suspense","UiListTree","ProfileEditorRail","profileEditorSectionStatus","ProfileFieldSidebarList","ProfileParameterSidebar","UiTable","ProfileEditorPreview","JsonPathProfileProvider","Button","Workspace","Modal","profileEditorSections"],"sources":["../../../src/profiles/editor/profileEditor.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { Workspace } from \"../../layout/Workspace\";\nimport type { WorkspacePaneSpec } from \"../../layout/Workspace\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { useOperationLookupFetcher } from \"../../rpc/operationLookupFetcher\";\nimport type { ResolvedOperation } from \"../../rpc/types\";\nimport type { OperationsApiClient } from \"../../rpc/useOperations\";\nimport { UiListTree, UiTable } from \"../../icons\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n cloneProfileDraft,\n mergeSampledProfileColumns,\n profileColumnResetState,\n profileEditorSectionStatus,\n profileEditorSections,\n profileGeneralOptionKeys,\n profileSampleSignature,\n profileUpdateConflictTarget,\n resetProfileColumns,\n validateProfileEditorDraft,\n type ProfileEditorSection,\n} from \"./profileEditorModel\";\nimport { ProfileEditorPreview } from \"./profileEditorPreview\";\nimport { ProfileEditorRail } from \"./profileEditorRail\";\nimport {\n ProfileGeneralSection,\n ProfileSchemaSection,\n ProfileSourceSection,\n} from \"./profileEditorSections\";\nimport { ProfileFieldSidebarList } from \"../fields/profileFieldList\";\nimport {\n ProfileFieldEditorForm,\n profileFieldEditorEmptyMessage,\n} from \"../fields/profileFieldEditor\";\nimport { useProfileFieldState } from \"../fields/profileFieldState\";\nimport type { ProfileSample } from \"../wizard/profileWizardQueryStep\";\nimport { JsonPathProfileProvider } from \"../query/jsonPathSampleRow\";\nimport type {\n ProfileColumn,\n ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\nimport { resolveProfileUpdatePath } from \"./profileEditorRoutes\";\nimport {\n ProfileParameterDetail,\n ProfileParameterSidebar,\n} from \"./profileParameterEditor\";\nimport { ProcessorPipeline } from \"../processor/processorPipeline\";\nimport type {\n ProcessorPreset,\n ProcessorSpec,\n} from \"../processor/processorConfig\";\nimport { profileSchema } from \"../profileApi\";\n\nconst ProfileEditorRaw = lazy(() =>\n import(\"./profileEditorRaw\").then((module) => ({\n default: module.ProfileEditorRaw,\n })),\n);\n\n/**\n * The profile editor as a route rather than a dialog.\n *\n * Six sections, ~130 discoverable fields and a CEL editor per column outgrew a\n * modal: the layout is a clicky-ui Workspace, so the section rail, the column\n * grid and the sampled preview are panes the user can resize, collapse and keep\n * across visits. Collection fields stay in the rail while the selected item is\n * edited in the center, keeping names and icons visible throughout the edit.\n */\nexport function ProfileEditor({\n client,\n action,\n surfaceKey,\n initialValue,\n onClose,\n onSuccess,\n}: {\n client: OperationsApiClient;\n action: ResolvedOperation;\n surfaceKey: string;\n initialValue: Record<string, unknown>;\n onClose: () => void;\n onSuccess: (name: string) => void | Promise<void>;\n}) {\n const lookupFetcher = useOperationLookupFetcher(client);\n const initialDraft = useMemo(\n () => cloneProfileDraft(initialValue),\n [initialValue],\n );\n const initialSerialized = useMemo(\n () => JSON.stringify(initialDraft),\n [initialDraft],\n );\n const [draft, setDraft] = useState<ProfileWizardDraft>(initialDraft);\n const [section, setSection] = useState<ProfileEditorSection>(\"general\");\n const [discovered, setDiscovered] = useState<ProfileColumn[]>(\n initialDraft.columns ?? [],\n );\n const [sampledColumns, setSampledColumns] = useState<ProfileColumn[]>([]);\n const [sampleRows, setSampleRows] = useState<Record<string, unknown>[]>([]);\n const [activeField, setActiveField] = useState(\n initialDraft.columns?.[0]?.name ?? \"\",\n );\n const [activeParameter, setActiveParameter] = useState(0);\n const [activeProcessor, setActiveProcessor] = useState(0);\n const [lastSampleSignature, setLastSampleSignature] = useState(() =>\n profileSampleSignature(initialDraft),\n );\n const [rawValid, setRawValid] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const [replaceTarget, setReplaceTarget] = useState(\"\");\n const [confirmDiscard, setConfirmDiscard] = useState(false);\n const [confirmResetColumns, setConfirmResetColumns] = useState(false);\n const dirty = JSON.stringify(draft) !== initialSerialized;\n const validationError = validateProfileEditorDraft(draft);\n const sampleStale = profileSampleSignature(draft) !== lastSampleSignature;\n const resetState = profileColumnResetState({\n providerType: draft.provider?.type ?? \"\",\n sampledColumnCount: sampledColumns.length,\n sampleStale,\n });\n\n const fields = useProfileFieldState({\n discovered,\n configured: draft.columns ?? [],\n activeName: activeField,\n onConfiguredChange: (columns) =>\n setDraft((current) => ({ ...current, columns })),\n onActiveNameChange: setActiveField,\n });\n const processors = Array.isArray(draft.processors)\n ? (draft.processors as ProcessorSpec[])\n : [];\n const processorPresets = useMemo(() => {\n const processorSchema = profileSchema().properties?.processors;\n return (\n (processorSchema?.[\"x-clicky-presets\"] as\n | Record<string, ProcessorPreset>\n | undefined) ?? {}\n );\n }, []);\n const setProcessors = useCallback(\n (next: ProcessorSpec[]) =>\n setDraft((current) => ({ ...current, processors: next })),\n [],\n );\n\n // A route can be refreshed or navigated away from; the dialog used to guard\n // unsaved edits with confirmClose, so the route has to guard them too.\n useEffect(() => {\n if (!dirty) return;\n const warn = (event: BeforeUnloadEvent) => event.preventDefault();\n window.addEventListener(\"beforeunload\", warn);\n return () => window.removeEventListener(\"beforeunload\", warn);\n }, [dirty]);\n\n const save = async (replaceExisting = false) => {\n if (validationError) {\n setError(validationError);\n return;\n }\n if (!client.submitForm) {\n setError(\"Profile updates are unavailable\");\n return;\n }\n setSaving(true);\n setError(\"\");\n try {\n const body = {\n ...draft,\n id: surfaceKey,\n ...(replaceExisting ? { replaceExisting: true } : {}),\n };\n const response = await client.submitForm(\n resolveProfileUpdatePath(action.path, surfaceKey),\n action.method,\n body,\n );\n if (!response.success) {\n const message =\n response.error || response.message || \"Profile update failed\";\n const target = profileUpdateConflictTarget(message);\n if (target && !replaceExisting) {\n setReplaceTarget(target);\n return;\n }\n throw new Error(message);\n }\n await onSuccess(draft.profile!.trim());\n } catch (saveError) {\n setError(\n saveError instanceof Error\n ? saveError.message\n : \"Profile update failed\",\n );\n } finally {\n setSaving(false);\n }\n };\n\n const acceptSample = ({ columns, rows, sourceDraft }: ProfileSample) => {\n setSampledColumns(structuredClone(columns));\n setDiscovered(columns);\n setSampleRows(rows);\n setDraft((current) => ({\n ...current,\n columns: mergeSampledProfileColumns(current.columns ?? [], columns),\n }));\n setActiveField((current) => current || columns[0]?.name || \"\");\n setLastSampleSignature(profileSampleSignature(sourceDraft));\n };\n\n const resetColumns = () => {\n const first = sampledColumns[0];\n if (!first) throw new Error(\"cannot reset columns without a sample\");\n setDraft((current) => resetProfileColumns(current, sampledColumns));\n setActiveField(first.name);\n setConfirmResetColumns(false);\n };\n\n const sectionContent = (\n <div className=\"h-full overflow-auto p-5\">\n {section === \"general\" ? (\n <div className=\"space-y-4\">\n <ProfileGeneralSection draft={draft} onChange={setDraft} />\n <ProfileSchemaSection\n draft={draft}\n keys={profileGeneralOptionKeys}\n title=\"General options\"\n description=\"Compose profiles with imports and aliases, choose the output fields, and ignore values that should not be retained.\"\n idPrefix=\"profile-general-options\"\n {...(lookupFetcher ? { lookupFetcher } : {})}\n onChange={setDraft}\n />\n </div>\n ) : null}\n {section === \"source\" ? (\n <ProfileSourceSection\n draft={draft}\n discovered={discovered}\n sampleStale={sampleStale}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n onChange={setDraft}\n onSample={acceptSample}\n />\n ) : null}\n {section === \"columns\" ? (\n fields.activeField ? (\n <section className=\"rounded-xl border bg-card p-5\">\n <div className=\"max-w-6xl\">\n <ProfileFieldEditorForm\n field={fields.activeField}\n onChange={fields.updateActiveField}\n />\n </div>\n </section>\n ) : (\n <div className=\"grid h-full place-items-center text-sm text-muted-foreground\">\n {profileFieldEditorEmptyMessage}\n </div>\n )\n ) : null}\n {section === \"parameters\" ? (\n <ProfileParameterDetail\n draft={draft}\n activeIndex={activeParameter}\n onChange={setDraft}\n />\n ) : null}\n {section === \"processors\" ? (\n <div className=\"max-w-5xl\">\n <ProcessorPipeline\n steps={processors}\n presets={processorPresets}\n profile={draft}\n selectedIndex={activeProcessor}\n showSteps={false}\n onSelectedIndexChange={setActiveProcessor}\n onChange={setProcessors}\n />\n </div>\n ) : null}\n {section === \"raw\" ? (\n <Suspense\n fallback={\n <p className=\"text-sm text-muted-foreground\">\n Loading YAML editor…\n </p>\n }\n >\n <ProfileEditorRaw\n draft={draft}\n onChange={setDraft}\n onValidityChange={setRawValid}\n />\n </Suspense>\n ) : null}\n </div>\n );\n\n const panes = useMemo<WorkspacePaneSpec[]>(() => {\n const rail: WorkspacePaneSpec = {\n id: \"sections\",\n label: \"Profile\",\n icon: <UiListTree />,\n location: \"left\",\n width: 340,\n minWidth: 280,\n maxWidth: 480,\n content: (\n <ProfileEditorRail\n value={section}\n status={profileEditorSectionStatus({\n draft,\n availableColumns: fields.available.length,\n sampleStale,\n })}\n collections={{\n columns: (\n <ProfileFieldSidebarList\n state={fields}\n onFieldSelect={(name) => {\n fields.setActiveName(name);\n setSection(\"columns\");\n }}\n onAdd={() => setSection(\"columns\")}\n {...(resetState.visible\n ? {\n reset: {\n disabled: resetState.disabled,\n title: resetState.title,\n onReset: () => setConfirmResetColumns(true),\n },\n }\n : {})}\n />\n ),\n parameters: (\n <ProfileParameterSidebar\n draft={draft}\n activeIndex={activeParameter}\n onActiveIndexChange={(index) => {\n setActiveParameter(index);\n setSection(\"parameters\");\n }}\n onChange={setDraft}\n />\n ),\n processors: (\n <ProcessorPipeline\n steps={processors}\n presets={processorPresets}\n profile={draft}\n selectedIndex={activeProcessor}\n showEditor={false}\n tree\n onSelectedIndexChange={(index) => {\n setActiveProcessor(index);\n setSection(\"processors\");\n }}\n onChange={setProcessors}\n />\n ),\n }}\n onChange={setSection}\n />\n ),\n };\n\n const result: WorkspacePaneSpec[] = [\n rail,\n {\n id: \"section\",\n label: sectionLabel(section),\n location: \"center\",\n collapsible: false,\n showHeader: false,\n contentClassName: \"p-0\",\n content: sectionContent,\n },\n ];\n if (section === \"columns\") {\n result.push({\n id: \"preview\",\n label: \"Preview\",\n icon: <UiTable />,\n location: \"bottom\",\n height: 220,\n minHeight: 120,\n maxHeight: 520,\n slots: {\n headerTrailing: (\n <span className=\"text-[11px] text-muted-foreground\">\n {sampleRows.length\n ? `${sampleRows.length} sampled rows · updates as you edit`\n : \"No sample yet\"}\n </span>\n ),\n },\n content: (\n <ProfileEditorPreview\n columns={draft.columns ?? []}\n rows={sampleRows}\n />\n ),\n });\n }\n return result;\n }, [\n activeParameter,\n activeProcessor,\n draft,\n fields,\n resetState,\n sampleRows,\n sampleStale,\n section,\n sectionContent,\n processorPresets,\n processors,\n setProcessors,\n ]);\n\n const leave = () => (dirty ? setConfirmDiscard(true) : onClose());\n\n return (\n <JsonPathProfileProvider profile={draft}>\n <div className=\"grid h-full min-h-0 grid-rows-[auto_minmax(0,1fr)] bg-background\">\n <header className=\"flex items-center gap-3 border-b border-border px-4 py-2.5\">\n <nav className=\"flex min-w-0 items-center gap-1.5 text-sm text-muted-foreground\">\n <button\n type=\"button\"\n className=\"hover:text-foreground\"\n onClick={leave}\n >\n Profiles\n </button>\n <span>/</span>\n <button\n type=\"button\"\n className=\"min-w-0 truncate hover:text-foreground\"\n onClick={leave}\n >\n {initialDraft.profile ?? surfaceKey}\n </button>\n <span>/</span>\n <span className=\"font-medium text-foreground\">Edit</span>\n </nav>\n {error ? (\n <span className=\"truncate text-sm text-destructive\">{error}</span>\n ) : null}\n <span className=\"ml-auto shrink-0 text-xs text-muted-foreground\">\n {dirty ? \"Unsaved changes\" : \"No changes\"}\n </span>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={leave}>\n Discard\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={\n saving ||\n Boolean(validationError) ||\n (section === \"raw\" && !rawValid)\n }\n title={validationError ?? undefined}\n onClick={() => void save()}\n >\n {saving ? \"Saving…\" : \"Save profile\"}\n </Button>\n </header>\n\n <Workspace panes={panes} storageKey=\"profile-editor-v2\" />\n </div>\n\n {confirmDiscard ? (\n <Modal\n open\n onClose={() => setConfirmDiscard(false)}\n title=\"Discard profile changes?\"\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setConfirmDiscard(false)}\n >\n Keep editing\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={onClose}>\n Discard changes\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Your unsaved profile changes will be lost.\n </p>\n </Modal>\n ) : null}\n\n {confirmResetColumns ? (\n <Modal\n open\n onClose={() => setConfirmResetColumns(false)}\n title=\"Reset columns from latest sample?\"\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setConfirmResetColumns(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={resetState.disabled}\n onClick={resetColumns}\n >\n Reset columns\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Replace {fields.configuredCount} configured column\n {fields.configuredCount === 1 ? \"\" : \"s\"} with{\" \"}\n {sampledColumns.length} column\n {sampledColumns.length === 1 ? \"\" : \"s\"} from the latest sample.\n Custom labels, expressions, formatting, filtering, ordering, and\n manually added columns will be removed. The profile will remain\n unsaved until you save it.\n </p>\n </Modal>\n ) : null}\n\n {replaceTarget ? (\n <Modal\n open\n onClose={() => setReplaceTarget(\"\")}\n title={`Replace ${replaceTarget}?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setReplaceTarget(\"\")}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={saving}\n onClick={() => {\n setReplaceTarget(\"\");\n void save(true);\n }}\n >\n Replace profile\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n A profile named {replaceTarget} already exists. Its definition will\n be overwritten, the current profile will be renamed, and dependent\n imports will be updated atomically.\n </p>\n </Modal>\n ) : null}\n </JsonPathProfileProvider>\n );\n}\n\nfunction sectionLabel(section: ProfileEditorSection): string {\n return profileEditorSections.find((entry) => entry.id === section)!.label;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profileEditor.cjs","names":["lazy","useOperationLookupFetcher","useMemo","cloneProfileDraft","useState","profileSampleSignature","validateProfileEditorDraft","profileColumnResetState","useProfileFieldState","profileSchema","useCallback","resolveProfileUpdatePath","profileUpdateConflictTarget","mergeSampledProfileColumns","resetProfileColumns","ProfileGeneralSection","ProfileSchemaSection","profileGeneralOptionKeys","ProfileSourceSection","ProfileFieldEditorForm","profileFieldEditorEmptyMessage","ProfileParameterDetail","ProcessorPipeline","Suspense","UiListTree","ProfileEditorRail","profileEditorSectionStatus","ProfileFieldSidebarList","ProfileParameterSidebar","UiTable","ProfileEditorPreview","JsonPathProfileProvider","Button","Workspace","Modal","profileEditorSections"],"sources":["../../../src/profiles/editor/profileEditor.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { Workspace } from \"../../layout/Workspace\";\nimport type { WorkspacePaneSpec } from \"../../layout/Workspace\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { useOperationLookupFetcher } from \"../../rpc/operationLookupFetcher\";\nimport type { ResolvedOperation } from \"../../rpc/types\";\nimport type { OperationsApiClient } from \"../../rpc/useOperations\";\nimport { UiListTree, UiTable } from \"../../icons\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n cloneProfileDraft,\n mergeSampledProfileColumns,\n profileColumnResetState,\n profileEditorSectionStatus,\n profileEditorSections,\n profileGeneralOptionKeys,\n profileSampleSignature,\n profileUpdateConflictTarget,\n resetProfileColumns,\n validateProfileEditorDraft,\n type ProfileEditorSection,\n} from \"./profileEditorModel\";\nimport { ProfileEditorPreview } from \"./profileEditorPreview\";\nimport { ProfileEditorRail } from \"./profileEditorRail\";\nimport {\n ProfileGeneralSection,\n ProfileSchemaSection,\n ProfileSourceSection,\n} from \"./profileEditorSections\";\nimport { ProfileFieldSidebarList } from \"../fields/profileFieldList\";\nimport {\n ProfileFieldEditorForm,\n profileFieldEditorEmptyMessage,\n} from \"../fields/profileFieldEditor\";\nimport { useProfileFieldState } from \"../fields/profileFieldState\";\nimport type { ProfileSample } from \"../wizard/profileWizardQueryStep\";\nimport { JsonPathProfileProvider } from \"../query/jsonPathSampleRow\";\nimport type {\n ProfileColumn,\n ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\nimport { resolveProfileUpdatePath } from \"./profileEditorRoutes\";\nimport {\n ProfileParameterDetail,\n ProfileParameterSidebar,\n} from \"./profileParameterEditor\";\nimport { ProcessorPipeline } from \"../processor/processorPipeline\";\nimport type {\n ProcessorPreset,\n ProcessorSpec,\n} from \"../processor/processorConfig\";\nimport { profileSchema } from \"../profileApi\";\n\nconst ProfileEditorRaw = lazy(() =>\n import(\"./profileEditorRaw\").then((module) => ({\n default: module.ProfileEditorRaw,\n })),\n);\n\n/**\n * The profile editor as a route rather than a dialog.\n *\n * Six sections, ~130 discoverable fields and a CEL editor per column outgrew a\n * modal: the layout is a clicky-ui Workspace, so the section rail, the column\n * grid and the sampled preview are panes the user can resize, collapse and keep\n * across visits. Collection fields stay in the rail while the selected item is\n * edited in the center, keeping names and icons visible throughout the edit.\n */\nexport function ProfileEditor({\n client,\n action,\n surfaceKey,\n initialValue,\n onClose,\n onSuccess,\n}: {\n client: OperationsApiClient;\n action: ResolvedOperation;\n surfaceKey: string;\n initialValue: Record<string, unknown>;\n onClose: () => void;\n onSuccess: (name: string) => void | Promise<void>;\n}) {\n const lookupFetcher = useOperationLookupFetcher(client);\n const initialDraft = useMemo(\n () => cloneProfileDraft(initialValue),\n [initialValue],\n );\n const initialSerialized = useMemo(\n () => JSON.stringify(initialDraft),\n [initialDraft],\n );\n const [draft, setDraft] = useState<ProfileWizardDraft>(initialDraft);\n const [section, setSection] = useState<ProfileEditorSection>(\"general\");\n const [discovered, setDiscovered] = useState<ProfileColumn[]>(\n initialDraft.columns ?? [],\n );\n const [sampledColumns, setSampledColumns] = useState<ProfileColumn[]>([]);\n const [sampleRows, setSampleRows] = useState<Record<string, unknown>[]>([]);\n const [activeField, setActiveField] = useState(\n initialDraft.columns?.[0]?.name ?? \"\",\n );\n const [activeParameter, setActiveParameter] = useState(0);\n const [activeProcessor, setActiveProcessor] = useState(0);\n const [lastSampleSignature, setLastSampleSignature] = useState(() =>\n profileSampleSignature(initialDraft),\n );\n const [rawValid, setRawValid] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const [replaceTarget, setReplaceTarget] = useState(\"\");\n const [confirmDiscard, setConfirmDiscard] = useState(false);\n const [confirmResetColumns, setConfirmResetColumns] = useState(false);\n const dirty = JSON.stringify(draft) !== initialSerialized;\n const validationError = validateProfileEditorDraft(draft);\n const sampleStale = profileSampleSignature(draft) !== lastSampleSignature;\n const resetState = profileColumnResetState({\n providerType: draft.provider?.type ?? \"\",\n sampledColumnCount: sampledColumns.length,\n sampleStale,\n });\n\n const fields = useProfileFieldState({\n discovered,\n configured: draft.columns ?? [],\n activeName: activeField,\n onConfiguredChange: (columns) =>\n setDraft((current) => ({ ...current, columns })),\n onActiveNameChange: setActiveField,\n });\n const processors = Array.isArray(draft.processors)\n ? (draft.processors as ProcessorSpec[])\n : [];\n const processorPresets = useMemo(() => {\n const processorSchema = profileSchema().properties?.processors;\n return (\n (processorSchema?.[\"x-clicky-presets\"] as\n | Record<string, ProcessorPreset>\n | undefined) ?? {}\n );\n }, []);\n const setProcessors = useCallback(\n (next: ProcessorSpec[]) =>\n setDraft((current) => ({ ...current, processors: next })),\n [],\n );\n\n // A route can be refreshed or navigated away from; the dialog used to guard\n // unsaved edits with confirmClose, so the route has to guard them too.\n useEffect(() => {\n if (!dirty) return;\n const warn = (event: BeforeUnloadEvent) => event.preventDefault();\n window.addEventListener(\"beforeunload\", warn);\n return () => window.removeEventListener(\"beforeunload\", warn);\n }, [dirty]);\n\n const save = async (replaceExisting = false) => {\n if (validationError) {\n setError(validationError);\n return;\n }\n if (!client.submitForm) {\n setError(\"Profile updates are unavailable\");\n return;\n }\n setSaving(true);\n setError(\"\");\n try {\n const body = {\n ...draft,\n id: surfaceKey,\n ...(replaceExisting ? { replaceExisting: true } : {}),\n };\n const response = await client.submitForm(\n resolveProfileUpdatePath(action.path, surfaceKey),\n action.method,\n body,\n );\n if (!response.success) {\n const message =\n response.error || response.message || \"Profile update failed\";\n const target = profileUpdateConflictTarget(message);\n if (target && !replaceExisting) {\n setReplaceTarget(target);\n return;\n }\n throw new Error(message);\n }\n await onSuccess(draft.profile!.trim());\n } catch (saveError) {\n setError(\n saveError instanceof Error\n ? saveError.message\n : \"Profile update failed\",\n );\n } finally {\n setSaving(false);\n }\n };\n\n const acceptSample = ({ columns, rows, sourceDraft }: ProfileSample) => {\n setSampledColumns(structuredClone(columns));\n setDiscovered(columns);\n setSampleRows(rows);\n setDraft((current) => ({\n ...current,\n columns: mergeSampledProfileColumns(current.columns ?? [], columns),\n }));\n setActiveField((current) => current || columns[0]?.name || \"\");\n setLastSampleSignature(profileSampleSignature(sourceDraft));\n };\n\n const resetColumns = () => {\n const first = sampledColumns[0];\n if (!first) throw new Error(\"cannot reset columns without a sample\");\n setDraft((current) => resetProfileColumns(current, sampledColumns));\n setActiveField(first.name);\n setConfirmResetColumns(false);\n };\n\n const sectionContent = (\n <div className=\"@container h-full overflow-auto p-5\">\n {section === \"general\" ? (\n <div className=\"space-y-4\">\n <ProfileGeneralSection draft={draft} onChange={setDraft} />\n <ProfileSchemaSection\n draft={draft}\n keys={profileGeneralOptionKeys}\n title=\"General options\"\n description=\"Compose profiles with imports and aliases, choose the output fields, and ignore values that should not be retained.\"\n idPrefix=\"profile-general-options\"\n {...(lookupFetcher ? { lookupFetcher } : {})}\n onChange={setDraft}\n />\n </div>\n ) : null}\n {section === \"source\" ? (\n <ProfileSourceSection\n draft={draft}\n discovered={discovered}\n sampleStale={sampleStale}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n onChange={setDraft}\n onSample={acceptSample}\n />\n ) : null}\n {section === \"columns\" ? (\n fields.activeField ? (\n <section className=\"rounded-xl border bg-card p-5\">\n <div className=\"max-w-6xl\">\n <ProfileFieldEditorForm\n field={fields.activeField}\n onChange={fields.updateActiveField}\n />\n </div>\n </section>\n ) : (\n <div className=\"grid h-full place-items-center text-sm text-muted-foreground\">\n {profileFieldEditorEmptyMessage}\n </div>\n )\n ) : null}\n {section === \"parameters\" ? (\n <ProfileParameterDetail\n draft={draft}\n activeIndex={activeParameter}\n onChange={setDraft}\n />\n ) : null}\n {section === \"processors\" ? (\n <div className=\"max-w-5xl\">\n <ProcessorPipeline\n steps={processors}\n presets={processorPresets}\n profile={draft}\n selectedIndex={activeProcessor}\n showSteps={false}\n onSelectedIndexChange={setActiveProcessor}\n onChange={setProcessors}\n />\n </div>\n ) : null}\n {section === \"raw\" ? (\n <Suspense\n fallback={\n <p className=\"text-sm text-muted-foreground\">\n Loading YAML editor…\n </p>\n }\n >\n <ProfileEditorRaw\n draft={draft}\n onChange={setDraft}\n onValidityChange={setRawValid}\n />\n </Suspense>\n ) : null}\n </div>\n );\n\n const panes = useMemo<WorkspacePaneSpec[]>(() => {\n const rail: WorkspacePaneSpec = {\n id: \"sections\",\n label: \"Profile\",\n icon: <UiListTree />,\n location: \"left\",\n width: 340,\n minWidth: 280,\n maxWidth: 480,\n content: (\n <ProfileEditorRail\n value={section}\n status={profileEditorSectionStatus({\n draft,\n availableColumns: fields.available.length,\n sampleStale,\n })}\n collections={{\n columns: (\n <ProfileFieldSidebarList\n state={fields}\n onFieldSelect={(name) => {\n fields.setActiveName(name);\n setSection(\"columns\");\n }}\n onAdd={() => setSection(\"columns\")}\n {...(resetState.visible\n ? {\n reset: {\n disabled: resetState.disabled,\n title: resetState.title,\n onReset: () => setConfirmResetColumns(true),\n },\n }\n : {})}\n />\n ),\n parameters: (\n <ProfileParameterSidebar\n draft={draft}\n activeIndex={activeParameter}\n onActiveIndexChange={(index) => {\n setActiveParameter(index);\n setSection(\"parameters\");\n }}\n onChange={setDraft}\n />\n ),\n processors: (\n <ProcessorPipeline\n steps={processors}\n presets={processorPresets}\n profile={draft}\n selectedIndex={activeProcessor}\n showEditor={false}\n tree\n onSelectedIndexChange={(index) => {\n setActiveProcessor(index);\n setSection(\"processors\");\n }}\n onChange={setProcessors}\n />\n ),\n }}\n onChange={setSection}\n />\n ),\n };\n\n const result: WorkspacePaneSpec[] = [\n rail,\n {\n id: \"section\",\n label: sectionLabel(section),\n location: \"center\",\n collapsible: false,\n showHeader: false,\n contentClassName: \"p-0\",\n content: sectionContent,\n },\n ];\n if (section === \"columns\") {\n result.push({\n id: \"preview\",\n label: \"Preview\",\n icon: <UiTable />,\n location: \"bottom\",\n height: 220,\n minHeight: 120,\n maxHeight: 520,\n slots: {\n headerTrailing: (\n <span className=\"text-[11px] text-muted-foreground\">\n {sampleRows.length\n ? `${sampleRows.length} sampled rows · updates as you edit`\n : \"No sample yet\"}\n </span>\n ),\n },\n content: (\n <ProfileEditorPreview\n columns={draft.columns ?? []}\n rows={sampleRows}\n />\n ),\n });\n }\n return result;\n }, [\n activeParameter,\n activeProcessor,\n draft,\n fields,\n resetState,\n sampleRows,\n sampleStale,\n section,\n sectionContent,\n processorPresets,\n processors,\n setProcessors,\n ]);\n\n const leave = () => (dirty ? setConfirmDiscard(true) : onClose());\n\n return (\n <JsonPathProfileProvider profile={draft}>\n <div className=\"grid h-full min-h-0 grid-rows-[auto_minmax(0,1fr)] bg-background\">\n <header className=\"flex items-center gap-3 border-b border-border px-4 py-2.5\">\n <nav className=\"flex min-w-0 items-center gap-1.5 text-sm text-muted-foreground\">\n <button\n type=\"button\"\n className=\"hover:text-foreground\"\n onClick={leave}\n >\n Profiles\n </button>\n <span>/</span>\n <button\n type=\"button\"\n className=\"min-w-0 truncate hover:text-foreground\"\n onClick={leave}\n >\n {initialDraft.profile ?? surfaceKey}\n </button>\n <span>/</span>\n <span className=\"font-medium text-foreground\">Edit</span>\n </nav>\n {error ? (\n <span className=\"truncate text-sm text-destructive\">{error}</span>\n ) : null}\n <span className=\"ml-auto shrink-0 text-xs text-muted-foreground\">\n {dirty ? \"Unsaved changes\" : \"No changes\"}\n </span>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={leave}>\n Discard\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={\n saving ||\n Boolean(validationError) ||\n (section === \"raw\" && !rawValid)\n }\n title={validationError ?? undefined}\n onClick={() => void save()}\n >\n {saving ? \"Saving…\" : \"Save profile\"}\n </Button>\n </header>\n\n <Workspace panes={panes} storageKey=\"profile-editor-v2\" />\n </div>\n\n {confirmDiscard ? (\n <Modal\n open\n onClose={() => setConfirmDiscard(false)}\n title=\"Discard profile changes?\"\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setConfirmDiscard(false)}\n >\n Keep editing\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={onClose}>\n Discard changes\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Your unsaved profile changes will be lost.\n </p>\n </Modal>\n ) : null}\n\n {confirmResetColumns ? (\n <Modal\n open\n onClose={() => setConfirmResetColumns(false)}\n title=\"Reset columns from latest sample?\"\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setConfirmResetColumns(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={resetState.disabled}\n onClick={resetColumns}\n >\n Reset columns\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Replace {fields.configuredCount} configured column\n {fields.configuredCount === 1 ? \"\" : \"s\"} with{\" \"}\n {sampledColumns.length} column\n {sampledColumns.length === 1 ? \"\" : \"s\"} from the latest sample.\n Custom labels, expressions, formatting, filtering, ordering, and\n manually added columns will be removed. The profile will remain\n unsaved until you save it.\n </p>\n </Modal>\n ) : null}\n\n {replaceTarget ? (\n <Modal\n open\n onClose={() => setReplaceTarget(\"\")}\n title={`Replace ${replaceTarget}?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setReplaceTarget(\"\")}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={saving}\n onClick={() => {\n setReplaceTarget(\"\");\n void save(true);\n }}\n >\n Replace profile\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n A profile named {replaceTarget} already exists. Its definition will\n be overwritten, the current profile will be renamed, and dependent\n imports will be updated atomically.\n </p>\n </Modal>\n ) : null}\n </JsonPathProfileProvider>\n );\n}\n\nfunction sectionLabel(section: ProfileEditorSection): string {\n return profileEditorSections.find((entry) => entry.id === section)!.label;\n}\n"],"mappings":"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"}
|
|
@@ -133,7 +133,7 @@ function ProfileEditor({ client, action, surfaceKey, initialValue, onClose, onSu
|
|
|
133
133
|
setConfirmResetColumns(false);
|
|
134
134
|
};
|
|
135
135
|
const sectionContent = /* @__PURE__ */ jsxs("div", {
|
|
136
|
-
className: "h-full overflow-auto p-5",
|
|
136
|
+
className: "@container h-full overflow-auto p-5",
|
|
137
137
|
children: [
|
|
138
138
|
section === "general" ? /* @__PURE__ */ jsxs("div", {
|
|
139
139
|
className: "space-y-4",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileEditor.js","names":[],"sources":["../../../src/profiles/editor/profileEditor.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { Workspace } from \"../../layout/Workspace\";\nimport type { WorkspacePaneSpec } from \"../../layout/Workspace\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { useOperationLookupFetcher } from \"../../rpc/operationLookupFetcher\";\nimport type { ResolvedOperation } from \"../../rpc/types\";\nimport type { OperationsApiClient } from \"../../rpc/useOperations\";\nimport { UiListTree, UiTable } from \"../../icons\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n cloneProfileDraft,\n mergeSampledProfileColumns,\n profileColumnResetState,\n profileEditorSectionStatus,\n profileEditorSections,\n profileGeneralOptionKeys,\n profileSampleSignature,\n profileUpdateConflictTarget,\n resetProfileColumns,\n validateProfileEditorDraft,\n type ProfileEditorSection,\n} from \"./profileEditorModel\";\nimport { ProfileEditorPreview } from \"./profileEditorPreview\";\nimport { ProfileEditorRail } from \"./profileEditorRail\";\nimport {\n ProfileGeneralSection,\n ProfileSchemaSection,\n ProfileSourceSection,\n} from \"./profileEditorSections\";\nimport { ProfileFieldSidebarList } from \"../fields/profileFieldList\";\nimport {\n ProfileFieldEditorForm,\n profileFieldEditorEmptyMessage,\n} from \"../fields/profileFieldEditor\";\nimport { useProfileFieldState } from \"../fields/profileFieldState\";\nimport type { ProfileSample } from \"../wizard/profileWizardQueryStep\";\nimport { JsonPathProfileProvider } from \"../query/jsonPathSampleRow\";\nimport type {\n ProfileColumn,\n ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\nimport { resolveProfileUpdatePath } from \"./profileEditorRoutes\";\nimport {\n ProfileParameterDetail,\n ProfileParameterSidebar,\n} from \"./profileParameterEditor\";\nimport { ProcessorPipeline } from \"../processor/processorPipeline\";\nimport type {\n ProcessorPreset,\n ProcessorSpec,\n} from \"../processor/processorConfig\";\nimport { profileSchema } from \"../profileApi\";\n\nconst ProfileEditorRaw = lazy(() =>\n import(\"./profileEditorRaw\").then((module) => ({\n default: module.ProfileEditorRaw,\n })),\n);\n\n/**\n * The profile editor as a route rather than a dialog.\n *\n * Six sections, ~130 discoverable fields and a CEL editor per column outgrew a\n * modal: the layout is a clicky-ui Workspace, so the section rail, the column\n * grid and the sampled preview are panes the user can resize, collapse and keep\n * across visits. Collection fields stay in the rail while the selected item is\n * edited in the center, keeping names and icons visible throughout the edit.\n */\nexport function ProfileEditor({\n client,\n action,\n surfaceKey,\n initialValue,\n onClose,\n onSuccess,\n}: {\n client: OperationsApiClient;\n action: ResolvedOperation;\n surfaceKey: string;\n initialValue: Record<string, unknown>;\n onClose: () => void;\n onSuccess: (name: string) => void | Promise<void>;\n}) {\n const lookupFetcher = useOperationLookupFetcher(client);\n const initialDraft = useMemo(\n () => cloneProfileDraft(initialValue),\n [initialValue],\n );\n const initialSerialized = useMemo(\n () => JSON.stringify(initialDraft),\n [initialDraft],\n );\n const [draft, setDraft] = useState<ProfileWizardDraft>(initialDraft);\n const [section, setSection] = useState<ProfileEditorSection>(\"general\");\n const [discovered, setDiscovered] = useState<ProfileColumn[]>(\n initialDraft.columns ?? [],\n );\n const [sampledColumns, setSampledColumns] = useState<ProfileColumn[]>([]);\n const [sampleRows, setSampleRows] = useState<Record<string, unknown>[]>([]);\n const [activeField, setActiveField] = useState(\n initialDraft.columns?.[0]?.name ?? \"\",\n );\n const [activeParameter, setActiveParameter] = useState(0);\n const [activeProcessor, setActiveProcessor] = useState(0);\n const [lastSampleSignature, setLastSampleSignature] = useState(() =>\n profileSampleSignature(initialDraft),\n );\n const [rawValid, setRawValid] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const [replaceTarget, setReplaceTarget] = useState(\"\");\n const [confirmDiscard, setConfirmDiscard] = useState(false);\n const [confirmResetColumns, setConfirmResetColumns] = useState(false);\n const dirty = JSON.stringify(draft) !== initialSerialized;\n const validationError = validateProfileEditorDraft(draft);\n const sampleStale = profileSampleSignature(draft) !== lastSampleSignature;\n const resetState = profileColumnResetState({\n providerType: draft.provider?.type ?? \"\",\n sampledColumnCount: sampledColumns.length,\n sampleStale,\n });\n\n const fields = useProfileFieldState({\n discovered,\n configured: draft.columns ?? [],\n activeName: activeField,\n onConfiguredChange: (columns) =>\n setDraft((current) => ({ ...current, columns })),\n onActiveNameChange: setActiveField,\n });\n const processors = Array.isArray(draft.processors)\n ? (draft.processors as ProcessorSpec[])\n : [];\n const processorPresets = useMemo(() => {\n const processorSchema = profileSchema().properties?.processors;\n return (\n (processorSchema?.[\"x-clicky-presets\"] as\n | Record<string, ProcessorPreset>\n | undefined) ?? {}\n );\n }, []);\n const setProcessors = useCallback(\n (next: ProcessorSpec[]) =>\n setDraft((current) => ({ ...current, processors: next })),\n [],\n );\n\n // A route can be refreshed or navigated away from; the dialog used to guard\n // unsaved edits with confirmClose, so the route has to guard them too.\n useEffect(() => {\n if (!dirty) return;\n const warn = (event: BeforeUnloadEvent) => event.preventDefault();\n window.addEventListener(\"beforeunload\", warn);\n return () => window.removeEventListener(\"beforeunload\", warn);\n }, [dirty]);\n\n const save = async (replaceExisting = false) => {\n if (validationError) {\n setError(validationError);\n return;\n }\n if (!client.submitForm) {\n setError(\"Profile updates are unavailable\");\n return;\n }\n setSaving(true);\n setError(\"\");\n try {\n const body = {\n ...draft,\n id: surfaceKey,\n ...(replaceExisting ? { replaceExisting: true } : {}),\n };\n const response = await client.submitForm(\n resolveProfileUpdatePath(action.path, surfaceKey),\n action.method,\n body,\n );\n if (!response.success) {\n const message =\n response.error || response.message || \"Profile update failed\";\n const target = profileUpdateConflictTarget(message);\n if (target && !replaceExisting) {\n setReplaceTarget(target);\n return;\n }\n throw new Error(message);\n }\n await onSuccess(draft.profile!.trim());\n } catch (saveError) {\n setError(\n saveError instanceof Error\n ? saveError.message\n : \"Profile update failed\",\n );\n } finally {\n setSaving(false);\n }\n };\n\n const acceptSample = ({ columns, rows, sourceDraft }: ProfileSample) => {\n setSampledColumns(structuredClone(columns));\n setDiscovered(columns);\n setSampleRows(rows);\n setDraft((current) => ({\n ...current,\n columns: mergeSampledProfileColumns(current.columns ?? [], columns),\n }));\n setActiveField((current) => current || columns[0]?.name || \"\");\n setLastSampleSignature(profileSampleSignature(sourceDraft));\n };\n\n const resetColumns = () => {\n const first = sampledColumns[0];\n if (!first) throw new Error(\"cannot reset columns without a sample\");\n setDraft((current) => resetProfileColumns(current, sampledColumns));\n setActiveField(first.name);\n setConfirmResetColumns(false);\n };\n\n const sectionContent = (\n <div className=\"h-full overflow-auto p-5\">\n {section === \"general\" ? (\n <div className=\"space-y-4\">\n <ProfileGeneralSection draft={draft} onChange={setDraft} />\n <ProfileSchemaSection\n draft={draft}\n keys={profileGeneralOptionKeys}\n title=\"General options\"\n description=\"Compose profiles with imports and aliases, choose the output fields, and ignore values that should not be retained.\"\n idPrefix=\"profile-general-options\"\n {...(lookupFetcher ? { lookupFetcher } : {})}\n onChange={setDraft}\n />\n </div>\n ) : null}\n {section === \"source\" ? (\n <ProfileSourceSection\n draft={draft}\n discovered={discovered}\n sampleStale={sampleStale}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n onChange={setDraft}\n onSample={acceptSample}\n />\n ) : null}\n {section === \"columns\" ? (\n fields.activeField ? (\n <section className=\"rounded-xl border bg-card p-5\">\n <div className=\"max-w-6xl\">\n <ProfileFieldEditorForm\n field={fields.activeField}\n onChange={fields.updateActiveField}\n />\n </div>\n </section>\n ) : (\n <div className=\"grid h-full place-items-center text-sm text-muted-foreground\">\n {profileFieldEditorEmptyMessage}\n </div>\n )\n ) : null}\n {section === \"parameters\" ? (\n <ProfileParameterDetail\n draft={draft}\n activeIndex={activeParameter}\n onChange={setDraft}\n />\n ) : null}\n {section === \"processors\" ? (\n <div className=\"max-w-5xl\">\n <ProcessorPipeline\n steps={processors}\n presets={processorPresets}\n profile={draft}\n selectedIndex={activeProcessor}\n showSteps={false}\n onSelectedIndexChange={setActiveProcessor}\n onChange={setProcessors}\n />\n </div>\n ) : null}\n {section === \"raw\" ? (\n <Suspense\n fallback={\n <p className=\"text-sm text-muted-foreground\">\n Loading YAML editor…\n </p>\n }\n >\n <ProfileEditorRaw\n draft={draft}\n onChange={setDraft}\n onValidityChange={setRawValid}\n />\n </Suspense>\n ) : null}\n </div>\n );\n\n const panes = useMemo<WorkspacePaneSpec[]>(() => {\n const rail: WorkspacePaneSpec = {\n id: \"sections\",\n label: \"Profile\",\n icon: <UiListTree />,\n location: \"left\",\n width: 340,\n minWidth: 280,\n maxWidth: 480,\n content: (\n <ProfileEditorRail\n value={section}\n status={profileEditorSectionStatus({\n draft,\n availableColumns: fields.available.length,\n sampleStale,\n })}\n collections={{\n columns: (\n <ProfileFieldSidebarList\n state={fields}\n onFieldSelect={(name) => {\n fields.setActiveName(name);\n setSection(\"columns\");\n }}\n onAdd={() => setSection(\"columns\")}\n {...(resetState.visible\n ? {\n reset: {\n disabled: resetState.disabled,\n title: resetState.title,\n onReset: () => setConfirmResetColumns(true),\n },\n }\n : {})}\n />\n ),\n parameters: (\n <ProfileParameterSidebar\n draft={draft}\n activeIndex={activeParameter}\n onActiveIndexChange={(index) => {\n setActiveParameter(index);\n setSection(\"parameters\");\n }}\n onChange={setDraft}\n />\n ),\n processors: (\n <ProcessorPipeline\n steps={processors}\n presets={processorPresets}\n profile={draft}\n selectedIndex={activeProcessor}\n showEditor={false}\n tree\n onSelectedIndexChange={(index) => {\n setActiveProcessor(index);\n setSection(\"processors\");\n }}\n onChange={setProcessors}\n />\n ),\n }}\n onChange={setSection}\n />\n ),\n };\n\n const result: WorkspacePaneSpec[] = [\n rail,\n {\n id: \"section\",\n label: sectionLabel(section),\n location: \"center\",\n collapsible: false,\n showHeader: false,\n contentClassName: \"p-0\",\n content: sectionContent,\n },\n ];\n if (section === \"columns\") {\n result.push({\n id: \"preview\",\n label: \"Preview\",\n icon: <UiTable />,\n location: \"bottom\",\n height: 220,\n minHeight: 120,\n maxHeight: 520,\n slots: {\n headerTrailing: (\n <span className=\"text-[11px] text-muted-foreground\">\n {sampleRows.length\n ? `${sampleRows.length} sampled rows · updates as you edit`\n : \"No sample yet\"}\n </span>\n ),\n },\n content: (\n <ProfileEditorPreview\n columns={draft.columns ?? []}\n rows={sampleRows}\n />\n ),\n });\n }\n return result;\n }, [\n activeParameter,\n activeProcessor,\n draft,\n fields,\n resetState,\n sampleRows,\n sampleStale,\n section,\n sectionContent,\n processorPresets,\n processors,\n setProcessors,\n ]);\n\n const leave = () => (dirty ? setConfirmDiscard(true) : onClose());\n\n return (\n <JsonPathProfileProvider profile={draft}>\n <div className=\"grid h-full min-h-0 grid-rows-[auto_minmax(0,1fr)] bg-background\">\n <header className=\"flex items-center gap-3 border-b border-border px-4 py-2.5\">\n <nav className=\"flex min-w-0 items-center gap-1.5 text-sm text-muted-foreground\">\n <button\n type=\"button\"\n className=\"hover:text-foreground\"\n onClick={leave}\n >\n Profiles\n </button>\n <span>/</span>\n <button\n type=\"button\"\n className=\"min-w-0 truncate hover:text-foreground\"\n onClick={leave}\n >\n {initialDraft.profile ?? surfaceKey}\n </button>\n <span>/</span>\n <span className=\"font-medium text-foreground\">Edit</span>\n </nav>\n {error ? (\n <span className=\"truncate text-sm text-destructive\">{error}</span>\n ) : null}\n <span className=\"ml-auto shrink-0 text-xs text-muted-foreground\">\n {dirty ? \"Unsaved changes\" : \"No changes\"}\n </span>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={leave}>\n Discard\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={\n saving ||\n Boolean(validationError) ||\n (section === \"raw\" && !rawValid)\n }\n title={validationError ?? undefined}\n onClick={() => void save()}\n >\n {saving ? \"Saving…\" : \"Save profile\"}\n </Button>\n </header>\n\n <Workspace panes={panes} storageKey=\"profile-editor-v2\" />\n </div>\n\n {confirmDiscard ? (\n <Modal\n open\n onClose={() => setConfirmDiscard(false)}\n title=\"Discard profile changes?\"\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setConfirmDiscard(false)}\n >\n Keep editing\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={onClose}>\n Discard changes\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Your unsaved profile changes will be lost.\n </p>\n </Modal>\n ) : null}\n\n {confirmResetColumns ? (\n <Modal\n open\n onClose={() => setConfirmResetColumns(false)}\n title=\"Reset columns from latest sample?\"\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setConfirmResetColumns(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={resetState.disabled}\n onClick={resetColumns}\n >\n Reset columns\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Replace {fields.configuredCount} configured column\n {fields.configuredCount === 1 ? \"\" : \"s\"} with{\" \"}\n {sampledColumns.length} column\n {sampledColumns.length === 1 ? \"\" : \"s\"} from the latest sample.\n Custom labels, expressions, formatting, filtering, ordering, and\n manually added columns will be removed. The profile will remain\n unsaved until you save it.\n </p>\n </Modal>\n ) : null}\n\n {replaceTarget ? (\n <Modal\n open\n onClose={() => setReplaceTarget(\"\")}\n title={`Replace ${replaceTarget}?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setReplaceTarget(\"\")}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={saving}\n onClick={() => {\n setReplaceTarget(\"\");\n void save(true);\n }}\n >\n Replace profile\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n A profile named {replaceTarget} already exists. Its definition will\n be overwritten, the current profile will be renamed, and dependent\n imports will be updated atomically.\n </p>\n </Modal>\n ) : null}\n </JsonPathProfileProvider>\n );\n}\n\nfunction sectionLabel(section: ProfileEditorSection): string {\n return profileEditorSections.find((entry) => entry.id === section)!.label;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4DA,IAAM,mBAAmB,WACvB,OAAO,wBAAqB,CAAC,MAAM,YAAY,EAC7C,SAAS,OAAO,iBAClB,EAAE,CACJ;;;;;;;;;;AAWA,SAAgB,cAAc,EAC5B,QACA,QACA,YACA,cACA,SACA,aAQC;CACD,MAAM,gBAAgB,0BAA0B,MAAM;CACtD,MAAM,eAAe,cACb,kBAAkB,YAAY,GACpC,CAAC,YAAY,CACf;CACA,MAAM,oBAAoB,cAClB,KAAK,UAAU,YAAY,GACjC,CAAC,YAAY,CACf;CACA,MAAM,CAAC,OAAO,YAAY,SAA6B,YAAY;CACnE,MAAM,CAAC,SAAS,cAAc,SAA+B,SAAS;CACtE,MAAM,CAAC,YAAY,iBAAiB,SAClC,aAAa,WAAW,CAAC,CAC3B;CACA,MAAM,CAAC,gBAAgB,qBAAqB,SAA0B,CAAC,CAAC;CACxE,MAAM,CAAC,YAAY,iBAAiB,SAAoC,CAAC,CAAC;CAC1E,MAAM,CAAC,aAAa,kBAAkB,SACpC,aAAa,UAAU,EAAE,EAAE,QAAQ,EACrC;CACA,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,CAAC;CACxD,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,CAAC;CACxD,MAAM,CAAC,qBAAqB,0BAA0B,eACpD,uBAAuB,YAAY,CACrC;CACA,MAAM,CAAC,UAAU,eAAe,SAAS,IAAI;CAC7C,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,eAAe,oBAAoB,SAAS,EAAE;CACrD,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK;CAC1D,MAAM,CAAC,qBAAqB,0BAA0B,SAAS,KAAK;CACpE,MAAM,QAAQ,KAAK,UAAU,KAAK,MAAM;CACxC,MAAM,kBAAkB,2BAA2B,KAAK;CACxD,MAAM,cAAc,uBAAuB,KAAK,MAAM;CACtD,MAAM,aAAa,wBAAwB;EACzC,cAAc,MAAM,UAAU,QAAQ;EACtC,oBAAoB,eAAe;EACnC;CACF,CAAC;CAED,MAAM,SAAS,qBAAqB;EAClC;EACA,YAAY,MAAM,WAAW,CAAC;EAC9B,YAAY;EACZ,qBAAqB,YACnB,UAAU,aAAa;GAAE,GAAG;GAAS;EAAQ,EAAE;EACjD,oBAAoB;CACtB,CAAC;CACD,MAAM,aAAa,MAAM,QAAQ,MAAM,UAAU,IAC5C,MAAM,aACP,CAAC;CACL,MAAM,mBAAmB,cAAc;EAErC,QADwB,cAAc,CAAC,CAAC,YAAY,WAAA,GAE/B,uBAED,CAAC;CAEvB,GAAG,CAAC,CAAC;CACL,MAAM,gBAAgB,aACnB,SACC,UAAU,aAAa;EAAE,GAAG;EAAS,YAAY;CAAK,EAAE,GAC1D,CAAC,CACH;CAIA,gBAAgB;EACd,IAAI,CAAC,OAAO;EACZ,MAAM,QAAQ,UAA6B,MAAM,eAAe;EAChE,OAAO,iBAAiB,gBAAgB,IAAI;EAC5C,aAAa,OAAO,oBAAoB,gBAAgB,IAAI;CAC9D,GAAG,CAAC,KAAK,CAAC;CAEV,MAAM,OAAO,OAAO,kBAAkB,UAAU;EAC9C,IAAI,iBAAiB;GACnB,SAAS,eAAe;GACxB;EACF;EACA,IAAI,CAAC,OAAO,YAAY;GACtB,SAAS,iCAAiC;GAC1C;EACF;EACA,UAAU,IAAI;EACd,SAAS,EAAE;EACX,IAAI;GACF,MAAM,OAAO;IACX,GAAG;IACH,IAAI;IACJ,GAAI,kBAAkB,EAAE,iBAAiB,KAAK,IAAI,CAAC;GACrD;GACA,MAAM,WAAW,MAAM,OAAO,WAC5B,yBAAyB,OAAO,MAAM,UAAU,GAChD,OAAO,QACP,IACF;GACA,IAAI,CAAC,SAAS,SAAS;IACrB,MAAM,UACJ,SAAS,SAAS,SAAS,WAAW;IACxC,MAAM,SAAS,4BAA4B,OAAO;IAClD,IAAI,UAAU,CAAC,iBAAiB;KAC9B,iBAAiB,MAAM;KACvB;IACF;IACA,MAAM,IAAI,MAAM,OAAO;GACzB;GACA,MAAM,UAAU,MAAM,QAAS,KAAK,CAAC;EACvC,SAAS,WAAW;GAClB,SACE,qBAAqB,QACjB,UAAU,UACV,uBACN;EACF,UAAU;GACR,UAAU,KAAK;EACjB;CACF;CAEA,MAAM,gBAAgB,EAAE,SAAS,MAAM,kBAAiC;EACtE,kBAAkB,gBAAgB,OAAO,CAAC;EAC1C,cAAc,OAAO;EACrB,cAAc,IAAI;EAClB,UAAU,aAAa;GACrB,GAAG;GACH,SAAS,2BAA2B,QAAQ,WAAW,CAAC,GAAG,OAAO;EACpE,EAAE;EACF,gBAAgB,YAAY,WAAW,QAAQ,EAAE,EAAE,QAAQ,EAAE;EAC7D,uBAAuB,uBAAuB,WAAW,CAAC;CAC5D;CAEA,MAAM,qBAAqB;EACzB,MAAM,QAAQ,eAAe;EAC7B,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,uCAAuC;EACnE,UAAU,YAAY,oBAAoB,SAAS,cAAc,CAAC;EAClE,eAAe,MAAM,IAAI;EACzB,uBAAuB,KAAK;CAC9B;CAEA,MAAM,iBACJ,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG,YAAY,YACX,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,uBAAD;KAA8B;KAAO,UAAU;IAAW,CAAA,GAC1D,oBAAC,sBAAD;KACS;KACP,MAAM;KACN,OAAM;KACN,aAAY;KACZ,UAAS;KACT,GAAK,gBAAgB,EAAE,cAAc,IAAI,CAAC;KAC1C,UAAU;IACX,CAAA,CACE;GACH,CAAA,IAAA;GACH,YAAY,WACX,oBAAC,sBAAD;IACS;IACK;IACC;IACb,GAAK,gBAAgB,EAAE,cAAc,IAAI,CAAC;IAC1C,UAAU;IACV,UAAU;GACX,CAAA,IACC;GACH,YAAY,YACX,OAAO,cACL,oBAAC,WAAD;IAAS,WAAU;IACjB,UAAA,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,wBAAD;MACE,OAAO,OAAO;MACd,UAAU,OAAO;KAClB,CAAA;IACE,CAAA;GACE,CAAA,IAET,oBAAC,OAAD;IAAK,WAAU;IACZ,UAAA;GACE,CAAA,IAEL;GACH,YAAY,eACX,oBAAC,wBAAD;IACS;IACP,aAAa;IACb,UAAU;GACX,CAAA,IACC;GACH,YAAY,eACX,oBAAC,OAAD;IAAK,WAAU;IACb,UAAA,oBAAC,mBAAD;KACE,OAAO;KACP,SAAS;KACT,SAAS;KACT,eAAe;KACf,WAAW;KACX,uBAAuB;KACvB,UAAU;IACX,CAAA;GACE,CAAA,IACH;GACH,YAAY,QACX,oBAAC,UAAD;IACE,UACE,oBAAC,KAAD;KAAG,WAAU;KAAgC,UAAA;IAE1C,CAAA;IAGL,UAAA,oBAAC,kBAAD;KACS;KACP,UAAU;KACV,kBAAkB;IACnB,CAAA;GACO,CAAA,IACR;EACD;;CAGP,MAAM,QAAQ,cAAmC;EAqE/C,MAAM,SAA8B,CAClC;GApEA,IAAI;GACJ,OAAO;GACP,MAAM,oBAAC,YAAD,CAAa,CAAA;GACnB,UAAU;GACV,OAAO;GACP,UAAU;GACV,UAAU;GACV,SACE,oBAAC,mBAAD;IACE,OAAO;IACP,QAAQ,2BAA2B;KACjC;KACA,kBAAkB,OAAO,UAAU;KACnC;IACF,CAAC;IACD,aAAa;KACX,SACE,oBAAC,yBAAD;MACE,OAAO;MACP,gBAAgB,SAAS;OACvB,OAAO,cAAc,IAAI;OACzB,WAAW,SAAS;MACtB;MACA,aAAa,WAAW,SAAS;MACjC,GAAK,WAAW,UACZ,EACE,OAAO;OACL,UAAU,WAAW;OACrB,OAAO,WAAW;OAClB,eAAe,uBAAuB,IAAI;MAC5C,EACF,IACA,CAAC;KACN,CAAA;KAEH,YACE,oBAAC,yBAAD;MACS;MACP,aAAa;MACb,sBAAsB,UAAU;OAC9B,mBAAmB,KAAK;OACxB,WAAW,YAAY;MACzB;MACA,UAAU;KACX,CAAA;KAEH,YACE,oBAAC,mBAAD;MACE,OAAO;MACP,SAAS;MACT,SAAS;MACT,eAAe;MACf,YAAY;MACZ,MAAA;MACA,wBAAwB,UAAU;OAChC,mBAAmB,KAAK;OACxB,WAAW,YAAY;MACzB;MACA,UAAU;KACX,CAAA;IAEL;IACA,UAAU;GACX,CAAA;EAKH,GACA;GACE,IAAI;GACJ,OAAO,aAAa,OAAO;GAC3B,UAAU;GACV,aAAa;GACb,YAAY;GACZ,kBAAkB;GAClB,SAAS;EACX,CACF;EACA,IAAI,YAAY,WACd,OAAO,KAAK;GACV,IAAI;GACJ,OAAO;GACP,MAAM,oBAAC,SAAD,CAAU,CAAA;GAChB,UAAU;GACV,QAAQ;GACR,WAAW;GACX,WAAW;GACX,OAAO,EACL,gBACE,oBAAC,QAAD;IAAM,WAAU;IACb,UAAA,WAAW,SACR,GAAG,WAAW,OAAO,uCACrB;GACA,CAAA,EAEV;GACA,SACE,oBAAC,sBAAD;IACE,SAAS,MAAM,WAAW,CAAC;IAC3B,MAAM;GACP,CAAA;EAEL,CAAC;EAEH,OAAO;CACT,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,cAAe,QAAQ,kBAAkB,IAAI,IAAI,QAAQ;CAE/D,OACE,qBAAC,yBAAD;EAAyB,SAAS;EAAlC,UAAA;GACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,UAAD;KAAQ,WAAU;KAAlB,UAAA;MACE,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACE,oBAAC,UAAD;SACE,MAAK;SACL,WAAU;SACV,SAAS;SACV,UAAA;QAEO,CAAA;QACR,oBAAC,QAAD,EAAA,UAAM,IAAO,CAAA;QACb,oBAAC,UAAD;SACE,MAAK;SACL,WAAU;SACV,SAAS;SAER,UAAA,aAAa,WAAW;QACnB,CAAA;QACR,oBAAC,QAAD,EAAA,UAAM,IAAO,CAAA;QACb,oBAAC,QAAD;SAAM,WAAU;SAA8B,UAAA;QAAU,CAAA;OACrD;;MACJ,QACC,oBAAC,QAAD;OAAM,WAAU;OAAqC,UAAA;MAAY,CAAA,IAC/D;MACJ,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA,QAAQ,oBAAoB;MACzB,CAAA;MACN,oBAAC,QAAD;OAAQ,MAAK;OAAS,MAAK;OAAK,SAAQ;OAAQ,SAAS;OAAO,UAAA;MAExD,CAAA;MACR,oBAAC,QAAD;OACE,MAAK;OACL,MAAK;OACL,UACE,UACA,QAAQ,eAAe,KACtB,YAAY,SAAS,CAAC;OAEzB,OAAO,mBAAmB,KAAA;OAC1B,eAAe,KAAK,KAAK;OAExB,UAAA,SAAS,YAAY;MAChB,CAAA;KACF;IAER,CAAA,GAAA,oBAAC,WAAD;KAAkB;KAAO,YAAW;IAAqB,CAAA,CACtD;;GAEJ,iBACC,oBAAC,OAAD;IACE,MAAA;IACA,eAAe,kBAAkB,KAAK;IACtC,OAAM;IACN,MAAK;IACL,QACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,QAAD;MACE,MAAK;MACL,SAAQ;MACR,eAAe,kBAAkB,KAAK;MACvC,UAAA;KAEO,CAAA,GACR,oBAAC,QAAD;MAAQ,MAAK;MAAS,SAAQ;MAAc,SAAS;MAAS,UAAA;KAEtD,CAAA,CACL;;IAGP,UAAA,oBAAC,KAAD;KAAG,WAAU;KAAgC,UAAA;IAE1C,CAAA;GACE,CAAA,IACL;GAEH,sBACC,oBAAC,OAAD;IACE,MAAA;IACA,eAAe,uBAAuB,KAAK;IAC3C,OAAM;IACN,MAAK;IACL,QACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,QAAD;MACE,MAAK;MACL,SAAQ;MACR,eAAe,uBAAuB,KAAK;MAC5C,UAAA;KAEO,CAAA,GACR,oBAAC,QAAD;MACE,MAAK;MACL,SAAQ;MACR,UAAU,WAAW;MACrB,SAAS;MACV,UAAA;KAEO,CAAA,CACL;;IAGP,UAAA,qBAAC,KAAD;KAAG,WAAU;KAAb,UAAA;MAA6C;MAClC,OAAO;MAAgB;MAC/B,OAAO,oBAAoB,IAAI,KAAK;MAAI;MAAM;MAC9C,eAAe;MAAO;MACtB,eAAe,WAAW,IAAI,KAAK;MAAI;KAIvC;;GACE,CAAA,IACL;GAEH,gBACC,oBAAC,OAAD;IACE,MAAA;IACA,eAAe,iBAAiB,EAAE;IAClC,OAAO,WAAW,cAAc;IAChC,MAAK;IACL,QACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,QAAD;MACE,MAAK;MACL,SAAQ;MACR,eAAe,iBAAiB,EAAE;MACnC,UAAA;KAEO,CAAA,GACR,oBAAC,QAAD;MACE,MAAK;MACL,SAAQ;MACR,UAAU;MACV,eAAe;OACb,iBAAiB,EAAE;OACnB,KAAU,IAAI;MAChB;MACD,UAAA;KAEO,CAAA,CACL;;IAGP,UAAA,qBAAC,KAAD;KAAG,WAAU;KAAb,UAAA;MAA6C;MAC1B;MAAc;KAG9B;;GACE,CAAA,IACL;EACmB;;AAE7B;AAEA,SAAS,aAAa,SAAuC;CAC3D,OAAO,sBAAsB,MAAM,UAAU,MAAM,OAAO,OAAO,CAAC,CAAE;AACtE"}
|
|
1
|
+
{"version":3,"file":"profileEditor.js","names":[],"sources":["../../../src/profiles/editor/profileEditor.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { Workspace } from \"../../layout/Workspace\";\nimport type { WorkspacePaneSpec } from \"../../layout/Workspace\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { useOperationLookupFetcher } from \"../../rpc/operationLookupFetcher\";\nimport type { ResolvedOperation } from \"../../rpc/types\";\nimport type { OperationsApiClient } from \"../../rpc/useOperations\";\nimport { UiListTree, UiTable } from \"../../icons\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n cloneProfileDraft,\n mergeSampledProfileColumns,\n profileColumnResetState,\n profileEditorSectionStatus,\n profileEditorSections,\n profileGeneralOptionKeys,\n profileSampleSignature,\n profileUpdateConflictTarget,\n resetProfileColumns,\n validateProfileEditorDraft,\n type ProfileEditorSection,\n} from \"./profileEditorModel\";\nimport { ProfileEditorPreview } from \"./profileEditorPreview\";\nimport { ProfileEditorRail } from \"./profileEditorRail\";\nimport {\n ProfileGeneralSection,\n ProfileSchemaSection,\n ProfileSourceSection,\n} from \"./profileEditorSections\";\nimport { ProfileFieldSidebarList } from \"../fields/profileFieldList\";\nimport {\n ProfileFieldEditorForm,\n profileFieldEditorEmptyMessage,\n} from \"../fields/profileFieldEditor\";\nimport { useProfileFieldState } from \"../fields/profileFieldState\";\nimport type { ProfileSample } from \"../wizard/profileWizardQueryStep\";\nimport { JsonPathProfileProvider } from \"../query/jsonPathSampleRow\";\nimport type {\n ProfileColumn,\n ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\nimport { resolveProfileUpdatePath } from \"./profileEditorRoutes\";\nimport {\n ProfileParameterDetail,\n ProfileParameterSidebar,\n} from \"./profileParameterEditor\";\nimport { ProcessorPipeline } from \"../processor/processorPipeline\";\nimport type {\n ProcessorPreset,\n ProcessorSpec,\n} from \"../processor/processorConfig\";\nimport { profileSchema } from \"../profileApi\";\n\nconst ProfileEditorRaw = lazy(() =>\n import(\"./profileEditorRaw\").then((module) => ({\n default: module.ProfileEditorRaw,\n })),\n);\n\n/**\n * The profile editor as a route rather than a dialog.\n *\n * Six sections, ~130 discoverable fields and a CEL editor per column outgrew a\n * modal: the layout is a clicky-ui Workspace, so the section rail, the column\n * grid and the sampled preview are panes the user can resize, collapse and keep\n * across visits. Collection fields stay in the rail while the selected item is\n * edited in the center, keeping names and icons visible throughout the edit.\n */\nexport function ProfileEditor({\n client,\n action,\n surfaceKey,\n initialValue,\n onClose,\n onSuccess,\n}: {\n client: OperationsApiClient;\n action: ResolvedOperation;\n surfaceKey: string;\n initialValue: Record<string, unknown>;\n onClose: () => void;\n onSuccess: (name: string) => void | Promise<void>;\n}) {\n const lookupFetcher = useOperationLookupFetcher(client);\n const initialDraft = useMemo(\n () => cloneProfileDraft(initialValue),\n [initialValue],\n );\n const initialSerialized = useMemo(\n () => JSON.stringify(initialDraft),\n [initialDraft],\n );\n const [draft, setDraft] = useState<ProfileWizardDraft>(initialDraft);\n const [section, setSection] = useState<ProfileEditorSection>(\"general\");\n const [discovered, setDiscovered] = useState<ProfileColumn[]>(\n initialDraft.columns ?? [],\n );\n const [sampledColumns, setSampledColumns] = useState<ProfileColumn[]>([]);\n const [sampleRows, setSampleRows] = useState<Record<string, unknown>[]>([]);\n const [activeField, setActiveField] = useState(\n initialDraft.columns?.[0]?.name ?? \"\",\n );\n const [activeParameter, setActiveParameter] = useState(0);\n const [activeProcessor, setActiveProcessor] = useState(0);\n const [lastSampleSignature, setLastSampleSignature] = useState(() =>\n profileSampleSignature(initialDraft),\n );\n const [rawValid, setRawValid] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const [replaceTarget, setReplaceTarget] = useState(\"\");\n const [confirmDiscard, setConfirmDiscard] = useState(false);\n const [confirmResetColumns, setConfirmResetColumns] = useState(false);\n const dirty = JSON.stringify(draft) !== initialSerialized;\n const validationError = validateProfileEditorDraft(draft);\n const sampleStale = profileSampleSignature(draft) !== lastSampleSignature;\n const resetState = profileColumnResetState({\n providerType: draft.provider?.type ?? \"\",\n sampledColumnCount: sampledColumns.length,\n sampleStale,\n });\n\n const fields = useProfileFieldState({\n discovered,\n configured: draft.columns ?? [],\n activeName: activeField,\n onConfiguredChange: (columns) =>\n setDraft((current) => ({ ...current, columns })),\n onActiveNameChange: setActiveField,\n });\n const processors = Array.isArray(draft.processors)\n ? (draft.processors as ProcessorSpec[])\n : [];\n const processorPresets = useMemo(() => {\n const processorSchema = profileSchema().properties?.processors;\n return (\n (processorSchema?.[\"x-clicky-presets\"] as\n | Record<string, ProcessorPreset>\n | undefined) ?? {}\n );\n }, []);\n const setProcessors = useCallback(\n (next: ProcessorSpec[]) =>\n setDraft((current) => ({ ...current, processors: next })),\n [],\n );\n\n // A route can be refreshed or navigated away from; the dialog used to guard\n // unsaved edits with confirmClose, so the route has to guard them too.\n useEffect(() => {\n if (!dirty) return;\n const warn = (event: BeforeUnloadEvent) => event.preventDefault();\n window.addEventListener(\"beforeunload\", warn);\n return () => window.removeEventListener(\"beforeunload\", warn);\n }, [dirty]);\n\n const save = async (replaceExisting = false) => {\n if (validationError) {\n setError(validationError);\n return;\n }\n if (!client.submitForm) {\n setError(\"Profile updates are unavailable\");\n return;\n }\n setSaving(true);\n setError(\"\");\n try {\n const body = {\n ...draft,\n id: surfaceKey,\n ...(replaceExisting ? { replaceExisting: true } : {}),\n };\n const response = await client.submitForm(\n resolveProfileUpdatePath(action.path, surfaceKey),\n action.method,\n body,\n );\n if (!response.success) {\n const message =\n response.error || response.message || \"Profile update failed\";\n const target = profileUpdateConflictTarget(message);\n if (target && !replaceExisting) {\n setReplaceTarget(target);\n return;\n }\n throw new Error(message);\n }\n await onSuccess(draft.profile!.trim());\n } catch (saveError) {\n setError(\n saveError instanceof Error\n ? saveError.message\n : \"Profile update failed\",\n );\n } finally {\n setSaving(false);\n }\n };\n\n const acceptSample = ({ columns, rows, sourceDraft }: ProfileSample) => {\n setSampledColumns(structuredClone(columns));\n setDiscovered(columns);\n setSampleRows(rows);\n setDraft((current) => ({\n ...current,\n columns: mergeSampledProfileColumns(current.columns ?? [], columns),\n }));\n setActiveField((current) => current || columns[0]?.name || \"\");\n setLastSampleSignature(profileSampleSignature(sourceDraft));\n };\n\n const resetColumns = () => {\n const first = sampledColumns[0];\n if (!first) throw new Error(\"cannot reset columns without a sample\");\n setDraft((current) => resetProfileColumns(current, sampledColumns));\n setActiveField(first.name);\n setConfirmResetColumns(false);\n };\n\n const sectionContent = (\n <div className=\"@container h-full overflow-auto p-5\">\n {section === \"general\" ? (\n <div className=\"space-y-4\">\n <ProfileGeneralSection draft={draft} onChange={setDraft} />\n <ProfileSchemaSection\n draft={draft}\n keys={profileGeneralOptionKeys}\n title=\"General options\"\n description=\"Compose profiles with imports and aliases, choose the output fields, and ignore values that should not be retained.\"\n idPrefix=\"profile-general-options\"\n {...(lookupFetcher ? { lookupFetcher } : {})}\n onChange={setDraft}\n />\n </div>\n ) : null}\n {section === \"source\" ? (\n <ProfileSourceSection\n draft={draft}\n discovered={discovered}\n sampleStale={sampleStale}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n onChange={setDraft}\n onSample={acceptSample}\n />\n ) : null}\n {section === \"columns\" ? (\n fields.activeField ? (\n <section className=\"rounded-xl border bg-card p-5\">\n <div className=\"max-w-6xl\">\n <ProfileFieldEditorForm\n field={fields.activeField}\n onChange={fields.updateActiveField}\n />\n </div>\n </section>\n ) : (\n <div className=\"grid h-full place-items-center text-sm text-muted-foreground\">\n {profileFieldEditorEmptyMessage}\n </div>\n )\n ) : null}\n {section === \"parameters\" ? (\n <ProfileParameterDetail\n draft={draft}\n activeIndex={activeParameter}\n onChange={setDraft}\n />\n ) : null}\n {section === \"processors\" ? (\n <div className=\"max-w-5xl\">\n <ProcessorPipeline\n steps={processors}\n presets={processorPresets}\n profile={draft}\n selectedIndex={activeProcessor}\n showSteps={false}\n onSelectedIndexChange={setActiveProcessor}\n onChange={setProcessors}\n />\n </div>\n ) : null}\n {section === \"raw\" ? (\n <Suspense\n fallback={\n <p className=\"text-sm text-muted-foreground\">\n Loading YAML editor…\n </p>\n }\n >\n <ProfileEditorRaw\n draft={draft}\n onChange={setDraft}\n onValidityChange={setRawValid}\n />\n </Suspense>\n ) : null}\n </div>\n );\n\n const panes = useMemo<WorkspacePaneSpec[]>(() => {\n const rail: WorkspacePaneSpec = {\n id: \"sections\",\n label: \"Profile\",\n icon: <UiListTree />,\n location: \"left\",\n width: 340,\n minWidth: 280,\n maxWidth: 480,\n content: (\n <ProfileEditorRail\n value={section}\n status={profileEditorSectionStatus({\n draft,\n availableColumns: fields.available.length,\n sampleStale,\n })}\n collections={{\n columns: (\n <ProfileFieldSidebarList\n state={fields}\n onFieldSelect={(name) => {\n fields.setActiveName(name);\n setSection(\"columns\");\n }}\n onAdd={() => setSection(\"columns\")}\n {...(resetState.visible\n ? {\n reset: {\n disabled: resetState.disabled,\n title: resetState.title,\n onReset: () => setConfirmResetColumns(true),\n },\n }\n : {})}\n />\n ),\n parameters: (\n <ProfileParameterSidebar\n draft={draft}\n activeIndex={activeParameter}\n onActiveIndexChange={(index) => {\n setActiveParameter(index);\n setSection(\"parameters\");\n }}\n onChange={setDraft}\n />\n ),\n processors: (\n <ProcessorPipeline\n steps={processors}\n presets={processorPresets}\n profile={draft}\n selectedIndex={activeProcessor}\n showEditor={false}\n tree\n onSelectedIndexChange={(index) => {\n setActiveProcessor(index);\n setSection(\"processors\");\n }}\n onChange={setProcessors}\n />\n ),\n }}\n onChange={setSection}\n />\n ),\n };\n\n const result: WorkspacePaneSpec[] = [\n rail,\n {\n id: \"section\",\n label: sectionLabel(section),\n location: \"center\",\n collapsible: false,\n showHeader: false,\n contentClassName: \"p-0\",\n content: sectionContent,\n },\n ];\n if (section === \"columns\") {\n result.push({\n id: \"preview\",\n label: \"Preview\",\n icon: <UiTable />,\n location: \"bottom\",\n height: 220,\n minHeight: 120,\n maxHeight: 520,\n slots: {\n headerTrailing: (\n <span className=\"text-[11px] text-muted-foreground\">\n {sampleRows.length\n ? `${sampleRows.length} sampled rows · updates as you edit`\n : \"No sample yet\"}\n </span>\n ),\n },\n content: (\n <ProfileEditorPreview\n columns={draft.columns ?? []}\n rows={sampleRows}\n />\n ),\n });\n }\n return result;\n }, [\n activeParameter,\n activeProcessor,\n draft,\n fields,\n resetState,\n sampleRows,\n sampleStale,\n section,\n sectionContent,\n processorPresets,\n processors,\n setProcessors,\n ]);\n\n const leave = () => (dirty ? setConfirmDiscard(true) : onClose());\n\n return (\n <JsonPathProfileProvider profile={draft}>\n <div className=\"grid h-full min-h-0 grid-rows-[auto_minmax(0,1fr)] bg-background\">\n <header className=\"flex items-center gap-3 border-b border-border px-4 py-2.5\">\n <nav className=\"flex min-w-0 items-center gap-1.5 text-sm text-muted-foreground\">\n <button\n type=\"button\"\n className=\"hover:text-foreground\"\n onClick={leave}\n >\n Profiles\n </button>\n <span>/</span>\n <button\n type=\"button\"\n className=\"min-w-0 truncate hover:text-foreground\"\n onClick={leave}\n >\n {initialDraft.profile ?? surfaceKey}\n </button>\n <span>/</span>\n <span className=\"font-medium text-foreground\">Edit</span>\n </nav>\n {error ? (\n <span className=\"truncate text-sm text-destructive\">{error}</span>\n ) : null}\n <span className=\"ml-auto shrink-0 text-xs text-muted-foreground\">\n {dirty ? \"Unsaved changes\" : \"No changes\"}\n </span>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={leave}>\n Discard\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={\n saving ||\n Boolean(validationError) ||\n (section === \"raw\" && !rawValid)\n }\n title={validationError ?? undefined}\n onClick={() => void save()}\n >\n {saving ? \"Saving…\" : \"Save profile\"}\n </Button>\n </header>\n\n <Workspace panes={panes} storageKey=\"profile-editor-v2\" />\n </div>\n\n {confirmDiscard ? (\n <Modal\n open\n onClose={() => setConfirmDiscard(false)}\n title=\"Discard profile changes?\"\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setConfirmDiscard(false)}\n >\n Keep editing\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={onClose}>\n Discard changes\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Your unsaved profile changes will be lost.\n </p>\n </Modal>\n ) : null}\n\n {confirmResetColumns ? (\n <Modal\n open\n onClose={() => setConfirmResetColumns(false)}\n title=\"Reset columns from latest sample?\"\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setConfirmResetColumns(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={resetState.disabled}\n onClick={resetColumns}\n >\n Reset columns\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n Replace {fields.configuredCount} configured column\n {fields.configuredCount === 1 ? \"\" : \"s\"} with{\" \"}\n {sampledColumns.length} column\n {sampledColumns.length === 1 ? \"\" : \"s\"} from the latest sample.\n Custom labels, expressions, formatting, filtering, ordering, and\n manually added columns will be removed. The profile will remain\n unsaved until you save it.\n </p>\n </Modal>\n ) : null}\n\n {replaceTarget ? (\n <Modal\n open\n onClose={() => setReplaceTarget(\"\")}\n title={`Replace ${replaceTarget}?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setReplaceTarget(\"\")}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={saving}\n onClick={() => {\n setReplaceTarget(\"\");\n void save(true);\n }}\n >\n Replace profile\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n A profile named {replaceTarget} already exists. Its definition will\n be overwritten, the current profile will be renamed, and dependent\n imports will be updated atomically.\n </p>\n </Modal>\n ) : null}\n </JsonPathProfileProvider>\n );\n}\n\nfunction sectionLabel(section: ProfileEditorSection): string {\n return profileEditorSections.find((entry) => entry.id === section)!.label;\n}\n"],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ function ProfileGeneralSection({ draft, onChange }) {
|
|
|
12
12
|
title: "Profile identity",
|
|
13
13
|
description: "Name the profile and choose its default presentation. Renaming updates dependent imports when you save.",
|
|
14
14
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
15
|
-
className: "grid gap-5
|
|
15
|
+
className: "grid gap-5 @xl:grid-cols-2",
|
|
16
16
|
children: [
|
|
17
17
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EditorField, {
|
|
18
18
|
label: "Profile name",
|
|
@@ -59,6 +59,10 @@ function ProfileGeneralSection({ draft, onChange }) {
|
|
|
59
59
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
60
60
|
value: "logs",
|
|
61
61
|
children: "Logs"
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
64
|
+
value: "traces",
|
|
65
|
+
children: "Traces"
|
|
62
66
|
})
|
|
63
67
|
]
|
|
64
68
|
})
|
|
@@ -94,7 +98,7 @@ function ProfileSourceSection({ draft, discovered, sampleStale, lookupFetcher, o
|
|
|
94
98
|
title: "Source",
|
|
95
99
|
description: "Select the provider and saved connection. Connection credentials remain server-side.",
|
|
96
100
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
97
|
-
className: "grid gap-4
|
|
101
|
+
className: "grid gap-4 @xl:grid-cols-2",
|
|
98
102
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EditorField, {
|
|
99
103
|
label: "Provider type",
|
|
100
104
|
required: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileEditorSections.cjs","names":["Icon","profileConnectionID","providerTypes","JsonSchemaForm","providerConnectionSchema","ProfileWizardQueryStep","providerOptionsSchema","profileFormExtensions","profileSchemaProjection","mergeProfileProjection"],"sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"sourcesContent":["import { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport type {\n FormLayout,\n LookupFetcher,\n PostExtension,\n PreExtension,\n} from \"../../components/json-schema-form-types\";\nimport { Icon } from \"../../data/Icon\";\nimport type { ReactNode } from \"react\";\nimport {\n mergeProfileProjection,\n providerConnectionSchema,\n profileSchemaProjection,\n providerOptionsSchema,\n providerTypes,\n} from \"./profileEditorModel\";\nimport { profileFormExtensions } from \"../profileApi\";\nimport {\n ProfileWizardQueryStep,\n type ProfileSample,\n} from \"../wizard/profileWizardQueryStep\";\nimport {\n profileConnectionID,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\n\nconst inputClassName =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\";\n\nexport function ProfileGeneralSection({ draft, onChange }: EditorSectionProps) {\n return (\n <SectionCard\n title=\"Profile identity\"\n description=\"Name the profile and choose its default presentation. Renaming updates dependent imports when you save.\"\n >\n <div className=\"grid gap-5 md:grid-cols-2\">\n <EditorField label=\"Profile name\" required>\n <input\n value={draft.profile ?? \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, profile: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Namespace\">\n <input\n value={draft.namespace ?? \"\"}\n className={inputClassName}\n placeholder=\"Default namespace\"\n onChange={(event) =>\n onChange({ ...draft, namespace: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Render mode\">\n <select\n value={typeof draft.render === \"string\" ? draft.render : \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, render: event.target.value || undefined })\n }\n >\n <option value=\"\">Table (default)</option>\n <option value=\"table\">Table</option>\n <option value=\"logs\">Logs</option>\n </select>\n </EditorField>\n <EditorField label=\"Icon\">\n <div className=\"flex items-center gap-2\">\n <input\n value={typeof draft.icon === \"string\" ? draft.icon : \"\"}\n className={inputClassName}\n // Empty is the norm: the provider type already supplies a mark.\n // This is for the profile whose subject is not its backend.\n placeholder=\"Provider default\"\n onChange={(event) =>\n onChange({ ...draft, icon: event.target.value || undefined })\n }\n />\n {typeof draft.icon === \"string\" && draft.icon !== \"\" ? (\n // Shows what the name actually resolves to — an unresolvable name\n // renders nothing anywhere, which is invisible without a preview.\n <Icon name={draft.icon} className=\"size-5 shrink-0\" />\n ) : null}\n </div>\n </EditorField>\n </div>\n </SectionCard>\n );\n}\n\nexport function ProfileSourceSection({\n draft,\n discovered,\n sampleStale,\n lookupFetcher,\n onChange,\n onSample,\n}: EditorSectionProps & {\n discovered: ProfileColumn[];\n sampleStale: boolean;\n lookupFetcher?: LookupFetcher;\n onSample: (sample: ProfileSample) => void;\n}) {\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const providerType = draft.provider?.type ?? \"\";\n return (\n <div className=\"grid h-full min-h-0 gap-4\">\n <SectionCard\n title=\"Source\"\n description=\"Select the provider and saved connection. Connection credentials remain server-side.\"\n >\n <div className=\"grid gap-4 md:grid-cols-2\">\n <EditorField label=\"Provider type\" required>\n <select\n value={providerType}\n className={inputClassName}\n onChange={(event) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, type: event.target.value },\n })\n }\n >\n <option value=\"\">Choose a provider</option>\n {providerTypes().map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </EditorField>\n <JsonSchemaForm\n idPrefix=\"profile-source-connection\"\n schema={providerConnectionSchema()}\n value={{\n connection: draft.provider?.connection ?? \"\",\n provider: draft.provider ?? {},\n }}\n onChange={(next) => {\n if (typeof next.connection !== \"string\") {\n throw new Error(\"provider.connection must be a string\");\n }\n onChange({\n ...draft,\n provider: { ...draft.provider, connection: next.connection },\n });\n }}\n showPreferencesMenu={false}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n {sampleStale ? (\n <p className=\"mt-4 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3 text-sm text-warning-foreground\">\n Source or query settings changed after the latest sample. You can\n save, but sampling again will verify the current field shape.\n </p>\n ) : null}\n </SectionCard>\n {connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={onChange}\n onSample={onSample}\n />\n ) : (\n <SectionCard\n title=\"Query and provider options\"\n description=\"Inline sources use the provider schema for options while keeping the query workspace explicit.\"\n >\n <EditorField label=\"Query\">\n <textarea\n rows={10}\n value={draft.query ?? \"\"}\n className={`${inputClassName} resize-y font-mono text-xs`}\n onChange={(event) =>\n onChange({ ...draft, query: event.target.value })\n }\n />\n </EditorField>\n <div className=\"mt-5\">\n {/* The provider option schemas carry host widgets of their own —\n secret and workload-url selectors, the structured search builder —\n so this form needs the host's extensions as much as the sections\n built from the profile schema do. */}\n <JsonSchemaForm\n idPrefix=\"profile-provider-options\"\n schema={providerOptionsSchema(providerType)}\n value={draft.provider?.options ?? {}}\n onChange={(options) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, options },\n })\n }\n showPreferencesMenu={false}\n pre={profileFormExtensions().pre}\n post={profileFormExtensions().post}\n />\n </div>\n </SectionCard>\n )}\n </div>\n );\n}\n\nexport function ProfileSchemaSection({\n draft,\n keys,\n title,\n description,\n idPrefix,\n layout,\n lookupFetcher,\n pre,\n post,\n onChange,\n}: EditorSectionProps & {\n keys: string[];\n title: string;\n description: string;\n idPrefix: string;\n // Presentation is the call site's, not this component's — profile schema\n // sections can choose a dense layout or keep the plain stacked defaults.\n layout?: FormLayout;\n // JsonSchemaForm always installs its own lookup provider, so an outer one is\n // shadowed rather than inherited: without this, x-clicky-lookup fields (the\n // imports and reconcile.dest profile pickers) render with no options at all.\n lookupFetcher?: LookupFetcher;\n // Overrides the host's configured extensions for this section only. Passing an\n // empty array is meaningful — it renders the built-in controls — so these are\n // distinguished by being undefined, not by being empty.\n pre?: PreExtension[];\n post?: PostExtension[];\n}) {\n const configured = profileFormExtensions();\n const fullRootPre = (pre ?? configured.pre).map<PreExtension>(\n (extension) => (field, context) =>\n extension(field, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n const fullRootPost = (post ?? configured.post).map<PostExtension>(\n (extension) => (field, nodes, context) =>\n extension(field, nodes, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n return (\n <SectionCard title={title} description={description}>\n <JsonSchemaForm\n idPrefix={idPrefix}\n schema={profileSchemaProjection(keys)}\n value={Object.fromEntries(\n keys.flatMap((key) =>\n Object.prototype.hasOwnProperty.call(draft, key)\n ? [[key, draft[key]]]\n : [],\n ),\n )}\n onChange={(next) => onChange(mergeProfileProjection(draft, keys, next))}\n showPreferencesMenu={false}\n pre={fullRootPre}\n post={fullRootPost}\n {...(layout ? { layout } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </SectionCard>\n );\n}\n\ntype EditorSectionProps = {\n draft: ProfileWizardDraft;\n onChange: (draft: ProfileWizardDraft) => void;\n};\n\nfunction SectionCard({\n title,\n description,\n children,\n}: {\n title: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-xl border bg-card p-5\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"mb-5 mt-1 text-sm text-muted-foreground\">{description}</p>\n {children}\n </section>\n );\n}\n\nfunction EditorField({\n label,\n required,\n children,\n}: {\n label: string;\n required?: boolean;\n children: ReactNode;\n}) {\n return (\n <label className=\"grid gap-1.5 text-sm font-medium\">\n <span>\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </span>\n {children}\n </label>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profileEditorSections.cjs","names":["Icon","profileConnectionID","providerTypes","JsonSchemaForm","providerConnectionSchema","ProfileWizardQueryStep","providerOptionsSchema","profileFormExtensions","profileSchemaProjection","mergeProfileProjection"],"sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"sourcesContent":["import { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport type {\n FormLayout,\n LookupFetcher,\n PostExtension,\n PreExtension,\n} from \"../../components/json-schema-form-types\";\nimport { Icon } from \"../../data/Icon\";\nimport type { ReactNode } from \"react\";\nimport {\n mergeProfileProjection,\n providerConnectionSchema,\n profileSchemaProjection,\n providerOptionsSchema,\n providerTypes,\n} from \"./profileEditorModel\";\nimport { profileFormExtensions } from \"../profileApi\";\nimport {\n ProfileWizardQueryStep,\n type ProfileSample,\n} from \"../wizard/profileWizardQueryStep\";\nimport {\n profileConnectionID,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\n\nconst inputClassName =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\";\n\nexport function ProfileGeneralSection({ draft, onChange }: EditorSectionProps) {\n return (\n <SectionCard\n title=\"Profile identity\"\n description=\"Name the profile and choose its default presentation. Renaming updates dependent imports when you save.\"\n >\n <div className=\"grid gap-5 @xl:grid-cols-2\">\n <EditorField label=\"Profile name\" required>\n <input\n value={draft.profile ?? \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, profile: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Namespace\">\n <input\n value={draft.namespace ?? \"\"}\n className={inputClassName}\n placeholder=\"Default namespace\"\n onChange={(event) =>\n onChange({ ...draft, namespace: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Render mode\">\n <select\n value={typeof draft.render === \"string\" ? draft.render : \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, render: event.target.value || undefined })\n }\n >\n <option value=\"\">Table (default)</option>\n <option value=\"table\">Table</option>\n <option value=\"logs\">Logs</option>\n <option value=\"traces\">Traces</option>\n </select>\n </EditorField>\n <EditorField label=\"Icon\">\n <div className=\"flex items-center gap-2\">\n <input\n value={typeof draft.icon === \"string\" ? draft.icon : \"\"}\n className={inputClassName}\n // Empty is the norm: the provider type already supplies a mark.\n // This is for the profile whose subject is not its backend.\n placeholder=\"Provider default\"\n onChange={(event) =>\n onChange({ ...draft, icon: event.target.value || undefined })\n }\n />\n {typeof draft.icon === \"string\" && draft.icon !== \"\" ? (\n // Shows what the name actually resolves to — an unresolvable name\n // renders nothing anywhere, which is invisible without a preview.\n <Icon name={draft.icon} className=\"size-5 shrink-0\" />\n ) : null}\n </div>\n </EditorField>\n </div>\n </SectionCard>\n );\n}\n\nexport function ProfileSourceSection({\n draft,\n discovered,\n sampleStale,\n lookupFetcher,\n onChange,\n onSample,\n}: EditorSectionProps & {\n discovered: ProfileColumn[];\n sampleStale: boolean;\n lookupFetcher?: LookupFetcher;\n onSample: (sample: ProfileSample) => void;\n}) {\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const providerType = draft.provider?.type ?? \"\";\n return (\n <div className=\"grid h-full min-h-0 gap-4\">\n <SectionCard\n title=\"Source\"\n description=\"Select the provider and saved connection. Connection credentials remain server-side.\"\n >\n <div className=\"grid gap-4 @xl:grid-cols-2\">\n <EditorField label=\"Provider type\" required>\n <select\n value={providerType}\n className={inputClassName}\n onChange={(event) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, type: event.target.value },\n })\n }\n >\n <option value=\"\">Choose a provider</option>\n {providerTypes().map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </EditorField>\n <JsonSchemaForm\n idPrefix=\"profile-source-connection\"\n schema={providerConnectionSchema()}\n value={{\n connection: draft.provider?.connection ?? \"\",\n provider: draft.provider ?? {},\n }}\n onChange={(next) => {\n if (typeof next.connection !== \"string\") {\n throw new Error(\"provider.connection must be a string\");\n }\n onChange({\n ...draft,\n provider: { ...draft.provider, connection: next.connection },\n });\n }}\n showPreferencesMenu={false}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n {sampleStale ? (\n <p className=\"mt-4 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3 text-sm text-warning-foreground\">\n Source or query settings changed after the latest sample. You can\n save, but sampling again will verify the current field shape.\n </p>\n ) : null}\n </SectionCard>\n {connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={onChange}\n onSample={onSample}\n />\n ) : (\n <SectionCard\n title=\"Query and provider options\"\n description=\"Inline sources use the provider schema for options while keeping the query workspace explicit.\"\n >\n <EditorField label=\"Query\">\n <textarea\n rows={10}\n value={draft.query ?? \"\"}\n className={`${inputClassName} resize-y font-mono text-xs`}\n onChange={(event) =>\n onChange({ ...draft, query: event.target.value })\n }\n />\n </EditorField>\n <div className=\"mt-5\">\n {/* The provider option schemas carry host widgets of their own —\n secret and workload-url selectors, the structured search builder —\n so this form needs the host's extensions as much as the sections\n built from the profile schema do. */}\n <JsonSchemaForm\n idPrefix=\"profile-provider-options\"\n schema={providerOptionsSchema(providerType)}\n value={draft.provider?.options ?? {}}\n onChange={(options) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, options },\n })\n }\n showPreferencesMenu={false}\n pre={profileFormExtensions().pre}\n post={profileFormExtensions().post}\n />\n </div>\n </SectionCard>\n )}\n </div>\n );\n}\n\nexport function ProfileSchemaSection({\n draft,\n keys,\n title,\n description,\n idPrefix,\n layout,\n lookupFetcher,\n pre,\n post,\n onChange,\n}: EditorSectionProps & {\n keys: string[];\n title: string;\n description: string;\n idPrefix: string;\n // Presentation is the call site's, not this component's — profile schema\n // sections can choose a dense layout or keep the plain stacked defaults.\n layout?: FormLayout;\n // JsonSchemaForm always installs its own lookup provider, so an outer one is\n // shadowed rather than inherited: without this, x-clicky-lookup fields (the\n // imports and reconcile.dest profile pickers) render with no options at all.\n lookupFetcher?: LookupFetcher;\n // Overrides the host's configured extensions for this section only. Passing an\n // empty array is meaningful — it renders the built-in controls — so these are\n // distinguished by being undefined, not by being empty.\n pre?: PreExtension[];\n post?: PostExtension[];\n}) {\n const configured = profileFormExtensions();\n const fullRootPre = (pre ?? configured.pre).map<PreExtension>(\n (extension) => (field, context) =>\n extension(field, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n const fullRootPost = (post ?? configured.post).map<PostExtension>(\n (extension) => (field, nodes, context) =>\n extension(field, nodes, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n return (\n <SectionCard title={title} description={description}>\n <JsonSchemaForm\n idPrefix={idPrefix}\n schema={profileSchemaProjection(keys)}\n value={Object.fromEntries(\n keys.flatMap((key) =>\n Object.prototype.hasOwnProperty.call(draft, key)\n ? [[key, draft[key]]]\n : [],\n ),\n )}\n onChange={(next) => onChange(mergeProfileProjection(draft, keys, next))}\n showPreferencesMenu={false}\n pre={fullRootPre}\n post={fullRootPost}\n {...(layout ? { layout } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </SectionCard>\n );\n}\n\ntype EditorSectionProps = {\n draft: ProfileWizardDraft;\n onChange: (draft: ProfileWizardDraft) => void;\n};\n\nfunction SectionCard({\n title,\n description,\n children,\n}: {\n title: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-xl border bg-card p-5\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"mb-5 mt-1 text-sm text-muted-foreground\">{description}</p>\n {children}\n </section>\n );\n}\n\nfunction EditorField({\n label,\n required,\n children,\n}: {\n label: string;\n required?: boolean;\n children: ReactNode;\n}) {\n return (\n <label className=\"grid gap-1.5 text-sm font-medium\">\n <span>\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </span>\n {children}\n </label>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileEditorSections.d.ts","sourceRoot":"","sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACb,MAAM,yCAAyC,CAAC;AAWjD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAC;AAKtC,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+
|
|
1
|
+
{"version":3,"file":"profileEditorSections.d.ts","sourceRoot":"","sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACb,MAAM,yCAAyC,CAAC;AAWjD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAC;AAKtC,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BA8D5E;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,GAAG;IACtB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C,+BAwGA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,IAAI,EACJ,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,aAAa,EACb,GAAG,EACH,IAAI,EACJ,QAAQ,GACT,EAAE,kBAAkB,GAAG;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IAGjB,MAAM,CAAC,EAAE,UAAU,CAAC;IAIpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAI9B,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;CACxB,+BAuCA;AAED,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC/C,CAAC"}
|
|
@@ -12,7 +12,7 @@ function ProfileGeneralSection({ draft, onChange }) {
|
|
|
12
12
|
title: "Profile identity",
|
|
13
13
|
description: "Name the profile and choose its default presentation. Renaming updates dependent imports when you save.",
|
|
14
14
|
children: /* @__PURE__ */ jsxs("div", {
|
|
15
|
-
className: "grid gap-5
|
|
15
|
+
className: "grid gap-5 @xl:grid-cols-2",
|
|
16
16
|
children: [
|
|
17
17
|
/* @__PURE__ */ jsx(EditorField, {
|
|
18
18
|
label: "Profile name",
|
|
@@ -59,6 +59,10 @@ function ProfileGeneralSection({ draft, onChange }) {
|
|
|
59
59
|
/* @__PURE__ */ jsx("option", {
|
|
60
60
|
value: "logs",
|
|
61
61
|
children: "Logs"
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ jsx("option", {
|
|
64
|
+
value: "traces",
|
|
65
|
+
children: "Traces"
|
|
62
66
|
})
|
|
63
67
|
]
|
|
64
68
|
})
|
|
@@ -94,7 +98,7 @@ function ProfileSourceSection({ draft, discovered, sampleStale, lookupFetcher, o
|
|
|
94
98
|
title: "Source",
|
|
95
99
|
description: "Select the provider and saved connection. Connection credentials remain server-side.",
|
|
96
100
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
97
|
-
className: "grid gap-4
|
|
101
|
+
className: "grid gap-4 @xl:grid-cols-2",
|
|
98
102
|
children: [/* @__PURE__ */ jsx(EditorField, {
|
|
99
103
|
label: "Provider type",
|
|
100
104
|
required: true,
|