@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.cjs","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiListFlat, UiTable } from \"../icons\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceActions,\n findSurfaceListOperation,\n getOperationClickyMeta,\n surfaceActionLabel,\n} from \"./clickyMetadata\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport { applyFilterExtensions, type FilterExtension } from \"../components/filter-bar-utils\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n kind?: \"operations\" | \"configuration\";\n commandRuntime?: ClickyCommandRuntime;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\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 OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n kind,\n commandRuntime,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n const [view, setView] = useState<\"table\" | \"endpoints\">(\"table\");\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\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n // domainOps are the operations scoped to this domain: a surface's operations\n // when surfaceKey resolves, otherwise the entity-tagged operations — used only\n // to render the generic operation-page fallback, never to guess a table.\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations ? operations : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n // The list table is driven solely by x-clicky surface metadata. Without a\n // surface there is no authoritative list op, so listEndpoint stays undefined\n // and the catalog renders the generic EndpointList fallback instead of\n // guessing a table from operationId/path conventions.\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n const [filters, setFilters] = useState<Record<string, string>>(() => readFiltersFromUrl());\n const listParameters = listEndpoint?.operation.parameters ?? [];\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\"operation-list\", listEndpoint?.method, listEndpoint?.path, filters],\n queryFn: () =>\n client.executeCommand(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listEndpoint!.operation.parameters ?? []),\n {\n Accept: \"application/json+clicky\",\n },\n ),\n enabled: !!listEndpoint && view === \"table\",\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\"operation-lookup\", listEndpoint?.method, listEndpoint?.path, filters],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listParameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled: !!listEndpoint && view === \"table\" && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Action buttons come only from surface metadata. In the generic fallback the\n // EndpointList already exposes every operation as a runnable card, so there is\n // no separate action bar to guess at.\n const actionOps = useMemo(\n () => (useSurfaceMetadata ? findSurfaceActions(domainOps, surfaceKey) : []),\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [filters, listParameters, lookupQuery.data]);\n const dataTablePagination = useMemo(\n () => dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () => filterBarConfig.filters.map((filter) => applyFilterExtensions(filter, filterPre)),\n [filterBarConfig.filters, filterPre],\n );\n\n const hasTable = !!listEndpoint;\n const showTable = hasTable && view === \"table\";\n const sectionLabel =\n kind === \"configuration\" || definition.key.startsWith(\"config-\")\n ? \"Configuration\"\n : \"Operations\";\n const activeActionMeta = activeAction ? getOperationClickyMeta(activeAction) : undefined;\n\n const actionLockedValues = useMemo(() => {\n const meta = activeActionMeta;\n if (!activeAction || meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of activeAction.operation.parameters ?? []) {\n const value = filters[param.name];\n if (param.in === \"query\" && value) {\n locked[param.name] = value;\n }\n }\n\n if (meta.idParam) {\n locked[meta.idParam] = \"all\";\n }\n\n if ((activeAction.operation.parameters ?? []).some((param) => param.name === \"filter\")) {\n locked.filter =\n Object.entries(filters)\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"current list filters\";\n }\n\n return locked;\n }, [activeAction, activeActionMeta, filters]);\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 listQuery.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 (\n <div className=\"space-y-3\">\n <SkeletonBlock className=\"h-10 w-72\" />\n <SkeletonBlock className=\"h-4 w-[32rem]\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-12\" />\n ))}\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\">\n <p className=\"text-xs uppercase tracking-[0.18em] text-muted-foreground\">\n {sectionLabel}\n </p>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{definition.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{definition.description}</p>\n </div>\n {hasTable && (\n <div className=\"flex gap-1 rounded-lg border p-1\">\n <Button\n type=\"button\"\n variant={view === \"table\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Table view\"\n aria-pressed={view === \"table\"}\n onClick={() => setView(\"table\")}\n >\n <Icon icon={UiTable} />\n </Button>\n <Button\n type=\"button\"\n variant={view === \"endpoints\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Endpoint list view\"\n aria-pressed={view === \"endpoints\"}\n onClick={() => setView(\"endpoints\")}\n >\n <Icon icon={UiListFlat} />\n </Button>\n </div>\n )}\n </div>\n\n {actionOps.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {actionOps.map((op) => {\n const label = surfaceActionLabel(op);\n const summary = op.operation.summary || op.operation.description;\n const tooltip = summary ? `${label} — ${summary}` : label;\n // Every action opens the execution dialog (Modal) inline — the\n // FilterForm collects params (including any id an entity-scoped\n // action needs) and the result renders without leaving the list.\n return (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={tooltip}\n onClick={() => {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }}\n >\n <Icon icon={UiAdd} className=\"text-xs\" />\n {label}\n </Button>\n );\n })}\n </div>\n )}\n\n {showTable ? (\n <>\n {listQuery.isError && !listQuery.data ? (\n renderError(listQuery.error, `Failed to load ${listEndpoint?.path ?? \"\"}`)\n ) : (\n <ExecutionResult\n response={listQuery.data ?? null}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(filterBarConfig.search ? { search: filterBarConfig.search } : {})}\n {...(filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {})}\n {...(decoratedFilters.length > 0\n ? { externalFilters: decoratedFilters }\n : {})}\n {...(dataTablePagination ? { pagination: dataTablePagination } : {})}\n />\n )}\n </>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n\n <Modal\n open={activeAction != null}\n onClose={() => setActiveAction(null)}\n title={\n activeAction?.operation.summary ||\n activeActionMeta?.actionName ||\n activeAction?.operation.operationId ||\n \"Action\"\n }\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={actionLockedValues}\n enableLookup={Boolean(activeActionMeta?.supportsLookup)}\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\nfunction readFiltersFromUrl(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const search = new URLSearchParams(window.location.search);\n const values: Record<string, string> = {};\n for (const [key, value] of search.entries()) {\n if (key.startsWith(\"__\")) continue;\n if (value !== \"\") values[key] = value;\n }\n return values;\n}\n\nfunction SkeletonBlock({ className }: { className?: string }) {\n return <div className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()} />;\n}\n\nfunction writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = reservedSearchParamsFromUrl();\n for (const [key, value] of Object.entries(filters)) {\n if (value !== \"\") search.set(key, value);\n }\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n if (next !== `${window.location.pathname}${window.location.search}${window.location.hash}`) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n\nfunction reservedSearchParamsFromUrl() {\n const current = new URLSearchParams(window.location.search);\n const next = new URLSearchParams();\n for (const [key, value] of current.entries()) {\n if (!key.startsWith(\"__\")) continue;\n if (key === \"__autoRun\" || key.startsWith(\"__arg\")) continue;\n next.append(key, value);\n }\n return next;\n}\n"],"names":["jsxs","jsx","useOperations","useState","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","useEffect","useQuery","packParameterValues","keepPreviousData","findSurfaceActions","parametersToFormConfig","dataTablePaginationFromForm","applyFilterExtensions","getOperationClickyMeta","Button","Icon","UiTable","UiListFlat","surfaceActionLabel","UiAdd","Fragment","ExecutionResult","EndpointList","Modal","MethodBadge","FilterForm"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCatalog.cjs","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiListFlat, UiTable } from \"../icons\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationActionBar } from \"./OperationActionBar\";\nimport { OperationResultView, type ResultRenderer } from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n kind?: \"operations\" | \"configuration\";\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\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 && (\n <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">\n {message}\n </div>\n )}\n </div>\n );\n}\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n kind,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n resultRenderer,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n const [view, setView] = useState<\"table\" | \"endpoints\">(\"table\");\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n // domainOps are the operations scoped to this domain: a surface's operations\n // when surfaceKey resolves, otherwise the entity-tagged operations — used only\n // to render the generic operation-page fallback, never to guess a table.\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations\n ? operations\n : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n // The list table is driven solely by x-clicky surface metadata. Without a\n // surface there is no authoritative list op, so listEndpoint stays undefined\n // and the catalog renders the generic EndpointList fallback instead of\n // guessing a table from operationId/path conventions.\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n // The detail op turns each list row into a link to /<surface>/<id>; absent it\n // (no surface metadata) rows stay non-navigable.\n const detailOperation = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceDetailOperation(domainOps, surfaceKey)\n : undefined,\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n const [filters, setFilters] = useState<Record<string, string>>(() =>\n readFiltersFromUrl(),\n );\n const listParameters = listEndpoint?.operation.parameters ?? [];\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\n \"operation-list\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: () =>\n client.executeCommand(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listEndpoint!.operation.parameters ?? []),\n {\n Accept: \"application/json+clicky\",\n },\n ),\n enabled: !!listEndpoint && view === \"table\",\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\n \"operation-lookup\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listParameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled: !!listEndpoint && view === \"table\" && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // The list action bar shows only collection-scoped actions (create + bulk\n // actions that operate on the filtered set). Entity-scoped actions\n // (update/delete and per-id custom actions) need an {id}, so they live on the\n // detail page (OperationEntityPage) instead. In the generic fallback the\n // EndpointList already exposes every operation as a runnable card, so there is\n // no separate action bar to guess at.\n const actionOps = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceCollectionActions(domainOps, surfaceKey)\n : [],\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [filters, listParameters, lookupQuery.data]);\n const dataTablePagination = useMemo(\n () =>\n dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () =>\n filterBarConfig.filters.map((filter) =>\n applyFilterExtensions(filter, filterPre),\n ),\n [filterBarConfig.filters, filterPre],\n );\n\n const hasTable = !!listEndpoint;\n const showTable = hasTable && view === \"table\";\n const sectionLabel =\n kind === \"configuration\" || definition.key.startsWith(\"config-\")\n ? \"Configuration\"\n : \"Operations\";\n // Lock the current list filters into a bulk action (supportsFilterMode), so a\n // collection action like \"pause\" runs against the same set the table shows.\n // Entity-scoped actions never reach here (they live on the detail page).\n function getActionLockedValues(op: ResolvedOperation): Record<string, string> {\n const meta = getOperationClickyMeta(op);\n if (meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of op.operation.parameters ?? []) {\n const value = filters[param.name];\n if (param.in === \"query\" && value) {\n locked[param.name] = value;\n }\n }\n\n if (meta.idParam) {\n locked[meta.idParam] = \"all\";\n }\n\n if ((op.operation.parameters ?? []).some((param) => param.name === \"filter\")) {\n locked.filter =\n Object.entries(filters)\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"current list filters\";\n }\n\n return locked;\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3\">\n <SkeletonBlock className=\"h-10 w-72\" />\n <SkeletonBlock className=\"h-4 w-[32rem]\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-12\" />\n ))}\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\">\n <p className=\"text-xs uppercase tracking-[0.18em] text-muted-foreground\">\n {sectionLabel}\n </p>\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {definition.title}\n </h1>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">\n {definition.description}\n </p>\n </div>\n {hasTable && (\n <div className=\"flex gap-1 rounded-lg border p-1\">\n <Button\n type=\"button\"\n variant={view === \"table\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Table view\"\n aria-pressed={view === \"table\"}\n onClick={() => setView(\"table\")}\n >\n <Icon icon={UiTable} />\n </Button>\n <Button\n type=\"button\"\n variant={view === \"endpoints\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Endpoint list view\"\n aria-pressed={view === \"endpoints\"}\n onClick={() => setView(\"endpoints\")}\n >\n <Icon icon={UiListFlat} />\n </Button>\n </div>\n )}\n </div>\n\n <OperationActionBar\n actions={actionOps}\n client={client}\n getLockedValues={getActionLockedValues}\n onExecuted={() => void listQuery.refetch()}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n />\n\n {showTable ? (\n <>\n {listQuery.isError && !listQuery.data ? (\n renderError(\n listQuery.error,\n `Failed to load ${listEndpoint?.path ?? \"\"}`,\n )\n ) : (\n (() => {\n const defaultView = (\n <OperationResultView\n response={listQuery.data ?? null}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0\"\n detailOperation={detailOperation}\n filterConfig={{\n filters: decoratedFilters,\n ...(filterBarConfig.search\n ? { search: filterBarConfig.search }\n : {}),\n ...(filterBarConfig.timeRange\n ? { timeRange: filterBarConfig.timeRange }\n : {}),\n }}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n );\n return resultRenderer\n ? resultRenderer({\n response: listQuery.data ?? null,\n defaultView,\n ...(surfaceKey ? { surfaceKey } : {}),\n })\n : defaultView;\n })()\n )}\n </>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n </div>\n );\n}\n\nfunction readFiltersFromUrl(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const search = new URLSearchParams(window.location.search);\n const values: Record<string, string> = {};\n for (const [key, value] of search.entries()) {\n if (key.startsWith(\"__\")) continue;\n if (value !== \"\") values[key] = value;\n }\n return values;\n}\n\nfunction SkeletonBlock({ className }: { className?: string }) {\n return (\n <div\n className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()}\n />\n );\n}\n\nfunction writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = reservedSearchParamsFromUrl();\n for (const [key, value] of Object.entries(filters)) {\n if (value !== \"\") search.set(key, value);\n }\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n if (\n next !==\n `${window.location.pathname}${window.location.search}${window.location.hash}`\n ) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n\nfunction reservedSearchParamsFromUrl() {\n const current = new URLSearchParams(window.location.search);\n const next = new URLSearchParams();\n for (const [key, value] of current.entries()) {\n if (!key.startsWith(\"__\")) continue;\n if (key === \"__autoRun\" || key.startsWith(\"__arg\")) continue;\n next.append(key, value);\n }\n return next;\n}\n"],"names":["jsxs","jsx","useOperations","useState","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","findSurfaceDetailOperation","useEffect","useQuery","packParameterValues","keepPreviousData","findSurfaceCollectionActions","parametersToFormConfig","dataTablePaginationFromForm","applyFilterExtensions","getOperationClickyMeta","Button","Icon","UiTable","UiListFlat","OperationActionBar","Fragment","OperationResultView","EndpointList"],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { ClickyCommandRuntime } from '../data/Clicky';
|
|
3
3
|
import { RenderLink } from './EndpointList';
|
|
4
|
+
import { ResultRenderer } from './OperationResultView';
|
|
5
|
+
import { FormActionsRenderer } from './SchemaActionForm';
|
|
4
6
|
import { FilterExtension } from '../components/filter-bar-utils';
|
|
7
|
+
import { PreExtension, PostExtension } from '../components/json-schema-form-types';
|
|
5
8
|
import { DomainDefinition, ResolvedOperation } from './types';
|
|
6
9
|
import { OperationsApiClient } from './useOperations';
|
|
7
10
|
export type OperationCatalogProps = {
|
|
@@ -16,6 +19,10 @@ export type OperationCatalogProps = {
|
|
|
16
19
|
renderError?: (err: unknown, title: string) => ReactNode;
|
|
17
20
|
kind?: "operations" | "configuration";
|
|
18
21
|
commandRuntime?: ClickyCommandRuntime;
|
|
22
|
+
formPre?: PreExtension[];
|
|
23
|
+
formPost?: PostExtension[];
|
|
24
|
+
formActions?: FormActionsRenderer;
|
|
25
|
+
resultRenderer?: ResultRenderer;
|
|
19
26
|
};
|
|
20
|
-
export declare function OperationCatalog({ definition, entities, client, renderLink, allOperations, surfaceKey, filterPre, getCommandHref, renderError, kind, commandRuntime, }: OperationCatalogProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export declare function OperationCatalog({ definition, entities, client, renderLink, allOperations, surfaceKey, filterPre, getCommandHref, renderError, kind, commandRuntime, formPre, formPost, formActions, resultRenderer, }: OperationCatalogProps): import("react/jsx-runtime").JSX.Element;
|
|
21
28
|
//# sourceMappingURL=OperationCatalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCatalog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"OperationCatalog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCatalog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAarE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACd,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAQ1E,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;IAGvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,KAAK,MAAM,CAAC;IACxE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IACzD,IAAI,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC;IACtC,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAG3B,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAIlC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAkBF,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,QAAQ,EACR,MAAM,EACN,UAAU,EACV,aAAqB,EACrB,UAAU,EACV,SAAS,EACT,cAAmC,EACnC,WAAgC,EAChC,IAAI,EACJ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,GACf,EAAE,qBAAqB,2CAuRvB"}
|
|
@@ -3,19 +3,16 @@ import { useState, useMemo, useEffect } from "react";
|
|
|
3
3
|
import { useQuery, keepPreviousData } from "@tanstack/react-query";
|
|
4
4
|
import { Button } from "../components/button.js";
|
|
5
5
|
import { Icon } from "../data/Icon.js";
|
|
6
|
-
import { MethodBadge } from "../data/MethodBadge.js";
|
|
7
|
-
import { Modal } from "../overlay/Modal.js";
|
|
8
6
|
import { filterOperationsByDomain } from "./classify.js";
|
|
9
|
-
import { filterOperationsBySurface, findSurfaceListOperation,
|
|
7
|
+
import { filterOperationsBySurface, findSurfaceListOperation, findSurfaceDetailOperation, findSurfaceCollectionActions, getOperationClickyMeta } from "./clickyMetadata.js";
|
|
10
8
|
import { EndpointList } from "./EndpointList.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
9
|
+
import { OperationActionBar } from "./OperationActionBar.js";
|
|
10
|
+
import { OperationResultView } from "./OperationResultView.js";
|
|
13
11
|
import { applyFilterExtensions } from "../components/filter-bar-utils.js";
|
|
14
12
|
import { useOperations } from "./useOperations.js";
|
|
15
13
|
import { packParameterValues, parametersToFormConfig, dataTablePaginationFromForm } from "./formMetadata.js";
|
|
16
14
|
import { UiTable } from "../icons/components/UiTable.js";
|
|
17
15
|
import { UiListFlat } from "../icons/components/UiListFlat.js";
|
|
18
|
-
import { UiAdd } from "../icons/components/UiAdd.js";
|
|
19
16
|
const defaultCommandHref = (operationId) => `/commands/${operationId}`;
|
|
20
17
|
function defaultRenderError(err, title) {
|
|
21
18
|
const message = err instanceof Error ? err.message : String(err ?? "");
|
|
@@ -35,14 +32,14 @@ function OperationCatalog({
|
|
|
35
32
|
getCommandHref = defaultCommandHref,
|
|
36
33
|
renderError = defaultRenderError,
|
|
37
34
|
kind,
|
|
38
|
-
commandRuntime
|
|
35
|
+
commandRuntime,
|
|
36
|
+
formPre,
|
|
37
|
+
formPost,
|
|
38
|
+
formActions,
|
|
39
|
+
resultRenderer
|
|
39
40
|
}) {
|
|
40
41
|
const { operations, isLoading } = useOperations(client);
|
|
41
42
|
const [view, setView] = useState("table");
|
|
42
|
-
const [activeAction, setActiveAction] = useState(null);
|
|
43
|
-
const [actionResult, setActionResult] = useState(null);
|
|
44
|
-
const [actionError, setActionError] = useState("");
|
|
45
|
-
const [isExecutingAction, setIsExecutingAction] = useState(false);
|
|
46
43
|
const surfaceOps = useMemo(
|
|
47
44
|
() => filterOperationsBySurface(operations, surfaceKey),
|
|
48
45
|
[operations, surfaceKey]
|
|
@@ -56,13 +53,24 @@ function OperationCatalog({
|
|
|
56
53
|
if (!useSurfaceMetadata) return void 0;
|
|
57
54
|
return findSurfaceListOperation(domainOps, surfaceKey);
|
|
58
55
|
}, [domainOps, surfaceKey, useSurfaceMetadata]);
|
|
59
|
-
const
|
|
56
|
+
const detailOperation = useMemo(
|
|
57
|
+
() => useSurfaceMetadata ? findSurfaceDetailOperation(domainOps, surfaceKey) : void 0,
|
|
58
|
+
[domainOps, surfaceKey, useSurfaceMetadata]
|
|
59
|
+
);
|
|
60
|
+
const [filters, setFilters] = useState(
|
|
61
|
+
() => readFiltersFromUrl()
|
|
62
|
+
);
|
|
60
63
|
const listParameters = (listEndpoint == null ? void 0 : listEndpoint.operation.parameters) ?? [];
|
|
61
64
|
useEffect(() => {
|
|
62
65
|
writeFiltersToUrl(filters);
|
|
63
66
|
}, [filters]);
|
|
64
67
|
const listQuery = useQuery({
|
|
65
|
-
queryKey: [
|
|
68
|
+
queryKey: [
|
|
69
|
+
"operation-list",
|
|
70
|
+
listEndpoint == null ? void 0 : listEndpoint.method,
|
|
71
|
+
listEndpoint == null ? void 0 : listEndpoint.path,
|
|
72
|
+
filters
|
|
73
|
+
],
|
|
66
74
|
queryFn: () => client.executeCommand(
|
|
67
75
|
listEndpoint.path,
|
|
68
76
|
listEndpoint.method,
|
|
@@ -77,7 +85,12 @@ function OperationCatalog({
|
|
|
77
85
|
retry: 0
|
|
78
86
|
});
|
|
79
87
|
const lookupQuery = useQuery({
|
|
80
|
-
queryKey: [
|
|
88
|
+
queryKey: [
|
|
89
|
+
"operation-lookup",
|
|
90
|
+
listEndpoint == null ? void 0 : listEndpoint.method,
|
|
91
|
+
listEndpoint == null ? void 0 : listEndpoint.path,
|
|
92
|
+
filters
|
|
93
|
+
],
|
|
81
94
|
queryFn: async () => {
|
|
82
95
|
var _a;
|
|
83
96
|
return await ((_a = client.lookupFilters) == null ? void 0 : _a.call(
|
|
@@ -93,7 +106,7 @@ function OperationCatalog({
|
|
|
93
106
|
retry: 0
|
|
94
107
|
});
|
|
95
108
|
const actionOps = useMemo(
|
|
96
|
-
() => useSurfaceMetadata ?
|
|
109
|
+
() => useSurfaceMetadata ? findSurfaceCollectionActions(domainOps, surfaceKey) : [],
|
|
97
110
|
[domainOps, surfaceKey, useSurfaceMetadata]
|
|
98
111
|
);
|
|
99
112
|
const filterBarConfig = useMemo(() => {
|
|
@@ -110,20 +123,21 @@ function OperationCatalog({
|
|
|
110
123
|
[filterBarConfig.pagination, listQuery.data]
|
|
111
124
|
);
|
|
112
125
|
const decoratedFilters = useMemo(
|
|
113
|
-
() => filterBarConfig.filters.map(
|
|
126
|
+
() => filterBarConfig.filters.map(
|
|
127
|
+
(filter) => applyFilterExtensions(filter, filterPre)
|
|
128
|
+
),
|
|
114
129
|
[filterBarConfig.filters, filterPre]
|
|
115
130
|
);
|
|
116
131
|
const hasTable = !!listEndpoint;
|
|
117
132
|
const showTable = hasTable && view === "table";
|
|
118
133
|
const sectionLabel = kind === "configuration" || definition.key.startsWith("config-") ? "Configuration" : "Operations";
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (!activeAction || meta == null || !meta.supportsFilterMode) {
|
|
134
|
+
function getActionLockedValues(op) {
|
|
135
|
+
const meta = getOperationClickyMeta(op);
|
|
136
|
+
if (meta == null || !meta.supportsFilterMode) {
|
|
123
137
|
return {};
|
|
124
138
|
}
|
|
125
139
|
const locked = {};
|
|
126
|
-
for (const param of
|
|
140
|
+
for (const param of op.operation.parameters ?? []) {
|
|
127
141
|
const value = filters[param.name];
|
|
128
142
|
if (param.in === "query" && value) {
|
|
129
143
|
locked[param.name] = value;
|
|
@@ -132,30 +146,10 @@ function OperationCatalog({
|
|
|
132
146
|
if (meta.idParam) {
|
|
133
147
|
locked[meta.idParam] = "all";
|
|
134
148
|
}
|
|
135
|
-
if ((
|
|
149
|
+
if ((op.operation.parameters ?? []).some((param) => param.name === "filter")) {
|
|
136
150
|
locked.filter = Object.entries(filters).filter(([, value]) => value).map(([key, value]) => `${key}=${value}`).join(", ") || "current list filters";
|
|
137
151
|
}
|
|
138
152
|
return locked;
|
|
139
|
-
}, [activeAction, activeActionMeta, filters]);
|
|
140
|
-
async function executeAction(values) {
|
|
141
|
-
if (!activeAction) return;
|
|
142
|
-
setIsExecutingAction(true);
|
|
143
|
-
setActionError("");
|
|
144
|
-
try {
|
|
145
|
-
const response = await client.executeCommand(
|
|
146
|
-
activeAction.path,
|
|
147
|
-
activeAction.method,
|
|
148
|
-
packParameterValues(values, activeAction.operation.parameters ?? []),
|
|
149
|
-
{ Accept: "application/json+clicky" }
|
|
150
|
-
);
|
|
151
|
-
setActionResult(response);
|
|
152
|
-
await listQuery.refetch();
|
|
153
|
-
} catch (err) {
|
|
154
|
-
setActionResult(null);
|
|
155
|
-
setActionError(err instanceof Error ? err.message : String(err ?? "Unknown error"));
|
|
156
|
-
} finally {
|
|
157
|
-
setIsExecutingAction(false);
|
|
158
|
-
}
|
|
159
153
|
}
|
|
160
154
|
if (isLoading) {
|
|
161
155
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
@@ -200,46 +194,48 @@ function OperationCatalog({
|
|
|
200
194
|
)
|
|
201
195
|
] })
|
|
202
196
|
] }),
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
197
|
+
/* @__PURE__ */ jsx(
|
|
198
|
+
OperationActionBar,
|
|
199
|
+
{
|
|
200
|
+
actions: actionOps,
|
|
201
|
+
client,
|
|
202
|
+
getLockedValues: getActionLockedValues,
|
|
203
|
+
onExecuted: () => void listQuery.refetch(),
|
|
204
|
+
...commandRuntime ? { commandRuntime } : {},
|
|
205
|
+
...formPre ? { formPre } : {},
|
|
206
|
+
...formPost ? { formPost } : {},
|
|
207
|
+
...formActions ? { formActions } : {}
|
|
208
|
+
}
|
|
209
|
+
),
|
|
210
|
+
showTable ? /* @__PURE__ */ jsx(Fragment, { children: listQuery.isError && !listQuery.data ? renderError(
|
|
211
|
+
listQuery.error,
|
|
212
|
+
`Failed to load ${(listEndpoint == null ? void 0 : listEndpoint.path) ?? ""}`
|
|
213
|
+
) : (() => {
|
|
214
|
+
const defaultView = /* @__PURE__ */ jsx(
|
|
215
|
+
OperationResultView,
|
|
209
216
|
{
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
217
|
+
response: listQuery.data ?? null,
|
|
218
|
+
loading: listQuery.isFetching,
|
|
219
|
+
loadingMessage: `Loading ${definition.title} results…`,
|
|
220
|
+
emptyMessage: "No records returned",
|
|
221
|
+
ariaLabel: `${definition.title} results`,
|
|
222
|
+
className: "mt-0",
|
|
223
|
+
detailOperation,
|
|
224
|
+
filterConfig: {
|
|
225
|
+
filters: decoratedFilters,
|
|
226
|
+
...filterBarConfig.search ? { search: filterBarConfig.search } : {},
|
|
227
|
+
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {}
|
|
218
228
|
},
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
]
|
|
223
|
-
},
|
|
224
|
-
`${op.method}:${op.path}`
|
|
229
|
+
...commandRuntime ? { commandRuntime } : {},
|
|
230
|
+
...dataTablePagination ? { pagination: dataTablePagination } : {}
|
|
231
|
+
}
|
|
225
232
|
);
|
|
226
|
-
|
|
227
|
-
showTable ? /* @__PURE__ */ jsx(Fragment, { children: listQuery.isError && !listQuery.data ? renderError(listQuery.error, `Failed to load ${(listEndpoint == null ? void 0 : listEndpoint.path) ?? ""}`) : /* @__PURE__ */ jsx(
|
|
228
|
-
ExecutionResult,
|
|
229
|
-
{
|
|
233
|
+
return resultRenderer ? resultRenderer({
|
|
230
234
|
response: listQuery.data ?? null,
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
className: "mt-0",
|
|
236
|
-
...commandRuntime ? { commandRuntime } : {},
|
|
237
|
-
...filterBarConfig.search ? { search: filterBarConfig.search } : {},
|
|
238
|
-
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {},
|
|
239
|
-
...decoratedFilters.length > 0 ? { externalFilters: decoratedFilters } : {},
|
|
240
|
-
...dataTablePagination ? { pagination: dataTablePagination } : {}
|
|
241
|
-
}
|
|
242
|
-
) }) : /* @__PURE__ */ jsx(
|
|
235
|
+
defaultView,
|
|
236
|
+
...surfaceKey ? { surfaceKey } : {}
|
|
237
|
+
}) : defaultView;
|
|
238
|
+
})() }) : /* @__PURE__ */ jsx(
|
|
243
239
|
EndpointList,
|
|
244
240
|
{
|
|
245
241
|
operations: domainOps,
|
|
@@ -247,44 +243,6 @@ function OperationCatalog({
|
|
|
247
243
|
renderLink,
|
|
248
244
|
getCommandHref
|
|
249
245
|
}
|
|
250
|
-
),
|
|
251
|
-
/* @__PURE__ */ jsx(
|
|
252
|
-
Modal,
|
|
253
|
-
{
|
|
254
|
-
open: activeAction != null,
|
|
255
|
-
onClose: () => setActiveAction(null),
|
|
256
|
-
title: (activeAction == null ? void 0 : activeAction.operation.summary) || (activeActionMeta == null ? void 0 : activeActionMeta.actionName) || (activeAction == null ? void 0 : activeAction.operation.operationId) || "Action",
|
|
257
|
-
size: "lg",
|
|
258
|
-
children: activeAction && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
259
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
260
|
-
/* @__PURE__ */ jsx(MethodBadge, { method: activeAction.method }),
|
|
261
|
-
/* @__PURE__ */ jsx("code", { className: "rounded-md bg-muted px-2 py-1 text-sm", children: activeAction.path })
|
|
262
|
-
] }),
|
|
263
|
-
/* @__PURE__ */ jsx(
|
|
264
|
-
FilterForm,
|
|
265
|
-
{
|
|
266
|
-
client,
|
|
267
|
-
path: activeAction.path,
|
|
268
|
-
method: activeAction.method,
|
|
269
|
-
parameters: activeAction.operation.parameters ?? [],
|
|
270
|
-
lockedValues: actionLockedValues,
|
|
271
|
-
enableLookup: Boolean(activeActionMeta == null ? void 0 : activeActionMeta.supportsLookup),
|
|
272
|
-
submitLabel: "Execute request",
|
|
273
|
-
submittingLabel: "Executing…",
|
|
274
|
-
isSubmitting: isExecutingAction,
|
|
275
|
-
onSubmit: executeAction
|
|
276
|
-
}
|
|
277
|
-
),
|
|
278
|
-
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(
|
|
279
|
-
ExecutionResult,
|
|
280
|
-
{
|
|
281
|
-
response: actionResult,
|
|
282
|
-
className: "mt-0",
|
|
283
|
-
...commandRuntime ? { commandRuntime } : {}
|
|
284
|
-
}
|
|
285
|
-
) : null
|
|
286
|
-
] })
|
|
287
|
-
}
|
|
288
246
|
)
|
|
289
247
|
] });
|
|
290
248
|
}
|
|
@@ -299,7 +257,12 @@ function readFiltersFromUrl() {
|
|
|
299
257
|
return values;
|
|
300
258
|
}
|
|
301
259
|
function SkeletonBlock({ className }) {
|
|
302
|
-
return /* @__PURE__ */ jsx(
|
|
260
|
+
return /* @__PURE__ */ jsx(
|
|
261
|
+
"div",
|
|
262
|
+
{
|
|
263
|
+
className: `animate-pulse rounded-md bg-muted ${className ?? ""}`.trim()
|
|
264
|
+
}
|
|
265
|
+
);
|
|
303
266
|
}
|
|
304
267
|
function writeFiltersToUrl(filters) {
|
|
305
268
|
if (typeof window === "undefined") return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.js","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiListFlat, UiTable } from \"../icons\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceActions,\n findSurfaceListOperation,\n getOperationClickyMeta,\n surfaceActionLabel,\n} from \"./clickyMetadata\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport { applyFilterExtensions, type FilterExtension } from \"../components/filter-bar-utils\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n kind?: \"operations\" | \"configuration\";\n commandRuntime?: ClickyCommandRuntime;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\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 OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n kind,\n commandRuntime,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n const [view, setView] = useState<\"table\" | \"endpoints\">(\"table\");\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\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n // domainOps are the operations scoped to this domain: a surface's operations\n // when surfaceKey resolves, otherwise the entity-tagged operations — used only\n // to render the generic operation-page fallback, never to guess a table.\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations ? operations : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n // The list table is driven solely by x-clicky surface metadata. Without a\n // surface there is no authoritative list op, so listEndpoint stays undefined\n // and the catalog renders the generic EndpointList fallback instead of\n // guessing a table from operationId/path conventions.\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n const [filters, setFilters] = useState<Record<string, string>>(() => readFiltersFromUrl());\n const listParameters = listEndpoint?.operation.parameters ?? [];\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\"operation-list\", listEndpoint?.method, listEndpoint?.path, filters],\n queryFn: () =>\n client.executeCommand(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listEndpoint!.operation.parameters ?? []),\n {\n Accept: \"application/json+clicky\",\n },\n ),\n enabled: !!listEndpoint && view === \"table\",\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\"operation-lookup\", listEndpoint?.method, listEndpoint?.path, filters],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listParameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled: !!listEndpoint && view === \"table\" && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Action buttons come only from surface metadata. In the generic fallback the\n // EndpointList already exposes every operation as a runnable card, so there is\n // no separate action bar to guess at.\n const actionOps = useMemo(\n () => (useSurfaceMetadata ? findSurfaceActions(domainOps, surfaceKey) : []),\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [filters, listParameters, lookupQuery.data]);\n const dataTablePagination = useMemo(\n () => dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () => filterBarConfig.filters.map((filter) => applyFilterExtensions(filter, filterPre)),\n [filterBarConfig.filters, filterPre],\n );\n\n const hasTable = !!listEndpoint;\n const showTable = hasTable && view === \"table\";\n const sectionLabel =\n kind === \"configuration\" || definition.key.startsWith(\"config-\")\n ? \"Configuration\"\n : \"Operations\";\n const activeActionMeta = activeAction ? getOperationClickyMeta(activeAction) : undefined;\n\n const actionLockedValues = useMemo(() => {\n const meta = activeActionMeta;\n if (!activeAction || meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of activeAction.operation.parameters ?? []) {\n const value = filters[param.name];\n if (param.in === \"query\" && value) {\n locked[param.name] = value;\n }\n }\n\n if (meta.idParam) {\n locked[meta.idParam] = \"all\";\n }\n\n if ((activeAction.operation.parameters ?? []).some((param) => param.name === \"filter\")) {\n locked.filter =\n Object.entries(filters)\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"current list filters\";\n }\n\n return locked;\n }, [activeAction, activeActionMeta, filters]);\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 listQuery.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 (\n <div className=\"space-y-3\">\n <SkeletonBlock className=\"h-10 w-72\" />\n <SkeletonBlock className=\"h-4 w-[32rem]\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-12\" />\n ))}\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\">\n <p className=\"text-xs uppercase tracking-[0.18em] text-muted-foreground\">\n {sectionLabel}\n </p>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{definition.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{definition.description}</p>\n </div>\n {hasTable && (\n <div className=\"flex gap-1 rounded-lg border p-1\">\n <Button\n type=\"button\"\n variant={view === \"table\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Table view\"\n aria-pressed={view === \"table\"}\n onClick={() => setView(\"table\")}\n >\n <Icon icon={UiTable} />\n </Button>\n <Button\n type=\"button\"\n variant={view === \"endpoints\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Endpoint list view\"\n aria-pressed={view === \"endpoints\"}\n onClick={() => setView(\"endpoints\")}\n >\n <Icon icon={UiListFlat} />\n </Button>\n </div>\n )}\n </div>\n\n {actionOps.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {actionOps.map((op) => {\n const label = surfaceActionLabel(op);\n const summary = op.operation.summary || op.operation.description;\n const tooltip = summary ? `${label} — ${summary}` : label;\n // Every action opens the execution dialog (Modal) inline — the\n // FilterForm collects params (including any id an entity-scoped\n // action needs) and the result renders without leaving the list.\n return (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={tooltip}\n onClick={() => {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }}\n >\n <Icon icon={UiAdd} className=\"text-xs\" />\n {label}\n </Button>\n );\n })}\n </div>\n )}\n\n {showTable ? (\n <>\n {listQuery.isError && !listQuery.data ? (\n renderError(listQuery.error, `Failed to load ${listEndpoint?.path ?? \"\"}`)\n ) : (\n <ExecutionResult\n response={listQuery.data ?? null}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(filterBarConfig.search ? { search: filterBarConfig.search } : {})}\n {...(filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {})}\n {...(decoratedFilters.length > 0\n ? { externalFilters: decoratedFilters }\n : {})}\n {...(dataTablePagination ? { pagination: dataTablePagination } : {})}\n />\n )}\n </>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n\n <Modal\n open={activeAction != null}\n onClose={() => setActiveAction(null)}\n title={\n activeAction?.operation.summary ||\n activeActionMeta?.actionName ||\n activeAction?.operation.operationId ||\n \"Action\"\n }\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={actionLockedValues}\n enableLookup={Boolean(activeActionMeta?.supportsLookup)}\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\nfunction readFiltersFromUrl(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const search = new URLSearchParams(window.location.search);\n const values: Record<string, string> = {};\n for (const [key, value] of search.entries()) {\n if (key.startsWith(\"__\")) continue;\n if (value !== \"\") values[key] = value;\n }\n return values;\n}\n\nfunction SkeletonBlock({ className }: { className?: string }) {\n return <div className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()} />;\n}\n\nfunction writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = reservedSearchParamsFromUrl();\n for (const [key, value] of Object.entries(filters)) {\n if (value !== \"\") search.set(key, value);\n }\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n if (next !== `${window.location.pathname}${window.location.search}${window.location.hash}`) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n\nfunction reservedSearchParamsFromUrl() {\n const current = new URLSearchParams(window.location.search);\n const next = new URLSearchParams();\n for (const [key, value] of current.entries()) {\n if (!key.startsWith(\"__\")) continue;\n if (key === \"__autoRun\" || key.startsWith(\"__arg\")) continue;\n next.append(key, value);\n }\n return next;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCatalog.js","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiListFlat, UiTable } from \"../icons\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationActionBar } from \"./OperationActionBar\";\nimport { OperationResultView, type ResultRenderer } from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n kind?: \"operations\" | \"configuration\";\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\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 && (\n <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">\n {message}\n </div>\n )}\n </div>\n );\n}\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n kind,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n resultRenderer,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n const [view, setView] = useState<\"table\" | \"endpoints\">(\"table\");\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n // domainOps are the operations scoped to this domain: a surface's operations\n // when surfaceKey resolves, otherwise the entity-tagged operations — used only\n // to render the generic operation-page fallback, never to guess a table.\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations\n ? operations\n : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n // The list table is driven solely by x-clicky surface metadata. Without a\n // surface there is no authoritative list op, so listEndpoint stays undefined\n // and the catalog renders the generic EndpointList fallback instead of\n // guessing a table from operationId/path conventions.\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n // The detail op turns each list row into a link to /<surface>/<id>; absent it\n // (no surface metadata) rows stay non-navigable.\n const detailOperation = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceDetailOperation(domainOps, surfaceKey)\n : undefined,\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n const [filters, setFilters] = useState<Record<string, string>>(() =>\n readFiltersFromUrl(),\n );\n const listParameters = listEndpoint?.operation.parameters ?? [];\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\n \"operation-list\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: () =>\n client.executeCommand(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listEndpoint!.operation.parameters ?? []),\n {\n Accept: \"application/json+clicky\",\n },\n ),\n enabled: !!listEndpoint && view === \"table\",\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\n \"operation-lookup\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listParameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled: !!listEndpoint && view === \"table\" && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // The list action bar shows only collection-scoped actions (create + bulk\n // actions that operate on the filtered set). Entity-scoped actions\n // (update/delete and per-id custom actions) need an {id}, so they live on the\n // detail page (OperationEntityPage) instead. In the generic fallback the\n // EndpointList already exposes every operation as a runnable card, so there is\n // no separate action bar to guess at.\n const actionOps = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceCollectionActions(domainOps, surfaceKey)\n : [],\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [filters, listParameters, lookupQuery.data]);\n const dataTablePagination = useMemo(\n () =>\n dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () =>\n filterBarConfig.filters.map((filter) =>\n applyFilterExtensions(filter, filterPre),\n ),\n [filterBarConfig.filters, filterPre],\n );\n\n const hasTable = !!listEndpoint;\n const showTable = hasTable && view === \"table\";\n const sectionLabel =\n kind === \"configuration\" || definition.key.startsWith(\"config-\")\n ? \"Configuration\"\n : \"Operations\";\n // Lock the current list filters into a bulk action (supportsFilterMode), so a\n // collection action like \"pause\" runs against the same set the table shows.\n // Entity-scoped actions never reach here (they live on the detail page).\n function getActionLockedValues(op: ResolvedOperation): Record<string, string> {\n const meta = getOperationClickyMeta(op);\n if (meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of op.operation.parameters ?? []) {\n const value = filters[param.name];\n if (param.in === \"query\" && value) {\n locked[param.name] = value;\n }\n }\n\n if (meta.idParam) {\n locked[meta.idParam] = \"all\";\n }\n\n if ((op.operation.parameters ?? []).some((param) => param.name === \"filter\")) {\n locked.filter =\n Object.entries(filters)\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"current list filters\";\n }\n\n return locked;\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3\">\n <SkeletonBlock className=\"h-10 w-72\" />\n <SkeletonBlock className=\"h-4 w-[32rem]\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-12\" />\n ))}\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\">\n <p className=\"text-xs uppercase tracking-[0.18em] text-muted-foreground\">\n {sectionLabel}\n </p>\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {definition.title}\n </h1>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">\n {definition.description}\n </p>\n </div>\n {hasTable && (\n <div className=\"flex gap-1 rounded-lg border p-1\">\n <Button\n type=\"button\"\n variant={view === \"table\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Table view\"\n aria-pressed={view === \"table\"}\n onClick={() => setView(\"table\")}\n >\n <Icon icon={UiTable} />\n </Button>\n <Button\n type=\"button\"\n variant={view === \"endpoints\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Endpoint list view\"\n aria-pressed={view === \"endpoints\"}\n onClick={() => setView(\"endpoints\")}\n >\n <Icon icon={UiListFlat} />\n </Button>\n </div>\n )}\n </div>\n\n <OperationActionBar\n actions={actionOps}\n client={client}\n getLockedValues={getActionLockedValues}\n onExecuted={() => void listQuery.refetch()}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n />\n\n {showTable ? (\n <>\n {listQuery.isError && !listQuery.data ? (\n renderError(\n listQuery.error,\n `Failed to load ${listEndpoint?.path ?? \"\"}`,\n )\n ) : (\n (() => {\n const defaultView = (\n <OperationResultView\n response={listQuery.data ?? null}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0\"\n detailOperation={detailOperation}\n filterConfig={{\n filters: decoratedFilters,\n ...(filterBarConfig.search\n ? { search: filterBarConfig.search }\n : {}),\n ...(filterBarConfig.timeRange\n ? { timeRange: filterBarConfig.timeRange }\n : {}),\n }}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n );\n return resultRenderer\n ? resultRenderer({\n response: listQuery.data ?? null,\n defaultView,\n ...(surfaceKey ? { surfaceKey } : {}),\n })\n : defaultView;\n })()\n )}\n </>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n </div>\n );\n}\n\nfunction readFiltersFromUrl(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const search = new URLSearchParams(window.location.search);\n const values: Record<string, string> = {};\n for (const [key, value] of search.entries()) {\n if (key.startsWith(\"__\")) continue;\n if (value !== \"\") values[key] = value;\n }\n return values;\n}\n\nfunction SkeletonBlock({ className }: { className?: string }) {\n return (\n <div\n className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()}\n />\n );\n}\n\nfunction writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = reservedSearchParamsFromUrl();\n for (const [key, value] of Object.entries(filters)) {\n if (value !== \"\") search.set(key, value);\n }\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n if (\n next !==\n `${window.location.pathname}${window.location.search}${window.location.hash}`\n ) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n\nfunction reservedSearchParamsFromUrl() {\n const current = new URLSearchParams(window.location.search);\n const next = new URLSearchParams();\n for (const [key, value] of current.entries()) {\n if (!key.startsWith(\"__\")) continue;\n if (key === \"__autoRun\" || key.startsWith(\"__arg\")) continue;\n next.append(key, value);\n }\n return next;\n}\n"],"names":[],"mappings":"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"}
|