@flanksource/clicky-ui 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/comments/CommentAuthor.cjs +58 -0
- package/dist/comments/CommentAuthor.cjs.map +1 -0
- package/dist/comments/CommentAuthor.d.ts +17 -0
- package/dist/comments/CommentAuthor.d.ts.map +1 -0
- package/dist/comments/CommentAuthor.js +58 -0
- package/dist/comments/CommentAuthor.js.map +1 -0
- package/dist/comments/CommentCard.cjs +343 -0
- package/dist/comments/CommentCard.cjs.map +1 -0
- package/dist/comments/CommentCard.d.ts +27 -0
- package/dist/comments/CommentCard.d.ts.map +1 -0
- package/dist/comments/CommentCard.js +343 -0
- package/dist/comments/CommentCard.js.map +1 -0
- package/dist/comments/CommentComposer.cjs +207 -0
- package/dist/comments/CommentComposer.cjs.map +1 -0
- package/dist/comments/CommentComposer.d.ts +23 -0
- package/dist/comments/CommentComposer.d.ts.map +1 -0
- package/dist/comments/CommentComposer.js +207 -0
- package/dist/comments/CommentComposer.js.map +1 -0
- package/dist/comments/CommentFilterBar.cjs +145 -0
- package/dist/comments/CommentFilterBar.cjs.map +1 -0
- package/dist/comments/CommentFilterBar.d.ts +15 -0
- package/dist/comments/CommentFilterBar.d.ts.map +1 -0
- package/dist/comments/CommentFilterBar.js +145 -0
- package/dist/comments/CommentFilterBar.js.map +1 -0
- package/dist/comments/CommentMarkdown.cjs +156 -0
- package/dist/comments/CommentMarkdown.cjs.map +1 -0
- package/dist/comments/CommentMarkdown.d.ts +13 -0
- package/dist/comments/CommentMarkdown.d.ts.map +1 -0
- package/dist/comments/CommentMarkdown.js +156 -0
- package/dist/comments/CommentMarkdown.js.map +1 -0
- package/dist/comments/CommentProgress.cjs +86 -0
- package/dist/comments/CommentProgress.cjs.map +1 -0
- package/dist/comments/CommentProgress.d.ts +16 -0
- package/dist/comments/CommentProgress.d.ts.map +1 -0
- package/dist/comments/CommentProgress.js +86 -0
- package/dist/comments/CommentProgress.js.map +1 -0
- package/dist/comments/CommentProvider.cjs +99 -0
- package/dist/comments/CommentProvider.cjs.map +1 -0
- package/dist/comments/CommentProvider.d.ts +19 -0
- package/dist/comments/CommentProvider.d.ts.map +1 -0
- package/dist/comments/CommentProvider.js +99 -0
- package/dist/comments/CommentProvider.js.map +1 -0
- package/dist/comments/CommentSidePanel.cjs +219 -0
- package/dist/comments/CommentSidePanel.cjs.map +1 -0
- package/dist/comments/CommentSidePanel.d.ts +16 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -0
- package/dist/comments/CommentSidePanel.js +219 -0
- package/dist/comments/CommentSidePanel.js.map +1 -0
- package/dist/comments/CommentThread.cjs +57 -0
- package/dist/comments/CommentThread.cjs.map +1 -0
- package/dist/comments/CommentThread.d.ts +24 -0
- package/dist/comments/CommentThread.d.ts.map +1 -0
- package/dist/comments/CommentThread.js +57 -0
- package/dist/comments/CommentThread.js.map +1 -0
- package/dist/comments/CommentThreadList.cjs +124 -0
- package/dist/comments/CommentThreadList.cjs.map +1 -0
- package/dist/comments/CommentThreadList.d.ts +25 -0
- package/dist/comments/CommentThreadList.d.ts.map +1 -0
- package/dist/comments/CommentThreadList.js +124 -0
- package/dist/comments/CommentThreadList.js.map +1 -0
- package/dist/comments/GroupedComments.cjs +74 -0
- package/dist/comments/GroupedComments.cjs.map +1 -0
- package/dist/comments/GroupedComments.d.ts +18 -0
- package/dist/comments/GroupedComments.d.ts.map +1 -0
- package/dist/comments/GroupedComments.js +74 -0
- package/dist/comments/GroupedComments.js.map +1 -0
- package/dist/comments/MentionTextarea.cjs +253 -0
- package/dist/comments/MentionTextarea.cjs.map +1 -0
- package/dist/comments/MentionTextarea.d.ts +28 -0
- package/dist/comments/MentionTextarea.d.ts.map +1 -0
- package/dist/comments/MentionTextarea.js +253 -0
- package/dist/comments/MentionTextarea.js.map +1 -0
- package/dist/comments/comment-context.cjs +33 -0
- package/dist/comments/comment-context.cjs.map +1 -0
- package/dist/comments/comment-context.d.ts +32 -0
- package/dist/comments/comment-context.d.ts.map +1 -0
- package/dist/comments/comment-context.js +33 -0
- package/dist/comments/comment-context.js.map +1 -0
- package/dist/comments/comment-fixtures.d.ts +11 -0
- package/dist/comments/comment-fixtures.d.ts.map +1 -0
- package/dist/comments/comment-types.cjs +19 -0
- package/dist/comments/comment-types.cjs.map +1 -0
- package/dist/comments/comment-types.d.ts +170 -0
- package/dist/comments/comment-types.d.ts.map +1 -0
- package/dist/comments/comment-types.js +19 -0
- package/dist/comments/comment-types.js.map +1 -0
- package/dist/comments/comment-utils.cjs +216 -0
- package/dist/comments/comment-utils.cjs.map +1 -0
- package/dist/comments/comment-utils.d.ts +59 -0
- package/dist/comments/comment-utils.d.ts.map +1 -0
- package/dist/comments/comment-utils.js +216 -0
- package/dist/comments/comment-utils.js.map +1 -0
- package/dist/comments.cjs +57 -0
- package/dist/comments.cjs.map +1 -0
- package/dist/comments.d.ts +16 -0
- package/dist/comments.d.ts.map +1 -0
- package/dist/comments.js +57 -0
- package/dist/comments.js.map +1 -0
- package/dist/components/FilterBar.cjs +13 -3
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.js +13 -3
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +20 -6
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +22 -8
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/NamespacePicker.cjs +52 -0
- package/dist/components/NamespacePicker.cjs.map +1 -0
- package/dist/components/NamespacePicker.d.ts +17 -0
- package/dist/components/NamespacePicker.d.ts.map +1 -0
- package/dist/components/NamespacePicker.js +52 -0
- package/dist/components/NamespacePicker.js.map +1 -0
- package/dist/components/form-lookup-context.cjs +36 -0
- package/dist/components/form-lookup-context.cjs.map +1 -0
- package/dist/components/form-lookup-context.d.ts +9 -0
- package/dist/components/form-lookup-context.d.ts.map +1 -0
- package/dist/components/form-lookup-context.js +36 -0
- package/dist/components/form-lookup-context.js.map +1 -0
- package/dist/components/json-schema-form-discriminator.cjs +67 -0
- package/dist/components/json-schema-form-discriminator.cjs.map +1 -0
- package/dist/components/json-schema-form-discriminator.d.ts +10 -0
- package/dist/components/json-schema-form-discriminator.d.ts.map +1 -0
- package/dist/components/json-schema-form-discriminator.js +67 -0
- package/dist/components/json-schema-form-discriminator.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +66 -1
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +7 -0
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +66 -1
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-grid.cjs +92 -0
- package/dist/components/json-schema-form-grid.cjs.map +1 -0
- package/dist/components/json-schema-form-grid.d.ts +9 -0
- package/dist/components/json-schema-form-grid.d.ts.map +1 -0
- package/dist/components/json-schema-form-grid.js +92 -0
- package/dist/components/json-schema-form-grid.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +20 -3
- 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 +22 -5
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +24 -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 +24 -2
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +37 -2
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +8 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +1 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +8 -0
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/workload-picker-utils.cjs.map +1 -1
- package/dist/components/workload-picker-utils.d.ts +11 -1
- package/dist/components/workload-picker-utils.d.ts.map +1 -1
- package/dist/components/workload-picker-utils.js.map +1 -1
- package/dist/components.cjs +6 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +4 -2
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +6 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +225 -60
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +7 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.fixtures.d.ts +3 -1
- package/dist/data/Clicky.fixtures.d.ts.map +1 -1
- package/dist/data/Clicky.js +226 -61
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/ExecutionTree.cjs +68 -0
- package/dist/data/ExecutionTree.cjs.map +1 -0
- package/dist/data/ExecutionTree.d.ts +40 -0
- package/dist/data/ExecutionTree.d.ts.map +1 -0
- package/dist/data/ExecutionTree.js +68 -0
- package/dist/data/ExecutionTree.js.map +1 -0
- package/dist/data/GaugeHoverCard.cjs +35 -0
- package/dist/data/GaugeHoverCard.cjs.map +1 -0
- package/dist/data/GaugeHoverCard.d.ts +25 -0
- package/dist/data/GaugeHoverCard.d.ts.map +1 -0
- package/dist/data/GaugeHoverCard.js +35 -0
- package/dist/data/GaugeHoverCard.js.map +1 -0
- package/dist/data/MarkdownEditor.cjs +616 -0
- package/dist/data/MarkdownEditor.cjs.map +1 -0
- package/dist/data/MarkdownEditor.d.ts +61 -0
- package/dist/data/MarkdownEditor.d.ts.map +1 -0
- package/dist/data/MarkdownEditor.js +616 -0
- package/dist/data/MarkdownEditor.js.map +1 -0
- package/dist/data/MarkdownEditor.model.cjs +27 -0
- package/dist/data/MarkdownEditor.model.cjs.map +1 -0
- package/dist/data/MarkdownEditor.model.d.ts +38 -0
- package/dist/data/MarkdownEditor.model.d.ts.map +1 -0
- package/dist/data/MarkdownEditor.model.js +27 -0
- package/dist/data/MarkdownEditor.model.js.map +1 -0
- package/dist/data/ObjectGraph.cjs +44 -0
- package/dist/data/ObjectGraph.cjs.map +1 -0
- package/dist/data/ObjectGraph.d.ts +39 -0
- package/dist/data/ObjectGraph.d.ts.map +1 -0
- package/dist/data/ObjectGraph.js +44 -0
- package/dist/data/ObjectGraph.js.map +1 -0
- package/dist/data/SchemaViewer.cjs +152 -0
- package/dist/data/SchemaViewer.cjs.map +1 -0
- package/dist/data/SchemaViewer.d.ts +27 -0
- package/dist/data/SchemaViewer.d.ts.map +1 -0
- package/dist/data/SchemaViewer.js +152 -0
- package/dist/data/SchemaViewer.js.map +1 -0
- package/dist/data/TimeseriesCoreBars.cjs +51 -12
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts +32 -5
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +51 -12
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.cjs +5 -5
- package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.d.ts +4 -4
- package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.js +5 -5
- package/dist/data/TimeseriesCoreBars.model.js.map +1 -1
- package/dist/data/TimeseriesGauge.cjs +103 -65
- package/dist/data/TimeseriesGauge.cjs.map +1 -1
- package/dist/data/TimeseriesGauge.d.ts +10 -1
- package/dist/data/TimeseriesGauge.d.ts.map +1 -1
- package/dist/data/TimeseriesGauge.js +104 -66
- package/dist/data/TimeseriesGauge.js.map +1 -1
- package/dist/data/WorkloadCard.cjs +4 -4
- package/dist/data/WorkloadCard.cjs.map +1 -1
- package/dist/data/WorkloadCard.d.ts +3 -2
- package/dist/data/WorkloadCard.d.ts.map +1 -1
- package/dist/data/WorkloadCard.js +4 -4
- package/dist/data/WorkloadCard.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +11 -19
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +1 -7
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +11 -19
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.cjs +20 -0
- package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -0
- package/dist/data/ai/ChatWindowRequestBody.d.ts +9 -0
- package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -0
- package/dist/data/ai/ChatWindowRequestBody.js +20 -0
- package/dist/data/ai/ChatWindowRequestBody.js.map +1 -0
- package/dist/data/chat/Chat.cjs +12 -0
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +8 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +12 -0
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/gauge-stats.cjs +19 -0
- package/dist/data/gauge-stats.cjs.map +1 -0
- package/dist/data/gauge-stats.d.ts +15 -0
- package/dist/data/gauge-stats.d.ts.map +1 -0
- package/dist/data/gauge-stats.js +19 -0
- package/dist/data/gauge-stats.js.map +1 -0
- package/dist/data/schema-viewer-model.cjs +436 -0
- package/dist/data/schema-viewer-model.cjs.map +1 -0
- package/dist/data/schema-viewer-model.d.ts +64 -0
- package/dist/data/schema-viewer-model.d.ts.map +1 -0
- package/dist/data/schema-viewer-model.js +436 -0
- package/dist/data/schema-viewer-model.js.map +1 -0
- package/dist/data/version-info.cjs +2 -2
- package/dist/data/version-info.js +2 -2
- package/dist/data.cjs +23 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +11 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +23 -0
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +87 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -2
- package/dist/index.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +102 -143
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts +34 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +105 -146
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationActionBar.cjs +135 -0
- package/dist/rpc/OperationActionBar.cjs.map +1 -0
- package/dist/rpc/OperationActionBar.d.ts +20 -0
- package/dist/rpc/OperationActionBar.d.ts.map +1 -0
- package/dist/rpc/OperationActionBar.js +135 -0
- package/dist/rpc/OperationActionBar.js.map +1 -0
- package/dist/rpc/OperationCatalog.cjs +79 -116
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +8 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +80 -117
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +134 -223
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +135 -224
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/OperationEntityPage.cjs +49 -100
- package/dist/rpc/OperationEntityPage.cjs.map +1 -1
- package/dist/rpc/OperationEntityPage.d.ts +6 -1
- package/dist/rpc/OperationEntityPage.d.ts.map +1 -1
- package/dist/rpc/OperationEntityPage.js +50 -101
- package/dist/rpc/OperationEntityPage.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +43 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -0
- package/dist/rpc/OperationResultView.d.ts +30 -0
- package/dist/rpc/OperationResultView.d.ts.map +1 -0
- package/dist/rpc/OperationResultView.js +43 -0
- package/dist/rpc/OperationResultView.js.map +1 -0
- package/dist/rpc/SchemaActionForm.cjs +102 -0
- package/dist/rpc/SchemaActionForm.cjs.map +1 -0
- package/dist/rpc/SchemaActionForm.d.ts +23 -0
- package/dist/rpc/SchemaActionForm.d.ts.map +1 -0
- package/dist/rpc/SchemaActionForm.js +102 -0
- package/dist/rpc/SchemaActionForm.js.map +1 -0
- package/dist/rpc/accept-options.cjs.map +1 -1
- package/dist/rpc/accept-options.d.ts +0 -1
- package/dist/rpc/accept-options.d.ts.map +1 -1
- package/dist/rpc/accept-options.js.map +1 -1
- package/dist/rpc/apiClient.cjs +34 -2
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts +4 -1
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +34 -2
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +4 -4
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts +0 -1
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +4 -4
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +1 -0
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +6 -1
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +1 -0
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/rowNavigation.cjs +86 -0
- package/dist/rpc/rowNavigation.cjs.map +1 -0
- package/dist/rpc/rowNavigation.d.ts +14 -0
- package/dist/rpc/rowNavigation.d.ts.map +1 -0
- package/dist/rpc/rowNavigation.js +86 -0
- package/dist/rpc/rowNavigation.js.map +1 -0
- package/dist/rpc/schemaActionPath.cjs +22 -0
- package/dist/rpc/schemaActionPath.cjs.map +1 -0
- package/dist/rpc/schemaActionPath.d.ts +4 -0
- package/dist/rpc/schemaActionPath.d.ts.map +1 -0
- package/dist/rpc/schemaActionPath.js +22 -0
- package/dist/rpc/schemaActionPath.js.map +1 -0
- package/dist/rpc/surfaceIconMap.cjs +35 -0
- package/dist/rpc/surfaceIconMap.cjs.map +1 -0
- package/dist/rpc/surfaceIconMap.d.ts +3 -0
- package/dist/rpc/surfaceIconMap.d.ts.map +1 -0
- package/dist/rpc/surfaceIconMap.js +35 -0
- package/dist/rpc/surfaceIconMap.js.map +1 -0
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +2 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc/useOperations.cjs.map +1 -1
- package/dist/rpc/useOperations.d.ts +4 -1
- package/dist/rpc/useOperations.d.ts.map +1 -1
- package/dist/rpc/useOperations.js.map +1 -1
- package/dist/rpc.cjs +4 -2
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +7 -6
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +4 -2
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
- package/dist/rpc/AcceptPicker.cjs +0 -137
- package/dist/rpc/AcceptPicker.cjs.map +0 -1
- package/dist/rpc/AcceptPicker.d.ts +0 -12
- package/dist/rpc/AcceptPicker.d.ts.map +0 -1
- package/dist/rpc/AcceptPicker.js +0 -137
- package/dist/rpc/AcceptPicker.js.map +0 -1
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useMemo } from "react";
|
|
3
3
|
import { useQuery } from "@tanstack/react-query";
|
|
4
|
-
import { Button } from "../components/button.js";
|
|
5
4
|
import { MethodBadge } from "../data/MethodBadge.js";
|
|
6
|
-
import { Modal } from "../overlay/Modal.js";
|
|
7
5
|
import { filterOperationsByDomain, findListEndpoint, findDetailEndpointForList } from "./classify.js";
|
|
8
6
|
import { filterOperationsBySurface, findSurfaceListOperation, findSurfaceDetailOperation, findSurfaceEntityActions } from "./clickyMetadata.js";
|
|
9
7
|
import { ExecutionResult } from "./ExecutionResult.js";
|
|
10
|
-
import {
|
|
11
|
-
import { packParameterValues } from "./formMetadata.js";
|
|
8
|
+
import { OperationActionBar } from "./OperationActionBar.js";
|
|
12
9
|
import { useOperations } from "./useOperations.js";
|
|
13
10
|
function defaultRenderError(err, title) {
|
|
14
11
|
const message = err instanceof Error ? err.message : String(err ?? "");
|
|
@@ -31,13 +28,12 @@ function OperationEntityPage({
|
|
|
31
28
|
backHref,
|
|
32
29
|
backLabel = "Back",
|
|
33
30
|
renderError = defaultRenderError,
|
|
34
|
-
commandRuntime
|
|
31
|
+
commandRuntime,
|
|
32
|
+
formPre,
|
|
33
|
+
formPost,
|
|
34
|
+
formActions
|
|
35
35
|
}) {
|
|
36
36
|
const { operations, isLoading } = useOperations(client);
|
|
37
|
-
const [activeAction, setActiveAction] = useState(null);
|
|
38
|
-
const [actionResult, setActionResult] = useState(null);
|
|
39
|
-
const [actionError, setActionError] = useState("");
|
|
40
|
-
const [isExecutingAction, setIsExecutingAction] = useState(false);
|
|
41
37
|
const surfaceOps = useMemo(
|
|
42
38
|
() => filterOperationsBySurface(operations, surfaceKey),
|
|
43
39
|
[operations, surfaceKey]
|
|
@@ -94,31 +90,25 @@ function OperationEntityPage({
|
|
|
94
90
|
staleTime: 3e4,
|
|
95
91
|
retry: 0
|
|
96
92
|
});
|
|
93
|
+
const rawDetailQuery = useQuery({
|
|
94
|
+
queryKey: ["entity-detail-raw", definition.key, id, resolvedDetailEndpoint == null ? void 0 : resolvedDetailEndpoint.path],
|
|
95
|
+
queryFn: async () => client.executeCommand(resolvedDetailEndpoint.path, resolvedDetailEndpoint.method, detailValues, {
|
|
96
|
+
Accept: "application/json"
|
|
97
|
+
}),
|
|
98
|
+
enabled: !!resolvedDetailEndpoint && !!id,
|
|
99
|
+
staleTime: 3e4,
|
|
100
|
+
retry: 0
|
|
101
|
+
});
|
|
102
|
+
const editInitialValue = useMemo(() => {
|
|
103
|
+
var _a;
|
|
104
|
+
const parsed = (_a = rawDetailQuery.data) == null ? void 0 : _a.parsed;
|
|
105
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : void 0;
|
|
106
|
+
}, [rawDetailQuery.data]);
|
|
97
107
|
const backLink = backHref == null ? null : renderLink ? renderLink({
|
|
98
108
|
to: backHref,
|
|
99
109
|
className: "text-sm text-primary underline-offset-4 hover:underline",
|
|
100
110
|
children: backLabel
|
|
101
111
|
}) : /* @__PURE__ */ jsx("a", { href: backHref, className: "text-sm text-primary underline-offset-4 hover:underline", children: backLabel });
|
|
102
|
-
async function executeAction(values) {
|
|
103
|
-
if (!activeAction) return;
|
|
104
|
-
setIsExecutingAction(true);
|
|
105
|
-
setActionError("");
|
|
106
|
-
try {
|
|
107
|
-
const response = await client.executeCommand(
|
|
108
|
-
activeAction.path,
|
|
109
|
-
activeAction.method,
|
|
110
|
-
packParameterValues(values, activeAction.operation.parameters ?? []),
|
|
111
|
-
{ Accept: "application/json+clicky" }
|
|
112
|
-
);
|
|
113
|
-
setActionResult(response);
|
|
114
|
-
await detailQuery.refetch();
|
|
115
|
-
} catch (err) {
|
|
116
|
-
setActionResult(null);
|
|
117
|
-
setActionError(err instanceof Error ? err.message : String(err ?? "Unknown error"));
|
|
118
|
-
} finally {
|
|
119
|
-
setIsExecutingAction(false);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
112
|
if (isLoading) {
|
|
123
113
|
return /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: "Loading entity…" });
|
|
124
114
|
}
|
|
@@ -129,38 +119,36 @@ function OperationEntityPage({
|
|
|
129
119
|
] });
|
|
130
120
|
}
|
|
131
121
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
132
|
-
/* @__PURE__ */
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
/* @__PURE__ */
|
|
136
|
-
|
|
137
|
-
/* @__PURE__ */ jsx("code", { className: "rounded-md bg-muted px-2 py-1 text-sm", children: resolvedDetailEndpoint.path })
|
|
138
|
-
] }),
|
|
139
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
140
|
-
/* @__PURE__ */ jsxs("h1", { className: "text-2xl font-semibold tracking-tight", children: [
|
|
141
|
-
definition.title,
|
|
142
|
-
": ",
|
|
143
|
-
id
|
|
144
|
-
] }),
|
|
145
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 max-w-3xl text-sm text-muted-foreground", children: definition.description })
|
|
146
|
-
] })
|
|
122
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-start justify-between gap-4", children: /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-2", children: [
|
|
123
|
+
backLink,
|
|
124
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
125
|
+
/* @__PURE__ */ jsx(MethodBadge, { method: resolvedDetailEndpoint.method }),
|
|
126
|
+
/* @__PURE__ */ jsx("code", { className: "rounded-md bg-muted px-2 py-1 text-sm", children: resolvedDetailEndpoint.path })
|
|
147
127
|
] }),
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
128
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
129
|
+
/* @__PURE__ */ jsxs("h1", { className: "text-2xl font-semibold tracking-tight", children: [
|
|
130
|
+
definition.title,
|
|
131
|
+
": ",
|
|
132
|
+
id
|
|
133
|
+
] }),
|
|
134
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 max-w-3xl text-sm text-muted-foreground", children: definition.description })
|
|
135
|
+
] })
|
|
136
|
+
] }) }),
|
|
137
|
+
/* @__PURE__ */ jsx(
|
|
138
|
+
OperationActionBar,
|
|
139
|
+
{
|
|
140
|
+
actions: actionOps,
|
|
141
|
+
client,
|
|
142
|
+
getLockedValues: () => ({ [idParameterName]: id }),
|
|
143
|
+
onExecuted: () => void detailQuery.refetch(),
|
|
144
|
+
hideLockedInForm: true,
|
|
145
|
+
...editInitialValue ? { initialValue: editInitialValue } : {},
|
|
146
|
+
...commandRuntime ? { commandRuntime } : {},
|
|
147
|
+
...formPre ? { formPre } : {},
|
|
148
|
+
...formPost ? { formPost } : {},
|
|
149
|
+
...formActions ? { formActions } : {}
|
|
150
|
+
}
|
|
151
|
+
),
|
|
164
152
|
detailQuery.isLoading ? /* @__PURE__ */ jsxs("section", { className: "rounded-xl border bg-card p-4", children: [
|
|
165
153
|
/* @__PURE__ */ jsx("h2", { className: "text-lg font-medium", children: "Entity detail" }),
|
|
166
154
|
/* @__PURE__ */ jsx(ExecutionResult, { loading: true, loadingMessage: "Loading entity detail…" })
|
|
@@ -173,46 +161,7 @@ function OperationEntityPage({
|
|
|
173
161
|
...commandRuntime ? { commandRuntime } : {}
|
|
174
162
|
}
|
|
175
163
|
)
|
|
176
|
-
] })
|
|
177
|
-
/* @__PURE__ */ jsx(
|
|
178
|
-
Modal,
|
|
179
|
-
{
|
|
180
|
-
open: activeAction != null,
|
|
181
|
-
onClose: () => setActiveAction(null),
|
|
182
|
-
title: (activeAction == null ? void 0 : activeAction.operation.summary) || (activeAction == null ? void 0 : activeAction.operation.operationId) || "Action",
|
|
183
|
-
size: "lg",
|
|
184
|
-
children: activeAction && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
185
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
186
|
-
/* @__PURE__ */ jsx(MethodBadge, { method: activeAction.method }),
|
|
187
|
-
/* @__PURE__ */ jsx("code", { className: "rounded-md bg-muted px-2 py-1 text-sm", children: activeAction.path })
|
|
188
|
-
] }),
|
|
189
|
-
/* @__PURE__ */ jsx(
|
|
190
|
-
FilterForm,
|
|
191
|
-
{
|
|
192
|
-
client,
|
|
193
|
-
path: activeAction.path,
|
|
194
|
-
method: activeAction.method,
|
|
195
|
-
parameters: activeAction.operation.parameters ?? [],
|
|
196
|
-
lockedValues: { [idParameterName]: id },
|
|
197
|
-
hideLocked: true,
|
|
198
|
-
enableLookup: false,
|
|
199
|
-
submitLabel: "Execute request",
|
|
200
|
-
submittingLabel: "Executing…",
|
|
201
|
-
isSubmitting: isExecutingAction,
|
|
202
|
-
onSubmit: executeAction
|
|
203
|
-
}
|
|
204
|
-
),
|
|
205
|
-
actionError ? /* @__PURE__ */ jsx("div", { className: "rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive", children: actionError }) : actionResult ? /* @__PURE__ */ jsx(
|
|
206
|
-
ExecutionResult,
|
|
207
|
-
{
|
|
208
|
-
response: actionResult,
|
|
209
|
-
className: "mt-0",
|
|
210
|
-
...commandRuntime ? { commandRuntime } : {}
|
|
211
|
-
}
|
|
212
|
-
) : null
|
|
213
|
-
] })
|
|
214
|
-
}
|
|
215
|
-
)
|
|
164
|
+
] })
|
|
216
165
|
] });
|
|
217
166
|
}
|
|
218
167
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationEntityPage.js","sources":["../../src/rpc/OperationEntityPage.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { filterOperationsByDomain, findDetailEndpointForList, findListEndpoint } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceDetailOperation,\n findSurfaceEntityActions,\n findSurfaceListOperation,\n} from \"./clickyMetadata\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport { packParameterValues } from \"./formMetadata\";\nimport type { RenderLink } from \"./EndpointList\";\nimport type { DomainDefinition, ExecutionResponse, ResolvedOperation } from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationEntityPageProps = {\n id?: string;\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink?: RenderLink;\n allOperations?: boolean;\n operationIdPrefix?: string;\n listOperationId?: string;\n detailOperationId?: string;\n surfaceKey?: string;\n backHref?: string;\n backLabel?: string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n};\n\nfunction defaultRenderError(err: unknown, title: string) {\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n return (\n <div className=\"rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"font-medium\">{title}</div>\n {message && <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">{message}</div>}\n </div>\n );\n}\n\nexport function OperationEntityPage({\n id,\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n operationIdPrefix,\n listOperationId,\n detailOperationId,\n surfaceKey,\n backHref,\n backLabel = \"Back\",\n renderError = defaultRenderError,\n commandRuntime,\n}: OperationEntityPageProps) {\n const { operations, isLoading } = useOperations(client);\n const [activeAction, setActiveAction] = useState<ResolvedOperation | null>(null);\n const [actionResult, setActionResult] = useState<ExecutionResponse | null>(null);\n const [actionError, setActionError] = useState(\"\");\n const [isExecutingAction, setIsExecutingAction] = useState(false);\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return surfaceOps;\n }\n\n return (allOperations ? operations : filterOperationsByDomain(operations, entities)).filter(\n (op) =>\n operationIdPrefix ? (op.operation.operationId ?? \"\").startsWith(operationIdPrefix) : true,\n );\n }, [allOperations, entities, operationIdPrefix, operations, surfaceOps, useSurfaceMetadata]);\n\n const listEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceListOperation(domainOps, surfaceKey);\n }\n\n const explicitList = listOperationId\n ? domainOps.find((op) => op.method === \"get\" && op.operation.operationId === listOperationId)\n : undefined;\n return explicitList ?? findListEndpoint(domainOps, entities);\n }, [domainOps, entities, listOperationId, surfaceKey, useSurfaceMetadata]);\n\n const resolvedDetailEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceDetailOperation(domainOps, surfaceKey);\n }\n\n return detailOperationId\n ? domainOps.find(\n (op) => op.method === \"get\" && op.operation.operationId === detailOperationId,\n )\n : findDetailEndpointForList(domainOps, listEndpoint);\n }, [detailOperationId, domainOps, listEndpoint, surfaceKey, useSurfaceMetadata]);\n\n const idParameterName = useMemo(\n () =>\n resolvedDetailEndpoint?.operation.parameters?.find((param) => param.in === \"path\")?.name ??\n \"id\",\n [resolvedDetailEndpoint],\n );\n const detailValues = useMemo(() => (id ? { [idParameterName]: id } : {}), [id, idParameterName]);\n const actionOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceEntityActions(domainOps, surfaceKey);\n }\n\n return resolvedDetailEndpoint == null\n ? []\n : domainOps.filter(\n (op) => op.method !== \"get\" && op.path.startsWith(`${resolvedDetailEndpoint.path}/`),\n );\n }, [domainOps, resolvedDetailEndpoint, surfaceKey, useSurfaceMetadata]);\n\n const detailQuery = useQuery({\n queryKey: [\"entity-detail\", definition.key, id, resolvedDetailEndpoint?.path],\n queryFn: async () =>\n client.executeCommand(\n resolvedDetailEndpoint!.path,\n resolvedDetailEndpoint!.method,\n detailValues,\n { Accept: \"application/json+clicky\" },\n ),\n enabled: !!resolvedDetailEndpoint && !!id,\n staleTime: 30_000,\n retry: 0,\n });\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n async function executeAction(values: Record<string, string>) {\n if (!activeAction) return;\n setIsExecutingAction(true);\n setActionError(\"\");\n\n try {\n const response = await client.executeCommand(\n activeAction.path,\n activeAction.method,\n packParameterValues(values, activeAction.operation.parameters ?? []),\n { Accept: \"application/json+clicky\" },\n );\n setActionResult(response);\n await detailQuery.refetch();\n } catch (err) {\n setActionResult(null);\n setActionError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsExecutingAction(false);\n }\n }\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading entity…</div>;\n }\n\n if (!resolvedDetailEndpoint || !id) {\n return (\n <div className=\"space-y-4\">\n {backLink}\n <div className=\"text-sm text-muted-foreground\">Unknown entity detail route.</div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 space-y-2\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={resolvedDetailEndpoint.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">\n {resolvedDetailEndpoint.path}\n </code>\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {definition.title}: {id}\n </h1>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">{definition.description}</p>\n </div>\n </div>\n {actionOps.length > 0 && (\n <div className=\"flex shrink-0 flex-wrap justify-end gap-2\">\n {actionOps.map((op) => (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }}\n >\n {op.operation.summary || op.operation.operationId || op.path}\n </Button>\n ))}\n </div>\n )}\n </div>\n\n {detailQuery.isLoading ? (\n <section className=\"rounded-xl border bg-card p-4\">\n <h2 className=\"text-lg font-medium\">Entity detail</h2>\n <ExecutionResult loading loadingMessage=\"Loading entity detail…\" />\n </section>\n ) : detailQuery.isError ? (\n renderError(detailQuery.error, `Failed to load ${resolvedDetailEndpoint.path}`)\n ) : (\n <section className=\"rounded-xl border bg-card p-4\">\n <h2 className=\"text-lg font-medium\">Entity detail</h2>\n <ExecutionResult\n response={detailQuery.data ?? null}\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n </section>\n )}\n\n <Modal\n open={activeAction != null}\n onClose={() => setActiveAction(null)}\n title={activeAction?.operation.summary || activeAction?.operation.operationId || \"Action\"}\n size=\"lg\"\n >\n {activeAction && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={activeAction.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">{activeAction.path}</code>\n </div>\n <FilterForm\n client={client}\n path={activeAction.path}\n method={activeAction.method}\n parameters={activeAction.operation.parameters ?? []}\n lockedValues={{ [idParameterName]: id }}\n hideLocked\n enableLookup={false}\n submitLabel=\"Execute request\"\n submittingLabel=\"Executing…\"\n isSubmitting={isExecutingAction}\n onSubmit={executeAction}\n />\n {actionError ? (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {actionError}\n </div>\n ) : actionResult ? (\n <ExecutionResult\n response={actionResult}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\n </div>\n )}\n </Modal>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationEntityPage.js","sources":["../../src/rpc/OperationEntityPage.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { filterOperationsByDomain, findDetailEndpointForList, findListEndpoint } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceDetailOperation,\n findSurfaceEntityActions,\n findSurfaceListOperation,\n} from \"./clickyMetadata\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { OperationActionBar } from \"./OperationActionBar\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport type { RenderLink } from \"./EndpointList\";\nimport type { PreExtension, PostExtension } from \"../components/json-schema-form-types\";\nimport type { DomainDefinition } from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationEntityPageProps = {\n id?: string;\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink?: RenderLink;\n allOperations?: boolean;\n operationIdPrefix?: string;\n listOperationId?: string;\n detailOperationId?: string;\n surfaceKey?: string;\n backHref?: string;\n backLabel?: string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the edit form (e.g. a connection \"Test\"\n // button).\n formActions?: FormActionsRenderer;\n};\n\nfunction defaultRenderError(err: unknown, title: string) {\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n return (\n <div className=\"rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"font-medium\">{title}</div>\n {message && <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">{message}</div>}\n </div>\n );\n}\n\nexport function OperationEntityPage({\n id,\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n operationIdPrefix,\n listOperationId,\n detailOperationId,\n surfaceKey,\n backHref,\n backLabel = \"Back\",\n renderError = defaultRenderError,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n}: OperationEntityPageProps) {\n const { operations, isLoading } = useOperations(client);\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return surfaceOps;\n }\n\n return (allOperations ? operations : filterOperationsByDomain(operations, entities)).filter(\n (op) =>\n operationIdPrefix ? (op.operation.operationId ?? \"\").startsWith(operationIdPrefix) : true,\n );\n }, [allOperations, entities, operationIdPrefix, operations, surfaceOps, useSurfaceMetadata]);\n\n const listEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceListOperation(domainOps, surfaceKey);\n }\n\n const explicitList = listOperationId\n ? domainOps.find((op) => op.method === \"get\" && op.operation.operationId === listOperationId)\n : undefined;\n return explicitList ?? findListEndpoint(domainOps, entities);\n }, [domainOps, entities, listOperationId, surfaceKey, useSurfaceMetadata]);\n\n const resolvedDetailEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceDetailOperation(domainOps, surfaceKey);\n }\n\n return detailOperationId\n ? domainOps.find(\n (op) => op.method === \"get\" && op.operation.operationId === detailOperationId,\n )\n : findDetailEndpointForList(domainOps, listEndpoint);\n }, [detailOperationId, domainOps, listEndpoint, surfaceKey, useSurfaceMetadata]);\n\n const idParameterName = useMemo(\n () =>\n resolvedDetailEndpoint?.operation.parameters?.find((param) => param.in === \"path\")?.name ??\n \"id\",\n [resolvedDetailEndpoint],\n );\n const detailValues = useMemo(() => (id ? { [idParameterName]: id } : {}), [id, idParameterName]);\n const actionOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceEntityActions(domainOps, surfaceKey);\n }\n\n return resolvedDetailEndpoint == null\n ? []\n : domainOps.filter(\n (op) => op.method !== \"get\" && op.path.startsWith(`${resolvedDetailEndpoint.path}/`),\n );\n }, [domainOps, resolvedDetailEndpoint, surfaceKey, useSurfaceMetadata]);\n\n const detailQuery = useQuery({\n queryKey: [\"entity-detail\", definition.key, id, resolvedDetailEndpoint?.path],\n queryFn: async () =>\n client.executeCommand(\n resolvedDetailEndpoint!.path,\n resolvedDetailEndpoint!.method,\n detailValues,\n { Accept: \"application/json+clicky\" },\n ),\n enabled: !!resolvedDetailEndpoint && !!id,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Raw (non-clicky) detail used to pre-fill the schema-driven edit form. Only\n // resources whose detail endpoint returns a plain object (e.g. connections)\n // prefill; others (e.g. a profile detail that returns rows) start blank.\n const rawDetailQuery = useQuery({\n queryKey: [\"entity-detail-raw\", definition.key, id, resolvedDetailEndpoint?.path],\n queryFn: async () =>\n client.executeCommand(resolvedDetailEndpoint!.path, resolvedDetailEndpoint!.method, detailValues, {\n Accept: \"application/json\",\n }),\n enabled: !!resolvedDetailEndpoint && !!id,\n staleTime: 30_000,\n retry: 0,\n });\n const editInitialValue = useMemo(() => {\n const parsed = rawDetailQuery.data?.parsed;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n }, [rawDetailQuery.data]);\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading entity…</div>;\n }\n\n if (!resolvedDetailEndpoint || !id) {\n return (\n <div className=\"space-y-4\">\n {backLink}\n <div className=\"text-sm text-muted-foreground\">Unknown entity detail route.</div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 space-y-2\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={resolvedDetailEndpoint.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">\n {resolvedDetailEndpoint.path}\n </code>\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {definition.title}: {id}\n </h1>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">{definition.description}</p>\n </div>\n </div>\n </div>\n\n <OperationActionBar\n actions={actionOps}\n client={client}\n getLockedValues={() => ({ [idParameterName]: id })}\n onExecuted={() => void detailQuery.refetch()}\n hideLockedInForm\n {...(editInitialValue ? { initialValue: editInitialValue } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n />\n\n {detailQuery.isLoading ? (\n <section className=\"rounded-xl border bg-card p-4\">\n <h2 className=\"text-lg font-medium\">Entity detail</h2>\n <ExecutionResult loading loadingMessage=\"Loading entity detail…\" />\n </section>\n ) : detailQuery.isError ? (\n renderError(detailQuery.error, `Failed to load ${resolvedDetailEndpoint.path}`)\n ) : (\n <section className=\"rounded-xl border bg-card p-4\">\n <h2 className=\"text-lg font-medium\">Entity detail</h2>\n <ExecutionResult\n response={detailQuery.data ?? null}\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n </section>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const ExecutionResult = require("./ExecutionResult.cjs");
|
|
5
|
+
const rowNavigation = require("./rowNavigation.cjs");
|
|
6
|
+
function OperationResultView({
|
|
7
|
+
response,
|
|
8
|
+
loading,
|
|
9
|
+
loadingMessage,
|
|
10
|
+
emptyMessage,
|
|
11
|
+
ariaLabel,
|
|
12
|
+
className,
|
|
13
|
+
commandRuntime,
|
|
14
|
+
detailOperation,
|
|
15
|
+
filterConfig,
|
|
16
|
+
pagination
|
|
17
|
+
}) {
|
|
18
|
+
const rowNav = rowNavigation.useRowDetailNavigation(detailOperation);
|
|
19
|
+
const filters = filterConfig == null ? void 0 : filterConfig.filters;
|
|
20
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
21
|
+
ExecutionResult.ExecutionResult,
|
|
22
|
+
{
|
|
23
|
+
response,
|
|
24
|
+
...loading !== void 0 ? { loading } : {},
|
|
25
|
+
...loadingMessage ? { loadingMessage } : {},
|
|
26
|
+
...emptyMessage ? { emptyMessage } : {},
|
|
27
|
+
...ariaLabel ? { ariaLabel } : {},
|
|
28
|
+
...className ? { className } : {},
|
|
29
|
+
...commandRuntime ? { commandRuntime } : {},
|
|
30
|
+
...detailOperation ? {
|
|
31
|
+
getTableRowHref: rowNav.getRowHref,
|
|
32
|
+
onTableRowClick: rowNav.onRowClick,
|
|
33
|
+
isTableRowClickable: rowNav.isRowClickable
|
|
34
|
+
} : {},
|
|
35
|
+
...filters && filters.length > 0 ? { externalFilters: filters } : {},
|
|
36
|
+
...(filterConfig == null ? void 0 : filterConfig.search) ? { search: filterConfig.search } : {},
|
|
37
|
+
...(filterConfig == null ? void 0 : filterConfig.timeRange) ? { timeRange: filterConfig.timeRange } : {},
|
|
38
|
+
...pagination ? { pagination } : {}
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
exports.OperationResultView = OperationResultView;
|
|
43
|
+
//# sourceMappingURL=OperationResultView.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationResultView.cjs","sources":["../../src/rpc/OperationResultView.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { useRowDetailNavigation } from \"./rowNavigation\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\n\n// ResultRenderContext is handed to a host-supplied resultRenderer so it can\n// replace the default result surface for selected entities (e.g. render a\n// LogsTable for trace/log profiles). `defaultView` is the standard\n// OperationResultView element; return it unchanged to keep the default.\nexport type ResultRenderContext = {\n surfaceKey?: string;\n response: ExecutionResponse | null;\n defaultView: ReactNode;\n};\n\n// ResultRenderer lets the host app swap the result presentation per surface. It\n// receives the current surface key, the raw response, and the default view, and\n// returns whatever node should render in its place.\nexport type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;\n\n// In-table filter inputs for the result table — mirrors what\n// parametersToFormConfig produces, surfaced through the DataTable's own\n// FilterBar so the filter UI renders identically on every result surface.\nexport type OperationResultFilterConfig = {\n filters?: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n};\n\nexport type OperationResultViewProps = {\n response: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n commandRuntime?: ClickyCommandRuntime;\n // When set, rows navigate to the entity detail page (/<surface>/<id>).\n detailOperation?: ResolvedOperation | undefined;\n filterConfig?: OperationResultFilterConfig;\n pagination?: DataTablePagination;\n};\n\n// OperationResultView is the single result surface rendered by both the entity\n// list catalog and the operation runner. It renders the clicky result table\n// with its in-table FilterBar, the View/Download menu (automatic via the\n// response's requestUrl), pagination, and row→detail navigation — so the\n// surface looks and behaves identically wherever a result is shown.\nexport function OperationResultView({\n response,\n loading,\n loadingMessage,\n emptyMessage,\n ariaLabel,\n className,\n commandRuntime,\n detailOperation,\n filterConfig,\n pagination,\n}: OperationResultViewProps) {\n const rowNav = useRowDetailNavigation(detailOperation);\n const filters = filterConfig?.filters;\n\n return (\n <ExecutionResult\n response={response}\n {...(loading !== undefined ? { loading } : {})}\n {...(loadingMessage ? { loadingMessage } : {})}\n {...(emptyMessage ? { emptyMessage } : {})}\n {...(ariaLabel ? { ariaLabel } : {})}\n {...(className ? { className } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(detailOperation\n ? {\n getTableRowHref: rowNav.getRowHref,\n onTableRowClick: rowNav.onRowClick,\n isTableRowClickable: rowNav.isRowClickable,\n }\n : {})}\n {...(filters && filters.length > 0 ? { externalFilters: filters } : {})}\n {...(filterConfig?.search ? { search: filterConfig.search } : {})}\n {...(filterConfig?.timeRange\n ? { timeRange: filterConfig.timeRange }\n : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n}\n"],"names":["useRowDetailNavigation","jsx","ExecutionResult"],"mappings":";;;;;AAuDO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,SAASA,cAAAA,uBAAuB,eAAe;AACrD,QAAM,UAAU,6CAAc;AAE9B,SACEC,2BAAAA;AAAAA,IAACC,gBAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAA,IAAY,CAAA;AAAA,MAC1C,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACtC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,kBACD;AAAA,QACE,iBAAiB,OAAO;AAAA,QACxB,iBAAiB,OAAO;AAAA,QACxB,qBAAqB,OAAO;AAAA,MAAA,IAE9B,CAAA;AAAA,MACH,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,iBAAiB,QAAA,IAAY,CAAA;AAAA,MACnE,IAAI,6CAAc,UAAS,EAAE,QAAQ,aAAa,OAAA,IAAW,CAAA;AAAA,MAC7D,IAAI,6CAAc,aACf,EAAE,WAAW,aAAa,UAAA,IAC1B,CAAA;AAAA,MACH,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,IAAC;AAAA,EAAA;AAG1C;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { FilterBarFilter, FilterBarRangeProps, FilterBarSearchProps } from '../components/FilterBar';
|
|
3
|
+
import { DataTablePagination } from '../data/DataTable';
|
|
4
|
+
import { ClickyCommandRuntime } from '../data/Clicky';
|
|
5
|
+
import { ExecutionResponse, ResolvedOperation } from './types';
|
|
6
|
+
export type ResultRenderContext = {
|
|
7
|
+
surfaceKey?: string;
|
|
8
|
+
response: ExecutionResponse | null;
|
|
9
|
+
defaultView: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
export type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;
|
|
12
|
+
export type OperationResultFilterConfig = {
|
|
13
|
+
filters?: FilterBarFilter[];
|
|
14
|
+
search?: FilterBarSearchProps;
|
|
15
|
+
timeRange?: FilterBarRangeProps;
|
|
16
|
+
};
|
|
17
|
+
export type OperationResultViewProps = {
|
|
18
|
+
response: ExecutionResponse | null;
|
|
19
|
+
loading?: boolean;
|
|
20
|
+
loadingMessage?: string;
|
|
21
|
+
emptyMessage?: string;
|
|
22
|
+
ariaLabel?: string;
|
|
23
|
+
className?: string;
|
|
24
|
+
commandRuntime?: ClickyCommandRuntime;
|
|
25
|
+
detailOperation?: ResolvedOperation | undefined;
|
|
26
|
+
filterConfig?: OperationResultFilterConfig;
|
|
27
|
+
pagination?: DataTablePagination;
|
|
28
|
+
};
|
|
29
|
+
export declare function OperationResultView({ response, loading, loadingMessage, emptyMessage, ariaLabel, className, commandRuntime, detailOperation, filterConfig, pagination, }: OperationResultViewProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=OperationResultView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationResultView.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationResultView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAMpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,SAAS,CAAC;CACxB,CAAC;AAKF,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,SAAS,CAAC;AAKrE,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC,eAAe,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAChD,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AAOF,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,OAAO,EACP,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,cAAc,EACd,eAAe,EACf,YAAY,EACZ,UAAU,GACX,EAAE,wBAAwB,2CA4B1B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ExecutionResult } from "./ExecutionResult.js";
|
|
3
|
+
import { useRowDetailNavigation } from "./rowNavigation.js";
|
|
4
|
+
function OperationResultView({
|
|
5
|
+
response,
|
|
6
|
+
loading,
|
|
7
|
+
loadingMessage,
|
|
8
|
+
emptyMessage,
|
|
9
|
+
ariaLabel,
|
|
10
|
+
className,
|
|
11
|
+
commandRuntime,
|
|
12
|
+
detailOperation,
|
|
13
|
+
filterConfig,
|
|
14
|
+
pagination
|
|
15
|
+
}) {
|
|
16
|
+
const rowNav = useRowDetailNavigation(detailOperation);
|
|
17
|
+
const filters = filterConfig == null ? void 0 : filterConfig.filters;
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
ExecutionResult,
|
|
20
|
+
{
|
|
21
|
+
response,
|
|
22
|
+
...loading !== void 0 ? { loading } : {},
|
|
23
|
+
...loadingMessage ? { loadingMessage } : {},
|
|
24
|
+
...emptyMessage ? { emptyMessage } : {},
|
|
25
|
+
...ariaLabel ? { ariaLabel } : {},
|
|
26
|
+
...className ? { className } : {},
|
|
27
|
+
...commandRuntime ? { commandRuntime } : {},
|
|
28
|
+
...detailOperation ? {
|
|
29
|
+
getTableRowHref: rowNav.getRowHref,
|
|
30
|
+
onTableRowClick: rowNav.onRowClick,
|
|
31
|
+
isTableRowClickable: rowNav.isRowClickable
|
|
32
|
+
} : {},
|
|
33
|
+
...filters && filters.length > 0 ? { externalFilters: filters } : {},
|
|
34
|
+
...(filterConfig == null ? void 0 : filterConfig.search) ? { search: filterConfig.search } : {},
|
|
35
|
+
...(filterConfig == null ? void 0 : filterConfig.timeRange) ? { timeRange: filterConfig.timeRange } : {},
|
|
36
|
+
...pagination ? { pagination } : {}
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
OperationResultView
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=OperationResultView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationResultView.js","sources":["../../src/rpc/OperationResultView.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { useRowDetailNavigation } from \"./rowNavigation\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\n\n// ResultRenderContext is handed to a host-supplied resultRenderer so it can\n// replace the default result surface for selected entities (e.g. render a\n// LogsTable for trace/log profiles). `defaultView` is the standard\n// OperationResultView element; return it unchanged to keep the default.\nexport type ResultRenderContext = {\n surfaceKey?: string;\n response: ExecutionResponse | null;\n defaultView: ReactNode;\n};\n\n// ResultRenderer lets the host app swap the result presentation per surface. It\n// receives the current surface key, the raw response, and the default view, and\n// returns whatever node should render in its place.\nexport type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;\n\n// In-table filter inputs for the result table — mirrors what\n// parametersToFormConfig produces, surfaced through the DataTable's own\n// FilterBar so the filter UI renders identically on every result surface.\nexport type OperationResultFilterConfig = {\n filters?: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n};\n\nexport type OperationResultViewProps = {\n response: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n commandRuntime?: ClickyCommandRuntime;\n // When set, rows navigate to the entity detail page (/<surface>/<id>).\n detailOperation?: ResolvedOperation | undefined;\n filterConfig?: OperationResultFilterConfig;\n pagination?: DataTablePagination;\n};\n\n// OperationResultView is the single result surface rendered by both the entity\n// list catalog and the operation runner. It renders the clicky result table\n// with its in-table FilterBar, the View/Download menu (automatic via the\n// response's requestUrl), pagination, and row→detail navigation — so the\n// surface looks and behaves identically wherever a result is shown.\nexport function OperationResultView({\n response,\n loading,\n loadingMessage,\n emptyMessage,\n ariaLabel,\n className,\n commandRuntime,\n detailOperation,\n filterConfig,\n pagination,\n}: OperationResultViewProps) {\n const rowNav = useRowDetailNavigation(detailOperation);\n const filters = filterConfig?.filters;\n\n return (\n <ExecutionResult\n response={response}\n {...(loading !== undefined ? { loading } : {})}\n {...(loadingMessage ? { loadingMessage } : {})}\n {...(emptyMessage ? { emptyMessage } : {})}\n {...(ariaLabel ? { ariaLabel } : {})}\n {...(className ? { className } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(detailOperation\n ? {\n getTableRowHref: rowNav.getRowHref,\n onTableRowClick: rowNav.onRowClick,\n isTableRowClickable: rowNav.isRowClickable,\n }\n : {})}\n {...(filters && filters.length > 0 ? { externalFilters: filters } : {})}\n {...(filterConfig?.search ? { search: filterConfig.search } : {})}\n {...(filterConfig?.timeRange\n ? { timeRange: filterConfig.timeRange }\n : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n}\n"],"names":[],"mappings":";;;AAuDO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,SAAS,uBAAuB,eAAe;AACrD,QAAM,UAAU,6CAAc;AAE9B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAA,IAAY,CAAA;AAAA,MAC1C,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACtC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,kBACD;AAAA,QACE,iBAAiB,OAAO;AAAA,QACxB,iBAAiB,OAAO;AAAA,QACxB,qBAAqB,OAAO;AAAA,MAAA,IAE9B,CAAA;AAAA,MACH,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,iBAAiB,QAAA,IAAY,CAAA;AAAA,MACnE,IAAI,6CAAc,UAAS,EAAE,QAAQ,aAAa,OAAA,IAAW,CAAA;AAAA,MAC7D,IAAI,6CAAc,aACf,EAAE,WAAW,aAAa,UAAA,IAC1B,CAAA;AAAA,MACH,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,IAAC;AAAA,EAAA;AAG1C;"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const reactQuery = require("@tanstack/react-query");
|
|
6
|
+
const button = require("../components/button.cjs");
|
|
7
|
+
const JsonSchemaForm = require("../components/JsonSchemaForm.cjs");
|
|
8
|
+
const formLookupContext = require("../components/form-lookup-context.cjs");
|
|
9
|
+
const formMetadata = require("./formMetadata.cjs");
|
|
10
|
+
const schemaActionPath = require("./schemaActionPath.cjs");
|
|
11
|
+
function SchemaActionForm({
|
|
12
|
+
client,
|
|
13
|
+
action,
|
|
14
|
+
lockedValues,
|
|
15
|
+
initialValue,
|
|
16
|
+
submitLabel = "Save",
|
|
17
|
+
onSuccess,
|
|
18
|
+
formPre,
|
|
19
|
+
formPost,
|
|
20
|
+
footerActions,
|
|
21
|
+
fallback
|
|
22
|
+
}) {
|
|
23
|
+
const method = action.method.toUpperCase();
|
|
24
|
+
const canSchemaForm = Boolean(client.getSchema && client.submitForm && isMutation(method));
|
|
25
|
+
const schemaPath = schemaActionPath.collectionPath(action.path);
|
|
26
|
+
const lookupFetcher = react.useMemo(() => {
|
|
27
|
+
const lookup = client.lookupFilterOptions;
|
|
28
|
+
if (!lookup) return void 0;
|
|
29
|
+
return async ({ descriptor, query, rootValue }) => {
|
|
30
|
+
const extra = formLookupContext.resolveLookupScope(descriptor, rootValue);
|
|
31
|
+
const filter = await lookup.call(
|
|
32
|
+
client,
|
|
33
|
+
descriptor.url,
|
|
34
|
+
"GET",
|
|
35
|
+
descriptor.filter,
|
|
36
|
+
query,
|
|
37
|
+
extra
|
|
38
|
+
);
|
|
39
|
+
return formMetadata.lookupOptionsToFieldOptions(filter).map((o) => ({ value: o.value, label: o.label }));
|
|
40
|
+
};
|
|
41
|
+
}, [client]);
|
|
42
|
+
const schemaQuery = reactQuery.useQuery({
|
|
43
|
+
queryKey: ["entity-schema", schemaPath],
|
|
44
|
+
// react-query forbids undefined query data; normalize "no schema" to null.
|
|
45
|
+
queryFn: async () => await client.getSchema(schemaPath) ?? null,
|
|
46
|
+
enabled: canSchemaForm,
|
|
47
|
+
staleTime: 5 * 60 * 1e3,
|
|
48
|
+
retry: 0
|
|
49
|
+
});
|
|
50
|
+
const [value, setValue] = react.useState(initialValue ?? {});
|
|
51
|
+
const [error, setError] = react.useState("");
|
|
52
|
+
const [isSubmitting, setIsSubmitting] = react.useState(false);
|
|
53
|
+
if (!canSchemaForm) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: fallback });
|
|
54
|
+
if (schemaQuery.isLoading) {
|
|
55
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", children: "Loading form…" });
|
|
56
|
+
}
|
|
57
|
+
const schema = schemaQuery.data;
|
|
58
|
+
if (!schema) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: fallback });
|
|
59
|
+
async function handleSubmit() {
|
|
60
|
+
if (!client.submitForm) return;
|
|
61
|
+
setIsSubmitting(true);
|
|
62
|
+
setError("");
|
|
63
|
+
try {
|
|
64
|
+
const path = schemaActionPath.resolveActionPath(action.path, { ...schemaActionPath.scalarValues(value), ...lockedValues });
|
|
65
|
+
const response = await client.submitForm(path, method, value, {
|
|
66
|
+
Accept: "application/json+clicky"
|
|
67
|
+
});
|
|
68
|
+
if (response.error) {
|
|
69
|
+
setError(response.error);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
onSuccess == null ? void 0 : onSuccess(response);
|
|
73
|
+
} catch (err) {
|
|
74
|
+
setError(err instanceof Error ? err.message : String(err ?? "Unknown error"));
|
|
75
|
+
} finally {
|
|
76
|
+
setIsSubmitting(false);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
81
|
+
JsonSchemaForm.JsonSchemaForm,
|
|
82
|
+
{
|
|
83
|
+
schema,
|
|
84
|
+
value,
|
|
85
|
+
onChange: setValue,
|
|
86
|
+
...formPre ? { pre: formPre } : {},
|
|
87
|
+
...formPost ? { post: formPost } : {},
|
|
88
|
+
...lookupFetcher ? { lookupFetcher } : {}
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive", children: error }),
|
|
92
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-2", children: [
|
|
93
|
+
footerActions == null ? void 0 : footerActions({ value, action }),
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", onClick: handleSubmit, disabled: isSubmitting, children: isSubmitting ? "Saving…" : submitLabel })
|
|
95
|
+
] })
|
|
96
|
+
] });
|
|
97
|
+
}
|
|
98
|
+
function isMutation(method) {
|
|
99
|
+
return method === "POST" || method === "PUT" || method === "PATCH";
|
|
100
|
+
}
|
|
101
|
+
exports.SchemaActionForm = SchemaActionForm;
|
|
102
|
+
//# sourceMappingURL=SchemaActionForm.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaActionForm.cjs","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { resolveLookupScope } from \"../components/form-lookup-context\";\nimport type {\n JsonSchemaObject,\n LookupFetcher,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { lookupOptionsToFieldOptions } from \"./formMetadata\";\nimport { collectionPath, resolveActionPath, scalarValues } from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(client.getSchema && client.submitForm && isMutation(method));\n const schemaPath = collectionPath(action.path);\n\n // Resolve `x-clicky-lookup` fields against the live form value: fetch the\n // referenced entity's lookup options (server-side search) and scope them by a\n // sibling field. Undefined when the client has no lookup endpoint (the field\n // then degrades to a free-text combobox).\n const lookupFetcher: LookupFetcher | undefined = useMemo(() => {\n const lookup = client.lookupFilterOptions;\n if (!lookup) return undefined;\n return async ({ descriptor, query, rootValue }) => {\n const extra = resolveLookupScope(descriptor, rootValue);\n const filter = await lookup.call(\n client,\n descriptor.url,\n \"GET\",\n descriptor.filter,\n query,\n extra,\n );\n return lookupOptionsToFieldOptions(filter).map((o) => ({ value: o.value, label: o.label }));\n };\n }, [client]);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(initialValue ?? {});\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n if (!canSchemaForm) return <>{fallback}</>;\n if (schemaQuery.isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading form…</div>;\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{fallback}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, { ...scalarValues(value), ...lockedValues });\n const response = await client.submitForm(path, method, value, {\n Accept: \"application/json+clicky\",\n });\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsSubmitting(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action })}\n <Button type=\"button\" onClick={handleSubmit} disabled={isSubmitting}>\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n"],"names":["collectionPath","useMemo","resolveLookupScope","lookupOptionsToFieldOptions","useQuery","useState","jsx","Fragment","resolveActionPath","scalarValues","jsxs","JsonSchemaForm","Button"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { PreExtension, PostExtension } from '../components/json-schema-form-types';
|
|
3
|
+
import { ExecutionResponse, ResolvedOperation } from './types';
|
|
4
|
+
import { OperationsApiClient } from './useOperations';
|
|
5
|
+
export type FormActionContext = {
|
|
6
|
+
value: Record<string, unknown>;
|
|
7
|
+
action: ResolvedOperation;
|
|
8
|
+
};
|
|
9
|
+
export type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;
|
|
10
|
+
export type SchemaActionFormProps = {
|
|
11
|
+
client: OperationsApiClient;
|
|
12
|
+
action: ResolvedOperation;
|
|
13
|
+
lockedValues?: Record<string, string>;
|
|
14
|
+
initialValue?: Record<string, unknown>;
|
|
15
|
+
submitLabel?: string;
|
|
16
|
+
onSuccess?: (response: ExecutionResponse) => void;
|
|
17
|
+
formPre?: PreExtension[];
|
|
18
|
+
formPost?: PostExtension[];
|
|
19
|
+
footerActions?: FormActionsRenderer;
|
|
20
|
+
fallback: ReactNode;
|
|
21
|
+
};
|
|
22
|
+
export declare function SchemaActionForm({ client, action, lockedValues, initialValue, submitLabel, onSuccess, formPre, formPost, footerActions, fallback, }: SchemaActionFormProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=SchemaActionForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaActionForm.d.ts","sourceRoot":"","sources":["../../src/rpc/SchemaActionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK1D,OAAO,KAAK,EAGV,YAAY,EACZ,aAAa,EACd,MAAM,sCAAsC,CAAC;AAG9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,iBAAiB,CAAC;CAC3B,CAAC;AAIF,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC;AAExE,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAE5B,MAAM,EAAE,iBAAiB,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAGlD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAG3B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAGpC,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAMF,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,WAAoB,EACpB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,QAAQ,GACT,EAAE,qBAAqB,2CA0FvB"}
|