@flanksource/clicky-ui 0.1.0 → 0.2.1
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/README.md +29 -2
- package/dist/api-explorer.d.ts +5 -0
- package/dist/api-explorer.d.ts.map +1 -0
- package/dist/api-explorer.js +25 -0
- package/dist/api-explorer.js.map +1 -0
- package/dist/clicky.d.ts +2 -0
- package/dist/clicky.d.ts.map +1 -0
- package/dist/clicky.js +5 -0
- package/dist/clicky.js.map +1 -0
- package/dist/components/DatePicker.d.ts +18 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker.js +63 -0
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/components/DateTimePicker.d.ts +18 -0
- package/dist/components/DateTimePicker.d.ts.map +1 -0
- package/dist/components/DateTimePicker.js +84 -0
- package/dist/components/DateTimePicker.js.map +1 -0
- package/dist/components/FilterBar.d.ts +180 -0
- package/dist/components/FilterBar.d.ts.map +1 -0
- package/dist/components/FilterBar.js +1685 -0
- package/dist/components/FilterBar.js.map +1 -0
- package/dist/components/MultiSelect.d.ts +19 -0
- package/dist/components/MultiSelect.d.ts.map +1 -0
- package/dist/components/MultiSelect.js +143 -0
- package/dist/components/MultiSelect.js.map +1 -0
- package/dist/components/RangeSlider.d.ts +16 -0
- package/dist/components/RangeSlider.d.ts.map +1 -0
- package/dist/components/RangeSlider.js +92 -0
- package/dist/components/RangeSlider.js.map +1 -0
- package/dist/components/button.d.ts +21 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +126 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/density-switcher.d.ts +7 -0
- package/dist/components/density-switcher.d.ts.map +1 -0
- package/dist/components/density-switcher.js +32 -0
- package/dist/components/density-switcher.js.map +1 -0
- package/dist/components/icon-menu-picker.d.ts +22 -0
- package/dist/components/icon-menu-picker.d.ts.map +1 -0
- package/dist/components/icon-menu-picker.js +181 -0
- package/dist/components/icon-menu-picker.js.map +1 -0
- package/dist/components/select.d.ts +15 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +39 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/theme-switcher.d.ts +7 -0
- package/dist/components/theme-switcher.d.ts.map +1 -0
- package/dist/components/theme-switcher.js +42 -0
- package/dist/components/theme-switcher.js.map +1 -0
- package/dist/components.d.ts +14 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +31 -0
- package/dist/components.js.map +1 -0
- package/dist/data/AnsiHtml.d.ts +7 -0
- package/dist/data/AnsiHtml.d.ts.map +1 -0
- package/dist/data/AnsiHtml.js +71 -0
- package/dist/data/AnsiHtml.js.map +1 -0
- package/dist/data/Avatar.d.ts +32 -0
- package/dist/data/Avatar.d.ts.map +1 -0
- package/dist/data/Avatar.js +201 -0
- package/dist/data/Avatar.js.map +1 -0
- package/dist/data/AvatarBadge.d.ts +26 -0
- package/dist/data/AvatarBadge.d.ts.map +1 -0
- package/dist/data/AvatarBadge.js +104 -0
- package/dist/data/AvatarBadge.js.map +1 -0
- package/dist/data/Badge.d.ts +44 -0
- package/dist/data/Badge.d.ts.map +1 -0
- package/dist/data/Badge.js +667 -0
- package/dist/data/Badge.js.map +1 -0
- package/dist/data/Clicky.d.ts +147 -0
- package/dist/data/Clicky.d.ts.map +1 -0
- package/dist/data/Clicky.fixtures.d.ts +3 -0
- package/dist/data/Clicky.fixtures.d.ts.map +1 -0
- package/dist/data/Clicky.js +1960 -0
- package/dist/data/Clicky.js.map +1 -0
- package/dist/data/DataTable.d.ts +95 -0
- package/dist/data/DataTable.d.ts.map +1 -0
- package/dist/data/DataTable.js +1464 -0
- package/dist/data/DataTable.js.map +1 -0
- package/dist/data/FilterPill.d.ts +29 -0
- package/dist/data/FilterPill.d.ts.map +1 -0
- package/dist/data/FilterPill.js +153 -0
- package/dist/data/FilterPill.js.map +1 -0
- package/dist/data/Gauge.d.ts +15 -0
- package/dist/data/Gauge.d.ts.map +1 -0
- package/dist/data/Gauge.js +63 -0
- package/dist/data/Gauge.js.map +1 -0
- package/dist/data/Icon.d.ts +53 -0
- package/dist/data/Icon.d.ts.map +1 -0
- package/dist/data/Icon.js +115 -0
- package/dist/data/Icon.js.map +1 -0
- package/dist/data/JsonView.d.ts +8 -0
- package/dist/data/JsonView.d.ts.map +1 -0
- package/dist/data/JsonView.js +74 -0
- package/dist/data/JsonView.js.map +1 -0
- package/dist/data/KeyValueList.d.ts +17 -0
- package/dist/data/KeyValueList.d.ts.map +1 -0
- package/dist/data/KeyValueList.js +33 -0
- package/dist/data/KeyValueList.js.map +1 -0
- package/dist/data/LogViewer.d.ts +10 -0
- package/dist/data/LogViewer.d.ts.map +1 -0
- package/dist/data/LogViewer.js +46 -0
- package/dist/data/LogViewer.js.map +1 -0
- package/dist/data/LogsTable.d.ts +27 -0
- package/dist/data/LogsTable.d.ts.map +1 -0
- package/dist/data/LogsTable.js +580 -0
- package/dist/data/LogsTable.js.map +1 -0
- package/dist/data/Markdown.d.ts +6 -0
- package/dist/data/Markdown.d.ts.map +1 -0
- package/dist/data/Markdown.js +59 -0
- package/dist/data/Markdown.js.map +1 -0
- package/dist/data/MatrixTable.d.ts +22 -0
- package/dist/data/MatrixTable.d.ts.map +1 -0
- package/dist/data/MatrixTable.js +164 -0
- package/dist/data/MatrixTable.js.map +1 -0
- package/dist/data/MethodBadge.d.ts +6 -0
- package/dist/data/MethodBadge.d.ts.map +1 -0
- package/dist/data/MethodBadge.js +18 -0
- package/dist/data/MethodBadge.js.map +1 -0
- package/dist/data/ProgressBar.d.ts +13 -0
- package/dist/data/ProgressBar.d.ts.map +1 -0
- package/dist/data/ProgressBar.js +34 -0
- package/dist/data/ProgressBar.js.map +1 -0
- package/dist/data/SortableHeader.d.ts +12 -0
- package/dist/data/SortableHeader.d.ts.map +1 -0
- package/dist/data/SortableHeader.js +33 -0
- package/dist/data/SortableHeader.js.map +1 -0
- package/dist/data/TabButton.d.ts +12 -0
- package/dist/data/TabButton.d.ts.map +1 -0
- package/dist/data/TabButton.js +45 -0
- package/dist/data/TabButton.js.map +1 -0
- package/dist/data/Tree.d.ts +35 -0
- package/dist/data/Tree.d.ts.map +1 -0
- package/dist/data/Tree.js +236 -0
- package/dist/data/Tree.js.map +1 -0
- package/dist/data/TreeGroupHeader.d.ts +11 -0
- package/dist/data/TreeGroupHeader.d.ts.map +1 -0
- package/dist/data/TreeGroupHeader.js +41 -0
- package/dist/data/TreeGroupHeader.js.map +1 -0
- package/dist/data/TreeNode.d.ts +43 -0
- package/dist/data/TreeNode.d.ts.map +1 -0
- package/dist/data/TreeNode.js +100 -0
- package/dist/data/TreeNode.js.map +1 -0
- package/dist/data/cells/StatusDot.d.ts +11 -0
- package/dist/data/cells/StatusDot.d.ts.map +1 -0
- package/dist/data/cells/StatusDot.js +38 -0
- package/dist/data/cells/StatusDot.js.map +1 -0
- package/dist/data/cells/TagList.d.ts +59 -0
- package/dist/data/cells/TagList.d.ts.map +1 -0
- package/dist/data/cells/TagList.js +257 -0
- package/dist/data/cells/TagList.js.map +1 -0
- package/dist/data/cells/Timestamp.d.ts +46 -0
- package/dist/data/cells/Timestamp.d.ts.map +1 -0
- package/dist/data/cells/Timestamp.js +146 -0
- package/dist/data/cells/Timestamp.js.map +1 -0
- package/dist/data/cells/status-mapping.d.ts +8 -0
- package/dist/data/cells/status-mapping.d.ts.map +1 -0
- package/dist/data/cells/status-mapping.js +44 -0
- package/dist/data/cells/status-mapping.js.map +1 -0
- package/dist/data/code-highlight.d.ts +12 -0
- package/dist/data/code-highlight.d.ts.map +1 -0
- package/dist/data/code-highlight.js +28 -0
- package/dist/data/code-highlight.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +9 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +445 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsTree.d.ts +9 -0
- package/dist/data/diagnostics/DiagnosticsTree.d.ts.map +1 -0
- package/dist/data/diagnostics/DiagnosticsTree.js +78 -0
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.d.ts +20 -0
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.js +157 -0
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -0
- package/dist/data/diagnostics/GoroutineCard.d.ts +10 -0
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -0
- package/dist/data/diagnostics/GoroutineCard.js +75 -0
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.d.ts +11 -0
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.js +26 -0
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -0
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +18 -0
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -0
- package/dist/data/diagnostics/RenderedStackTrace.js +235 -0
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -0
- package/dist/data/diagnostics/ThreadCard.d.ts +10 -0
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -0
- package/dist/data/diagnostics/ThreadCard.js +78 -0
- package/dist/data/diagnostics/ThreadCard.js.map +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts +26 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -0
- package/dist/data/diagnostics/error-diagnostics.js +108 -0
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -0
- package/dist/data/diagnostics/fixtures.d.ts +3 -0
- package/dist/data/diagnostics/fixtures.d.ts.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.d.ts +34 -0
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.js +190 -0
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -0
- package/dist/data/diagnostics/stacktrace-parse.d.ts +11 -0
- package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -0
- package/dist/data/diagnostics/stacktrace-parse.js +87 -0
- package/dist/data/diagnostics/stacktrace-parse.js.map +1 -0
- package/dist/data/diagnostics/stacktrace.d.ts +38 -0
- package/dist/data/diagnostics/stacktrace.d.ts.map +1 -0
- package/dist/data/diagnostics/stacktrace.js +119 -0
- package/dist/data/diagnostics/stacktrace.js.map +1 -0
- package/dist/data/diagnostics/types.d.ts +30 -0
- package/dist/data/diagnostics/types.d.ts.map +1 -0
- package/dist/data/diagnostics/utils.d.ts +8 -0
- package/dist/data/diagnostics/utils.d.ts.map +1 -0
- package/dist/data/diagnostics/utils.js +59 -0
- package/dist/data/diagnostics/utils.js.map +1 -0
- package/dist/data/har/HarPanel.d.ts +9 -0
- package/dist/data/har/HarPanel.d.ts.map +1 -0
- package/dist/data/har/HarPanel.js +175 -0
- package/dist/data/har/HarPanel.js.map +1 -0
- package/dist/data/har/fixtures.d.ts +3 -0
- package/dist/data/har/fixtures.d.ts.map +1 -0
- package/dist/data/har/types.d.ts +47 -0
- package/dist/data/har/types.d.ts.map +1 -0
- package/dist/data.d.ts +39 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +109 -0
- package/dist/data.js.map +1 -0
- package/dist/hooks/use-density.d.ts +22 -0
- package/dist/hooks/use-density.d.ts.map +1 -0
- package/dist/hooks/use-density.js +54 -0
- package/dist/hooks/use-density.js.map +1 -0
- package/dist/hooks/use-history-route.d.ts +6 -0
- package/dist/hooks/use-history-route.d.ts.map +1 -0
- package/dist/hooks/use-history-route.js +31 -0
- package/dist/hooks/use-history-route.js.map +1 -0
- package/dist/hooks/use-sort.d.ts +17 -0
- package/dist/hooks/use-sort.d.ts.map +1 -0
- package/dist/hooks/use-sort.js +42 -0
- package/dist/hooks/use-sort.js.map +1 -0
- package/dist/hooks/use-theme.d.ts +17 -0
- package/dist/hooks/use-theme.d.ts.map +1 -0
- package/dist/hooks/use-theme.js +68 -0
- package/dist/hooks/use-theme.js.map +1 -0
- package/dist/hooks.d.ts +5 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +14 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +193 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/Section.d.ts +23 -0
- package/dist/layout/Section.d.ts.map +1 -0
- package/dist/layout/Section.js +73 -0
- package/dist/layout/Section.js.map +1 -0
- package/dist/layout/SplitPane.d.ts +13 -0
- package/dist/layout/SplitPane.d.ts.map +1 -0
- package/dist/layout/SplitPane.js +72 -0
- package/dist/layout/SplitPane.js.map +1 -0
- package/dist/lib/palette.d.ts +4 -0
- package/dist/lib/palette.d.ts.map +1 -0
- package/dist/lib/palette.js +35 -0
- package/dist/lib/palette.js.map +1 -0
- package/dist/lib/size.d.ts +6 -0
- package/dist/lib/size.d.ts.map +1 -0
- package/dist/lib/size.js +14 -0
- package/dist/lib/size.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/overlay/HoverCard.d.ts +13 -0
- package/dist/overlay/HoverCard.d.ts.map +1 -0
- package/dist/overlay/HoverCard.js +170 -0
- package/dist/overlay/HoverCard.js.map +1 -0
- package/dist/overlay/Modal.d.ts +17 -0
- package/dist/overlay/Modal.d.ts.map +1 -0
- package/dist/overlay/Modal.js +91 -0
- package/dist/overlay/Modal.js.map +1 -0
- package/dist/rpc/AcceptPicker.d.ts +52 -0
- package/dist/rpc/AcceptPicker.d.ts.map +1 -0
- package/dist/rpc/AcceptPicker.js +126 -0
- package/dist/rpc/AcceptPicker.js.map +1 -0
- package/dist/rpc/ApiExplorer.d.ts +11 -0
- package/dist/rpc/ApiExplorer.d.ts.map +1 -0
- package/dist/rpc/ApiExplorer.js +37 -0
- package/dist/rpc/ApiExplorer.js.map +1 -0
- package/dist/rpc/CommandForm.d.ts +15 -0
- package/dist/rpc/CommandForm.d.ts.map +1 -0
- package/dist/rpc/CommandForm.js +356 -0
- package/dist/rpc/CommandForm.js.map +1 -0
- package/dist/rpc/CommandOutput.d.ts +11 -0
- package/dist/rpc/CommandOutput.d.ts.map +1 -0
- package/dist/rpc/CommandOutput.js +195 -0
- package/dist/rpc/CommandOutput.js.map +1 -0
- package/dist/rpc/EndpointList.d.ts +18 -0
- package/dist/rpc/EndpointList.d.ts.map +1 -0
- package/dist/rpc/EndpointList.js +56 -0
- package/dist/rpc/EndpointList.js.map +1 -0
- package/dist/rpc/EntityExplorerApp.d.ts +15 -0
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -0
- package/dist/rpc/EntityExplorerApp.js +282 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -0
- package/dist/rpc/ExecutionResult.d.ts +14 -0
- package/dist/rpc/ExecutionResult.d.ts.map +1 -0
- package/dist/rpc/ExecutionResult.js +51 -0
- package/dist/rpc/ExecutionResult.js.map +1 -0
- package/dist/rpc/FilterForm.d.ts +22 -0
- package/dist/rpc/FilterForm.d.ts.map +1 -0
- package/dist/rpc/FilterForm.js +392 -0
- package/dist/rpc/FilterForm.js.map +1 -0
- package/dist/rpc/InlineError.d.ts +7 -0
- package/dist/rpc/InlineError.d.ts.map +1 -0
- package/dist/rpc/InlineError.js +54 -0
- package/dist/rpc/InlineError.js.map +1 -0
- package/dist/rpc/OperationActionDialog.d.ts +12 -0
- package/dist/rpc/OperationActionDialog.d.ts.map +1 -0
- package/dist/rpc/OperationActionDialog.js +105 -0
- package/dist/rpc/OperationActionDialog.js.map +1 -0
- package/dist/rpc/OperationCatalog.d.ts +21 -0
- package/dist/rpc/OperationCatalog.d.ts.map +1 -0
- package/dist/rpc/OperationCatalog.js +339 -0
- package/dist/rpc/OperationCatalog.js.map +1 -0
- package/dist/rpc/OperationCommandPage.d.ts +22 -0
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -0
- package/dist/rpc/OperationCommandPage.js +484 -0
- package/dist/rpc/OperationCommandPage.js.map +1 -0
- package/dist/rpc/OperationEntityPage.d.ts +23 -0
- package/dist/rpc/OperationEntityPage.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPage.js +218 -0
- package/dist/rpc/OperationEntityPage.js.map +1 -0
- package/dist/rpc/classify.d.ts +8 -0
- package/dist/rpc/classify.d.ts.map +1 -0
- package/dist/rpc/classify.js +76 -0
- package/dist/rpc/classify.js.map +1 -0
- package/dist/rpc/clickyMetadata.d.ts +12 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -0
- package/dist/rpc/clickyMetadata.js +71 -0
- package/dist/rpc/clickyMetadata.js.map +1 -0
- package/dist/rpc/formMetadata.d.ts +27 -0
- package/dist/rpc/formMetadata.d.ts.map +1 -0
- package/dist/rpc/formMetadata.js +250 -0
- package/dist/rpc/formMetadata.js.map +1 -0
- package/dist/rpc/types.d.ts +109 -0
- package/dist/rpc/types.d.ts.map +1 -0
- package/dist/rpc/types.js +8 -0
- package/dist/rpc/types.js.map +1 -0
- package/dist/rpc/useOperations.d.ts +346 -0
- package/dist/rpc/useOperations.d.ts.map +1 -0
- package/dist/rpc/useOperations.js +31 -0
- package/dist/rpc/useOperations.js.map +1 -0
- package/dist/rpc.d.ts +14 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +37 -0
- package/dist/rpc.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/styles.d.ts +1 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +2 -0
- package/dist/styles.js.map +1 -0
- package/dist/tailwind-preset.d.ts +4 -0
- package/dist/tailwind-preset.d.ts.map +1 -0
- package/dist/tailwind-preset.js +69 -0
- package/dist/tailwind-preset.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/package.json +83 -40
- package/dist/index.d.mts +0 -834
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -2918
- package/dist/index.mjs.map +0 -1
- package/dist/tailwind-preset.d.mts +0 -7
- package/dist/tailwind-preset.d.mts.map +0 -1
- package/dist/tailwind-preset.mjs +0 -64
- package/dist/tailwind-preset.mjs.map +0 -1
- package/src/styles/tokens.css +0 -78
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationActionDialog.js","sources":["../../src/rpc/OperationActionDialog.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { Modal } from \"../overlay/Modal\";\nimport { CommandForm } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport { InlineError } from \"./InlineError\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\nexport type OperationActionDialogProps = {\n operation: ResolvedOperation;\n client: OperationsApiClient;\n initialValues: Record<string, string>;\n label: string;\n defaultAccept?: string;\n onNavigateAction?: (href: string) => void;\n};\n\nexport function OperationActionDialog({\n operation,\n client,\n initialValues,\n label,\n defaultAccept = \"application/clicky+json\",\n onNavigateAction,\n}: OperationActionDialogProps) {\n const [open, setOpen] = useState(false);\n const [isExecuting, setIsExecuting] = useState(false);\n const [response, setResponse] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n\n async function handleExecute(params: Record<string, string>, headers: Record<string, string>) {\n if (onNavigateAction) {\n const href = hrefForOperationAction(operation.path, params);\n if (!href) return;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n onNavigateAction(`${href}${separator}autoRun=1`);\n return;\n }\n\n setIsExecuting(true);\n setError(null);\n setResponse(null);\n try {\n const result = await client.executeCommand(operation.path, operation.method, params, headers);\n setResponse(result);\n } catch (err) {\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n return (\n <>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setOpen(true)}>\n <Icon name=\"codicon:play\" />\n {label}\n </Button>\n <Modal open={open} onClose={() => setOpen(false)} title={label} size=\"lg\">\n <div className=\"space-y-4\">\n <CommandForm\n parameters={operation.operation.parameters ?? []}\n onExecute={handleExecute}\n isPending={isExecuting}\n method={operation.method}\n path={operation.path}\n accept={defaultAccept}\n initialValues={initialValues}\n />\n\n {error ? (\n <InlineError title={`Failed to execute ${operation.path}`} error={error} />\n ) : response ? (\n <CommandOutput response={response} />\n ) : null}\n </div>\n </Modal>\n </>\n );\n}\n\nfunction hrefForOperationAction(path: string, params: Record<string, string>): string | undefined {\n const nextParams = { ...params };\n const args = parseArgsParam(params.args);\n let route = apiPathToRoutePath(path);\n\n for (const [index, name] of pathParamNames(path).entries()) {\n const value = nextParams[name] || args[index];\n if (!value) return undefined;\n route = route.replace(`:${name}`, encodeURIComponent(value));\n delete nextParams[name];\n if (!nextParams[name] && value === args[index]) {\n delete nextParams.args;\n }\n }\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(nextParams)) {\n if (value && key !== \"autoRun\") search.set(key, value);\n }\n const query = search.toString();\n return query ? `${route}?${query}` : route;\n}\n\nfunction apiPathToRoutePath(path: string): string {\n const cliPath = path\n .trim()\n .replace(/^\\/api\\/v1\\/?/, \"\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n if (!cliPath) return \"/\";\n return `/${cliPath.replace(/\\{([^}]+)\\}/g, \":$1\")}`;\n}\n\nfunction pathParamNames(path: string): string[] {\n return [...path.matchAll(/\\{([^}]+)\\}/g)]\n .map((match) => match[1])\n .filter((name): name is string => Boolean(name));\n}\n\nfunction parseArgsParam(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed.toLowerCase() === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited args below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ClickyCommandRuntime } from '../data/Clicky';
|
|
3
|
+
import { RenderLink } from './EndpointList';
|
|
4
|
+
import { DomainDefinition, ResolvedOperation } from './types';
|
|
5
|
+
import { OperationsApiClient } from './useOperations';
|
|
6
|
+
export type OperationCatalogProps = {
|
|
7
|
+
definition: DomainDefinition;
|
|
8
|
+
entities: string[];
|
|
9
|
+
client: OperationsApiClient;
|
|
10
|
+
renderLink: RenderLink;
|
|
11
|
+
allOperations?: boolean;
|
|
12
|
+
operationIdPrefix?: string;
|
|
13
|
+
listOperationId?: string;
|
|
14
|
+
surfaceKey?: string;
|
|
15
|
+
getCommandHref?: (operationId: string, op: ResolvedOperation) => string;
|
|
16
|
+
renderError?: (err: unknown, title: string) => ReactNode;
|
|
17
|
+
kind?: "operations" | "configuration";
|
|
18
|
+
commandRuntime?: ClickyCommandRuntime;
|
|
19
|
+
};
|
|
20
|
+
export declare function OperationCatalog({ definition, entities, client, renderLink, allOperations, operationIdPrefix, listOperationId, surfaceKey, getCommandHref, renderError, kind, commandRuntime, }: OperationCatalogProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=OperationCatalog.d.ts.map
|
|
@@ -0,0 +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;AAcrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG/D,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,iBAAiB,EAEvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAO1E,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;IAGxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,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;CACvC,CAAC;AAcF,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,QAAQ,EACR,MAAM,EACN,UAAU,EACV,aAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,cAAmC,EACnC,WAAgC,EAChC,IAAI,EACJ,cAAc,GACf,EAAE,qBAAqB,2CAyUvB"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo, useEffect } from "react";
|
|
3
|
+
import { useQuery } from "@tanstack/react-query";
|
|
4
|
+
import { Button } from "../components/button.js";
|
|
5
|
+
import { FilterBar } from "../components/FilterBar.js";
|
|
6
|
+
import { Icon } from "../data/Icon.js";
|
|
7
|
+
import { MethodBadge } from "../data/MethodBadge.js";
|
|
8
|
+
import { Modal } from "../overlay/Modal.js";
|
|
9
|
+
import { filterOperationsByDomain, findListEndpoint } from "./classify.js";
|
|
10
|
+
import { filterOperationsBySurface, findSurfaceListOperation, findSurfaceCollectionActions, getOperationClickyMeta } from "./clickyMetadata.js";
|
|
11
|
+
import { EndpointList } from "./EndpointList.js";
|
|
12
|
+
import { ExecutionResult } from "./ExecutionResult.js";
|
|
13
|
+
import { FilterForm } from "./FilterForm.js";
|
|
14
|
+
import { isPositionalParam } from "./types.js";
|
|
15
|
+
import { useOperations } from "./useOperations.js";
|
|
16
|
+
import { packParameterValues, parametersToFormConfig } from "./formMetadata.js";
|
|
17
|
+
const defaultCommandHref = (operationId) => `/commands/${operationId}`;
|
|
18
|
+
function defaultRenderError(err, title) {
|
|
19
|
+
const message = err instanceof Error ? err.message : String(err ?? "");
|
|
20
|
+
return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive", children: [
|
|
21
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium", children: title }),
|
|
22
|
+
message && /* @__PURE__ */ jsx("div", { className: "mt-1 whitespace-pre-wrap text-xs opacity-80", children: message })
|
|
23
|
+
] });
|
|
24
|
+
}
|
|
25
|
+
function OperationCatalog({
|
|
26
|
+
definition,
|
|
27
|
+
entities,
|
|
28
|
+
client,
|
|
29
|
+
renderLink,
|
|
30
|
+
allOperations = false,
|
|
31
|
+
operationIdPrefix,
|
|
32
|
+
listOperationId,
|
|
33
|
+
surfaceKey,
|
|
34
|
+
getCommandHref = defaultCommandHref,
|
|
35
|
+
renderError = defaultRenderError,
|
|
36
|
+
kind,
|
|
37
|
+
commandRuntime
|
|
38
|
+
}) {
|
|
39
|
+
const { operations, isLoading } = useOperations(client);
|
|
40
|
+
const [view, setView] = useState("table");
|
|
41
|
+
const [activeAction, setActiveAction] = useState(null);
|
|
42
|
+
const [actionResult, setActionResult] = useState(null);
|
|
43
|
+
const [actionError, setActionError] = useState("");
|
|
44
|
+
const [isExecutingAction, setIsExecutingAction] = useState(false);
|
|
45
|
+
const surfaceOps = useMemo(
|
|
46
|
+
() => filterOperationsBySurface(operations, surfaceKey),
|
|
47
|
+
[operations, surfaceKey]
|
|
48
|
+
);
|
|
49
|
+
const useSurfaceMetadata = surfaceOps.length > 0;
|
|
50
|
+
const domainOps = useMemo(() => {
|
|
51
|
+
if (useSurfaceMetadata) {
|
|
52
|
+
return surfaceOps;
|
|
53
|
+
}
|
|
54
|
+
return (allOperations ? operations : filterOperationsByDomain(operations, entities)).filter(
|
|
55
|
+
(op) => operationIdPrefix ? (op.operation.operationId ?? "").startsWith(operationIdPrefix) : true
|
|
56
|
+
);
|
|
57
|
+
}, [allOperations, entities, operationIdPrefix, operations, surfaceOps, useSurfaceMetadata]);
|
|
58
|
+
const listEndpoint = useMemo(() => {
|
|
59
|
+
if (useSurfaceMetadata) {
|
|
60
|
+
return findSurfaceListOperation(domainOps, surfaceKey);
|
|
61
|
+
}
|
|
62
|
+
return listOperationId ? domainOps.find((op) => op.method === "get" && op.operation.operationId === listOperationId) : findListEndpoint(domainOps, entities);
|
|
63
|
+
}, [domainOps, entities, listOperationId, surfaceKey, useSurfaceMetadata]);
|
|
64
|
+
const [filters, setFilters] = useState(() => readFiltersFromUrl());
|
|
65
|
+
const listParameters = (listEndpoint == null ? void 0 : listEndpoint.operation.parameters) ?? [];
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
writeFiltersToUrl(filters);
|
|
68
|
+
}, [filters]);
|
|
69
|
+
const listQuery = useQuery({
|
|
70
|
+
queryKey: ["operation-list", listEndpoint == null ? void 0 : listEndpoint.method, listEndpoint == null ? void 0 : listEndpoint.path, filters],
|
|
71
|
+
queryFn: () => client.executeCommand(
|
|
72
|
+
listEndpoint.path,
|
|
73
|
+
listEndpoint.method,
|
|
74
|
+
packParameterValues(filters, listEndpoint.operation.parameters ?? []),
|
|
75
|
+
{
|
|
76
|
+
Accept: "application/json+clicky"
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
enabled: !!listEndpoint && view === "table",
|
|
80
|
+
staleTime: 3e4,
|
|
81
|
+
retry: 0
|
|
82
|
+
});
|
|
83
|
+
const lookupQuery = useQuery({
|
|
84
|
+
queryKey: ["operation-lookup", listEndpoint == null ? void 0 : listEndpoint.method, listEndpoint == null ? void 0 : listEndpoint.path, filters],
|
|
85
|
+
queryFn: async () => {
|
|
86
|
+
var _a;
|
|
87
|
+
return await ((_a = client.lookupFilters) == null ? void 0 : _a.call(
|
|
88
|
+
client,
|
|
89
|
+
listEndpoint.path,
|
|
90
|
+
listEndpoint.method,
|
|
91
|
+
packParameterValues(filters, listParameters),
|
|
92
|
+
{ Accept: "application/json+clicky" }
|
|
93
|
+
)) ?? { filters: {} };
|
|
94
|
+
},
|
|
95
|
+
enabled: !!listEndpoint && view === "table" && !!client.lookupFilters,
|
|
96
|
+
staleTime: 3e4,
|
|
97
|
+
retry: 0
|
|
98
|
+
});
|
|
99
|
+
const actionOps = useMemo(() => {
|
|
100
|
+
if (useSurfaceMetadata) {
|
|
101
|
+
return findSurfaceCollectionActions(domainOps, surfaceKey);
|
|
102
|
+
}
|
|
103
|
+
return domainOps.filter(
|
|
104
|
+
(op) => {
|
|
105
|
+
var _a;
|
|
106
|
+
return op.method !== "get" && !op.path.includes("{") && !((_a = op.operation.parameters) == null ? void 0 : _a.some((p) => p.in === "path" || isPositionalParam(p)));
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
}, [domainOps, surfaceKey, useSurfaceMetadata]);
|
|
110
|
+
const filterBarConfig = useMemo(() => {
|
|
111
|
+
const options = {
|
|
112
|
+
includeLocations: ["query"]
|
|
113
|
+
};
|
|
114
|
+
if (lookupQuery.data != null) {
|
|
115
|
+
options.lookup = lookupQuery.data;
|
|
116
|
+
}
|
|
117
|
+
return parametersToFormConfig(listParameters, filters, setFilters, options);
|
|
118
|
+
}, [filters, listParameters, lookupQuery.data]);
|
|
119
|
+
const hasTable = !!listEndpoint;
|
|
120
|
+
const showTable = hasTable && view === "table";
|
|
121
|
+
const sectionLabel = kind === "configuration" || definition.key.startsWith("config-") ? "Configuration" : "Operations";
|
|
122
|
+
const activeActionMeta = activeAction ? getOperationClickyMeta(activeAction) : void 0;
|
|
123
|
+
const actionLockedValues = useMemo(() => {
|
|
124
|
+
const meta = activeActionMeta;
|
|
125
|
+
if (!activeAction || meta == null || !meta.supportsFilterMode) {
|
|
126
|
+
return {};
|
|
127
|
+
}
|
|
128
|
+
const locked = {};
|
|
129
|
+
for (const param of activeAction.operation.parameters ?? []) {
|
|
130
|
+
const value = filters[param.name];
|
|
131
|
+
if (param.in === "query" && value) {
|
|
132
|
+
locked[param.name] = value;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (meta.idParam) {
|
|
136
|
+
locked[meta.idParam] = "all";
|
|
137
|
+
}
|
|
138
|
+
if ((activeAction.operation.parameters ?? []).some((param) => param.name === "filter")) {
|
|
139
|
+
locked.filter = Object.entries(filters).filter(([, value]) => value).map(([key, value]) => `${key}=${value}`).join(", ") || "current list filters";
|
|
140
|
+
}
|
|
141
|
+
return locked;
|
|
142
|
+
}, [activeAction, activeActionMeta, filters]);
|
|
143
|
+
async function executeAction(values) {
|
|
144
|
+
if (!activeAction) return;
|
|
145
|
+
setIsExecutingAction(true);
|
|
146
|
+
setActionError("");
|
|
147
|
+
try {
|
|
148
|
+
const response = await client.executeCommand(
|
|
149
|
+
activeAction.path,
|
|
150
|
+
activeAction.method,
|
|
151
|
+
packParameterValues(values, activeAction.operation.parameters ?? []),
|
|
152
|
+
{ Accept: "application/json+clicky" }
|
|
153
|
+
);
|
|
154
|
+
setActionResult(response);
|
|
155
|
+
await listQuery.refetch();
|
|
156
|
+
} catch (err) {
|
|
157
|
+
setActionResult(null);
|
|
158
|
+
setActionError(err instanceof Error ? err.message : String(err ?? "Unknown error"));
|
|
159
|
+
} finally {
|
|
160
|
+
setIsExecutingAction(false);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (isLoading) {
|
|
164
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
165
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { className: "h-10 w-72" }),
|
|
166
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { className: "h-4 w-[32rem]" }),
|
|
167
|
+
Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx(SkeletonBlock, { className: "h-12" }, i))
|
|
168
|
+
] });
|
|
169
|
+
}
|
|
170
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
171
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
|
|
172
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
173
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs uppercase tracking-[0.18em] text-muted-foreground", children: sectionLabel }),
|
|
174
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-semibold tracking-tight", children: definition.title }),
|
|
175
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 max-w-2xl text-sm text-muted-foreground", children: definition.description })
|
|
176
|
+
] }),
|
|
177
|
+
hasTable && /* @__PURE__ */ jsxs("div", { className: "flex gap-1 rounded-lg border p-1", children: [
|
|
178
|
+
/* @__PURE__ */ jsx(
|
|
179
|
+
Button,
|
|
180
|
+
{
|
|
181
|
+
type: "button",
|
|
182
|
+
variant: view === "table" ? "secondary" : "ghost",
|
|
183
|
+
size: "sm",
|
|
184
|
+
className: "h-7 w-7 p-0",
|
|
185
|
+
"aria-label": "Table view",
|
|
186
|
+
"aria-pressed": view === "table",
|
|
187
|
+
onClick: () => setView("table"),
|
|
188
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "codicon:table" })
|
|
189
|
+
}
|
|
190
|
+
),
|
|
191
|
+
/* @__PURE__ */ jsx(
|
|
192
|
+
Button,
|
|
193
|
+
{
|
|
194
|
+
type: "button",
|
|
195
|
+
variant: view === "endpoints" ? "secondary" : "ghost",
|
|
196
|
+
size: "sm",
|
|
197
|
+
className: "h-7 w-7 p-0",
|
|
198
|
+
"aria-label": "Endpoint list view",
|
|
199
|
+
"aria-pressed": view === "endpoints",
|
|
200
|
+
onClick: () => setView("endpoints"),
|
|
201
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "codicon:list-flat" })
|
|
202
|
+
}
|
|
203
|
+
)
|
|
204
|
+
] })
|
|
205
|
+
] }),
|
|
206
|
+
actionOps.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: actionOps.map((op) => {
|
|
207
|
+
var _a;
|
|
208
|
+
const commandName = op.operation.operationId || op.path;
|
|
209
|
+
const tooltip = op.operation.description ? `${commandName} — ${op.operation.description}` : commandName;
|
|
210
|
+
if (useSurfaceMetadata) {
|
|
211
|
+
return /* @__PURE__ */ jsxs(
|
|
212
|
+
Button,
|
|
213
|
+
{
|
|
214
|
+
type: "button",
|
|
215
|
+
variant: "outline",
|
|
216
|
+
size: "sm",
|
|
217
|
+
title: tooltip,
|
|
218
|
+
onClick: () => {
|
|
219
|
+
setActiveAction(op);
|
|
220
|
+
setActionResult(null);
|
|
221
|
+
setActionError("");
|
|
222
|
+
},
|
|
223
|
+
children: [
|
|
224
|
+
/* @__PURE__ */ jsx(Icon, { name: "codicon:add", className: "text-xs" }),
|
|
225
|
+
op.operation.summary || ((_a = getOperationClickyMeta(op)) == null ? void 0 : _a.actionName) || commandName
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
`${op.method}:${op.path}`
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
return renderLink({
|
|
232
|
+
key: `${op.method}:${op.path}`,
|
|
233
|
+
to: getCommandHref(op.operation.operationId ?? commandName, op),
|
|
234
|
+
title: tooltip,
|
|
235
|
+
className: "inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
236
|
+
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
237
|
+
/* @__PURE__ */ jsx(Icon, { name: "codicon:add", className: "text-xs" }),
|
|
238
|
+
op.operation.summary || commandName
|
|
239
|
+
] })
|
|
240
|
+
});
|
|
241
|
+
}) }),
|
|
242
|
+
showTable ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
243
|
+
(filterBarConfig.filters.length > 0 || filterBarConfig.timeRange != null) && /* @__PURE__ */ jsx(
|
|
244
|
+
FilterBar,
|
|
245
|
+
{
|
|
246
|
+
autoSubmit: true,
|
|
247
|
+
isPending: listQuery.isFetching,
|
|
248
|
+
filters: filterBarConfig.filters,
|
|
249
|
+
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {}
|
|
250
|
+
}
|
|
251
|
+
),
|
|
252
|
+
listQuery.isLoading ? /* @__PURE__ */ jsx("div", { className: "space-y-2", children: Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ jsx(SkeletonBlock, { className: "h-10" }, i)) }) : listQuery.isError ? renderError(listQuery.error, `Failed to load ${(listEndpoint == null ? void 0 : listEndpoint.path) ?? ""}`) : listQuery.data ? /* @__PURE__ */ jsx(
|
|
253
|
+
ExecutionResult,
|
|
254
|
+
{
|
|
255
|
+
response: listQuery.data,
|
|
256
|
+
emptyMessage: "No records returned",
|
|
257
|
+
ariaLabel: `${definition.title} results`,
|
|
258
|
+
className: "mt-0",
|
|
259
|
+
...commandRuntime ? { commandRuntime } : {}
|
|
260
|
+
}
|
|
261
|
+
) : null
|
|
262
|
+
] }) : /* @__PURE__ */ jsx(
|
|
263
|
+
EndpointList,
|
|
264
|
+
{
|
|
265
|
+
operations: domainOps,
|
|
266
|
+
definition,
|
|
267
|
+
renderLink,
|
|
268
|
+
getCommandHref
|
|
269
|
+
}
|
|
270
|
+
),
|
|
271
|
+
/* @__PURE__ */ jsx(
|
|
272
|
+
Modal,
|
|
273
|
+
{
|
|
274
|
+
open: activeAction != null,
|
|
275
|
+
onClose: () => setActiveAction(null),
|
|
276
|
+
title: (activeAction == null ? void 0 : activeAction.operation.summary) || (activeActionMeta == null ? void 0 : activeActionMeta.actionName) || (activeAction == null ? void 0 : activeAction.operation.operationId) || "Action",
|
|
277
|
+
size: "lg",
|
|
278
|
+
children: activeAction && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
279
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
280
|
+
/* @__PURE__ */ jsx(MethodBadge, { method: activeAction.method }),
|
|
281
|
+
/* @__PURE__ */ jsx("code", { className: "rounded-md bg-muted px-2 py-1 text-sm", children: activeAction.path })
|
|
282
|
+
] }),
|
|
283
|
+
/* @__PURE__ */ jsx(
|
|
284
|
+
FilterForm,
|
|
285
|
+
{
|
|
286
|
+
client,
|
|
287
|
+
path: activeAction.path,
|
|
288
|
+
method: activeAction.method,
|
|
289
|
+
parameters: activeAction.operation.parameters ?? [],
|
|
290
|
+
lockedValues: actionLockedValues,
|
|
291
|
+
enableLookup: Boolean(activeActionMeta == null ? void 0 : activeActionMeta.supportsLookup),
|
|
292
|
+
submitLabel: "Execute request",
|
|
293
|
+
submittingLabel: "Executing…",
|
|
294
|
+
isSubmitting: isExecutingAction,
|
|
295
|
+
onSubmit: executeAction
|
|
296
|
+
}
|
|
297
|
+
),
|
|
298
|
+
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(
|
|
299
|
+
ExecutionResult,
|
|
300
|
+
{
|
|
301
|
+
response: actionResult,
|
|
302
|
+
className: "mt-0",
|
|
303
|
+
...commandRuntime ? { commandRuntime } : {}
|
|
304
|
+
}
|
|
305
|
+
) : null
|
|
306
|
+
] })
|
|
307
|
+
}
|
|
308
|
+
)
|
|
309
|
+
] });
|
|
310
|
+
}
|
|
311
|
+
function SkeletonBlock({ className }) {
|
|
312
|
+
return /* @__PURE__ */ jsx("div", { className: `animate-pulse rounded-md bg-muted ${className ?? ""}`.trim() });
|
|
313
|
+
}
|
|
314
|
+
function readFiltersFromUrl() {
|
|
315
|
+
if (typeof window === "undefined") return {};
|
|
316
|
+
const search = new URLSearchParams(window.location.search);
|
|
317
|
+
const values = {};
|
|
318
|
+
for (const [key, value] of search.entries()) {
|
|
319
|
+
if (key.startsWith("__")) continue;
|
|
320
|
+
if (value !== "") values[key] = value;
|
|
321
|
+
}
|
|
322
|
+
return values;
|
|
323
|
+
}
|
|
324
|
+
function writeFiltersToUrl(filters) {
|
|
325
|
+
if (typeof window === "undefined") return;
|
|
326
|
+
const search = new URLSearchParams();
|
|
327
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
328
|
+
if (value !== "") search.set(key, value);
|
|
329
|
+
}
|
|
330
|
+
const query = search.toString();
|
|
331
|
+
const next = `${window.location.pathname}${query ? `?${query}` : ""}${window.location.hash}`;
|
|
332
|
+
if (next !== `${window.location.pathname}${window.location.search}${window.location.hash}`) {
|
|
333
|
+
window.history.replaceState(window.history.state, "", next);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
export {
|
|
337
|
+
OperationCatalog
|
|
338
|
+
};
|
|
339
|
+
//# sourceMappingURL=OperationCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationCatalog.js","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport { Icon } from \"../data/Icon\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { filterOperationsByDomain, findListEndpoint } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n isPositionalParam,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\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 // Restrict the domain to operationIds with a shared prefix when tags alone\n // are too coarse (for example admin_ or catalog_ surfaces).\n operationIdPrefix?: string;\n // Explicit operation id for domains whose canonical list route does not\n // follow the default `<entity>_list` pattern.\n listOperationId?: string;\n surfaceKey?: string;\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 operationIdPrefix,\n listOperationId,\n surfaceKey,\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 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 return listOperationId\n ? domainOps.find((op) => op.method === \"get\" && op.operation.operationId === listOperationId)\n : findListEndpoint(domainOps, entities);\n }, [domainOps, entities, listOperationId, 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 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 const actionOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceCollectionActions(domainOps, surfaceKey);\n }\n\n return domainOps.filter(\n (op) =>\n op.method !== \"get\" &&\n !op.path.includes(\"{\") &&\n !op.operation.parameters?.some((p) => p.in === \"path\" || isPositionalParam(p)),\n );\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\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\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 name=\"codicon:table\" />\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 name=\"codicon:list-flat\" />\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 commandName = op.operation.operationId || op.path;\n const tooltip = op.operation.description\n ? `${commandName} — ${op.operation.description}`\n : commandName;\n if (useSurfaceMetadata) {\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 name=\"codicon:add\" className=\"text-xs\" />\n {op.operation.summary || getOperationClickyMeta(op)?.actionName || commandName}\n </Button>\n );\n }\n\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(op.operation.operationId ?? commandName, op),\n title: tooltip,\n className:\n \"inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\",\n children: (\n <>\n <Icon name=\"codicon:add\" className=\"text-xs\" />\n {op.operation.summary || commandName}\n </>\n ),\n });\n })}\n </div>\n )}\n\n {showTable ? (\n <>\n {(filterBarConfig.filters.length > 0 || filterBarConfig.timeRange != null) && (\n <FilterBar\n autoSubmit\n isPending={listQuery.isFetching}\n filters={filterBarConfig.filters}\n {...(filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {})}\n />\n )}\n {listQuery.isLoading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 8 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-10\" />\n ))}\n </div>\n ) : listQuery.isError ? (\n renderError(listQuery.error, `Failed to load ${listEndpoint?.path ?? \"\"}`)\n ) : listQuery.data ? (\n <ExecutionResult\n response={listQuery.data}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\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 SkeletonBlock({ className }: { className?: string }) {\n return <div className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()} />;\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 writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = new URLSearchParams();\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"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ClickyCommandRuntime } from '../data/Clicky';
|
|
2
|
+
import { RenderLink } from './EndpointList';
|
|
3
|
+
import { ParameterValues } from './formMetadata';
|
|
4
|
+
import { ResolvedOperation } from './types';
|
|
5
|
+
import { OperationsApiClient } from './useOperations';
|
|
6
|
+
export type OperationCommandPageProps = {
|
|
7
|
+
client: OperationsApiClient;
|
|
8
|
+
operationId?: string;
|
|
9
|
+
operation?: ResolvedOperation;
|
|
10
|
+
operations?: ResolvedOperation[];
|
|
11
|
+
initialValues?: ParameterValues;
|
|
12
|
+
autoRun?: boolean;
|
|
13
|
+
backHref?: string;
|
|
14
|
+
backLabel?: string;
|
|
15
|
+
renderLink?: RenderLink;
|
|
16
|
+
commandRuntime?: ClickyCommandRuntime;
|
|
17
|
+
onNavigate?: (href: string) => void;
|
|
18
|
+
hideLockedPathFilters?: boolean;
|
|
19
|
+
className?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function OperationCommandPage({ client, operationId, operation: providedOperation, operations, initialValues, autoRun, backHref, backLabel, renderLink, onNavigate, hideLockedPathFilters, className, }: OperationCommandPageProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=OperationCommandPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationCommandPage.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCommandPage.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EAKrB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,WAAW,EACX,SAAS,EAAE,iBAAiB,EAC5B,UAAyD,EACzD,aAAkB,EAClB,OAAe,EACf,QAAQ,EACR,SAAkB,EAClB,UAAU,EACV,UAAU,EACV,qBAAkD,EAClD,SAAS,GACV,EAAE,yBAAyB,2CAwQ3B"}
|