@flanksource/clicky-ui 0.2.10 → 0.2.12
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/components/Combobox.cjs +4 -1
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +6 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +4 -1
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +11 -5
- 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 +11 -5
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/json-schema-form-array.cjs +117 -37
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +118 -38
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +114 -51
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +7 -4
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +114 -51
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +14 -7
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +3 -0
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +14 -7
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +41 -6
- 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 +41 -6
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-size.cjs +61 -0
- package/dist/components/json-schema-form-size.cjs.map +1 -0
- package/dist/components/json-schema-form-size.d.ts +11 -0
- package/dist/components/json-schema-form-size.d.ts.map +1 -0
- package/dist/components/json-schema-form-size.js +61 -0
- package/dist/components/json-schema-form-size.js.map +1 -0
- package/dist/components/json-schema-form-types.d.ts +27 -4
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components.cjs +2 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +3 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +2 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +412 -90
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +4 -2
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +413 -91
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +534 -293
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +12 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +534 -293
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/LogDetails.cjs +4 -2
- package/dist/data/LogDetails.cjs.map +1 -1
- package/dist/data/LogDetails.js +4 -2
- package/dist/data/LogDetails.js.map +1 -1
- package/dist/data.d.ts +1 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/SplitPane.cjs +34 -27
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +34 -27
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +101 -20
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.d.ts +12 -4
- package/dist/rpc/CommandOutput.d.ts.map +1 -1
- package/dist/rpc/CommandOutput.js +102 -21
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/ExecutionResult.cjs +4 -76
- package/dist/rpc/ExecutionResult.cjs.map +1 -1
- package/dist/rpc/ExecutionResult.d.ts +3 -22
- package/dist/rpc/ExecutionResult.d.ts.map +1 -1
- package/dist/rpc/ExecutionResult.js +4 -76
- package/dist/rpc/ExecutionResult.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +22 -13
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +24 -15
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +10 -20
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +11 -21
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/apiClient.cjs +18 -0
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +18 -0
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +31 -0
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +3 -1
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +31 -0
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +7 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -8,18 +8,18 @@ const MethodBadge = require("../data/MethodBadge.cjs");
|
|
|
8
8
|
const AcceptPicker = require("./AcceptPicker.cjs");
|
|
9
9
|
const CommandForm = require("./CommandForm.cjs");
|
|
10
10
|
const CommandOutput = require("./CommandOutput.cjs");
|
|
11
|
-
const ExecutionResult = require("./ExecutionResult.cjs");
|
|
12
11
|
const formMetadata = require("./formMetadata.cjs");
|
|
13
12
|
const InlineError = require("./InlineError.cjs");
|
|
14
13
|
const OperationActionDialog = require("./OperationActionDialog.cjs");
|
|
15
14
|
const types = require("./types.cjs");
|
|
16
15
|
const useOperations = require("./useOperations.cjs");
|
|
16
|
+
const EMPTY_PARAMETER_VALUES = {};
|
|
17
17
|
function OperationCommandPage({
|
|
18
18
|
client,
|
|
19
19
|
operationId,
|
|
20
20
|
operation: providedOperation,
|
|
21
21
|
operations = providedOperation ? [providedOperation] : [],
|
|
22
|
-
initialValues =
|
|
22
|
+
initialValues = EMPTY_PARAMETER_VALUES,
|
|
23
23
|
autoRun,
|
|
24
24
|
backHref,
|
|
25
25
|
backLabel = "Back",
|
|
@@ -112,22 +112,10 @@ function OperationCommandPage({
|
|
|
112
112
|
hideLocked: hideLockedPathFilters
|
|
113
113
|
});
|
|
114
114
|
}, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);
|
|
115
|
-
const dataTablePagination = react.useMemo(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const offset = Math.max(parseInt(p.offsetValue, 10) || 0, 0);
|
|
120
|
-
const page = Math.floor(offset / pageSize);
|
|
121
|
-
return {
|
|
122
|
-
page,
|
|
123
|
-
pageSize,
|
|
124
|
-
onPageChange: (next) => p.setOffset(String(Math.max(next, 0) * pageSize)),
|
|
125
|
-
onPageSizeChange: (next) => {
|
|
126
|
-
p.setLimit(String(next));
|
|
127
|
-
p.setOffset("0");
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
}, [formConfig.pagination]);
|
|
115
|
+
const dataTablePagination = react.useMemo(
|
|
116
|
+
() => formMetadata.dataTablePaginationFromForm(formConfig.pagination, result),
|
|
117
|
+
[formConfig.pagination, result]
|
|
118
|
+
);
|
|
131
119
|
const lastSubmittedSignature = react.useRef("");
|
|
132
120
|
function handleManualSubmit() {
|
|
133
121
|
if (!operation) return;
|
|
@@ -329,10 +317,12 @@ function OperationCommandPage({
|
|
|
329
317
|
) }),
|
|
330
318
|
preview && /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs", children: preview })
|
|
331
319
|
] }),
|
|
332
|
-
error ? /* @__PURE__ */ jsxRuntime.jsx(InlineError.InlineError, { title: `Failed to load ${path} as ${accept}`, error }) : isExecuting
|
|
320
|
+
error ? /* @__PURE__ */ jsxRuntime.jsx(InlineError.InlineError, { title: `Failed to load ${path} as ${accept}`, error }) : isExecuting || result ? /* @__PURE__ */ jsxRuntime.jsx("div", { role: "region", "aria-label": "Response body", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
333
321
|
CommandOutput.CommandOutput,
|
|
334
322
|
{
|
|
335
323
|
response: result,
|
|
324
|
+
loading: isExecuting,
|
|
325
|
+
loadingMessage: "Loading execution results…",
|
|
336
326
|
bare: true,
|
|
337
327
|
...detailOperation ? {
|
|
338
328
|
getTableRowHref: getRowDetailHref,
|
|
@@ -456,7 +446,7 @@ function shellQuote(value) {
|
|
|
456
446
|
function stripRunnerParams(values) {
|
|
457
447
|
const next = {};
|
|
458
448
|
for (const [key, value] of Object.entries(values)) {
|
|
459
|
-
if (key === "autoRun" || key
|
|
449
|
+
if (key === "autoRun" || key.startsWith("__")) continue;
|
|
460
450
|
next[key] = value;
|
|
461
451
|
}
|
|
462
452
|
return next;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCommandPage.cjs","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\n ClickyCommandRuntime,\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n} from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { AcceptPicker, type OperationPreviewMode } from \"./AcceptPicker\";\nimport { CommandForm, pathParamNames, submitValue } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport type { RenderLink } from \"./EndpointList\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport {\n buildInitialParameterValues,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { isPositionalParam, type ExecutionResponse, type ResolvedOperation } from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationCommandPageProps = {\n client: OperationsApiClient;\n operationId?: string;\n operation?: ResolvedOperation;\n operations?: ResolvedOperation[];\n initialValues?: ParameterValues;\n autoRun?: boolean;\n backHref?: string;\n backLabel?: string;\n renderLink?: RenderLink;\n commandRuntime?: ClickyCommandRuntime;\n onNavigate?: (href: string) => void;\n hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = {},\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(client, providedOperation ? undefined : operationId);\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [accept, setAccept] = useState(\"application/clicky+json\");\n const [previewMode, setPreviewMode] = useState<OperationPreviewMode>(\"hidden\");\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [submitError, setSubmitError] = useState(\"\");\n const [hasAutoRun, setHasAutoRun] = useState(false);\n const parameters = operation?.operation.parameters ?? [];\n const isGet = (operation?.method ?? \"\").toUpperCase() === \"GET\";\n const effectiveAutoRun = operation ? (autoRun ?? isGet) : false;\n const parameterSignature = JSON.stringify(\n parameters.map((param) => ({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n default: param.schema?.default ?? null,\n })),\n );\n const operationKey = `${operation?.method ?? \"\"}:${operation?.path ?? \"\"}:${operation?.operation.operationId ?? \"\"}`;\n const effectiveInitialValues = useMemo(\n () =>\n operation\n ? buildInitialParameterValues(\n parameters,\n operation.method,\n {},\n stripRunnerParams(initialValues),\n )\n : stripRunnerParams(initialValues),\n [initialValues, operation?.method, parameterSignature],\n );\n const pathParameters = parameters.filter((param) => param.in === \"path\");\n const lockedPathValues = useMemo<ParameterValues>(() => {\n const values: ParameterValues = {};\n for (const param of pathParameters) {\n const value = effectiveInitialValues[param.name];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n values[param.name] = value;\n }\n }\n return values;\n }, [effectiveInitialValues, pathParameters]);\n const detailOperation = useMemo(\n () => (operation ? findDetailOperation(operation, operations) : undefined),\n [operation, operations],\n );\n const relatedOperations = useMemo(\n () => (operation ? findRelatedOperations(operation, operations, lockedPathValues) : []),\n [lockedPathValues, operation, operations],\n );\n\n // GET-mode parameter state: filter values + pagination cursor are driven\n // by the page so they can flow natively into <CommandOutput>'s filter bar\n // and pagination footer instead of through a separate OperationQueryFilterBar.\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n setSubmitError(\"\");\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n const lookupQuery = useQuery({\n queryKey: [\"operation-query-lookup\", operation?.method, operation?.path, debouncedValues],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} }\n );\n },\n enabled:\n isGet &&\n !!operation &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);\n\n const dataTablePagination = useMemo<DataTablePagination | undefined>(() => {\n const p = formConfig.pagination;\n if (!p) return undefined;\n const pageSize = Math.max(parseInt(p.limitValue, 10) || 25, 1);\n const offset = Math.max(parseInt(p.offsetValue, 10) || 0, 0);\n const page = Math.floor(offset / pageSize);\n return {\n page,\n pageSize,\n onPageChange: (next: number) => p.setOffset(String(Math.max(next, 0) * pageSize)),\n onPageSizeChange: (next: number) => {\n p.setLimit(String(next));\n p.setOffset(\"0\");\n },\n };\n }, [formConfig.pagination]);\n\n // Ref tracking the last submitted parameter signature so that the\n // auto-submit-on-debounced-change effect and the manual submit button\n // both coordinate against the same \"have I already fired this set of\n // values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n function handleManualSubmit() {\n if (!operation) return;\n const merged = { ...values, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) {\n setSubmitError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`,\n );\n return;\n }\n setSubmitError(\"\");\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(merged));\n void executeOperation(merged);\n }\n\n async function executeOperation(values: ParameterValues) {\n if (!operation) return;\n\n setIsExecuting(true);\n setError(null);\n\n try {\n const response = await client.executeCommand(\n operation.path,\n operation.method,\n packParameterValues(values, operation.operation.parameters ?? []),\n { Accept: accept },\n );\n setResult(response);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n useEffect(() => {\n setHasAutoRun(false);\n setResult(null);\n setError(null);\n lastSubmittedSignature.current = \"\";\n }, [effectiveAutoRun, operationKey]);\n\n useEffect(() => {\n if (!effectiveAutoRun || !operation || hasAutoRun) return;\n // Auto-run a GET as long as every required parameter has a value. Optional\n // params (limit/offset, filter chips, etc.) get their defaults; the\n // sidebar's \"click → instant table\" flow depends on this not bailing just\n // because the operation declares any parameters at all.\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (effectiveInitialValues[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(effectiveInitialValues));\n void executeOperation(effectiveInitialValues);\n }, [\n accept,\n effectiveAutoRun,\n effectiveInitialValues,\n hasAutoRun,\n operationKey,\n parameterSignature,\n ]);\n\n // GET re-runs on debounced filter/pagination changes once the initial\n // auto-run has fired; non-GETs keep their explicit-submit behavior.\n useEffect(() => {\n if (!isGet || !operation || !hasAutoRun) return;\n const merged = { ...debouncedValues, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n const signature = JSON.stringify(pruneParameterValues(merged));\n if (lastSubmittedSignature.current === signature) return;\n lastSubmittedSignature.current = signature;\n void executeOperation(merged);\n }, [isGet, hasAutoRun, debouncedValues, lockedPathValues, parameterSignature]);\n\n const getRowDetailHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForOperation(detailOperation, [], { id });\n },\n [detailOperation],\n );\n\n const handleTableRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowDetailHref(row);\n if (href) onNavigate?.(href);\n },\n [getRowDetailHref, onNavigate],\n );\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading operation...</div>;\n }\n\n if (!operation) {\n return (\n <div className=\"space-y-4\">\n <div className=\"text-sm text-muted-foreground\">\n Unknown operation: <code>{operationId}</code>\n </div>\n {backLink}\n </div>\n );\n }\n\n const { path, method, operation: op } = operation;\n const preview = buildOperationPreview(operation, effectiveInitialValues, accept, previewMode);\n\n return (\n <div className={className ?? \"min-w-0 flex-1 space-y-6 p-6\"}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={method} />\n <h1 className=\"truncate text-xl font-bold\">{op.summary || op.operationId || path}</h1>\n </div>\n <p className=\"mt-1 font-mono text-xs text-muted-foreground\">{path}</p>\n {op.operationId && op.summary && (\n <p className=\"mt-2 font-mono text-xs text-muted-foreground\">{op.operationId}</p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{op.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n <div>\n <div className=\"mb-1 text-right text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Accept\n </div>\n <AcceptPicker\n value={accept}\n onChange={setAccept}\n previewMode={previewMode}\n onPreviewModeChange={setPreviewMode}\n />\n </div>\n {relatedOperations.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2\">\n {relatedOperations.map((related) =>\n related.href ? (\n renderLink ? (\n renderLink({\n key: `${related.operation.method}:${related.operation.path}`,\n to: related.href,\n className:\n \"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\",\n children: related.label,\n })\n ) : (\n <a\n key={`${related.operation.method}:${related.operation.path}`}\n href={related.href}\n className=\"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\"\n >\n {related.label}\n </a>\n )\n ) : (\n <OperationActionDialog\n key={`${related.operation.method}:${related.operation.path}`}\n operation={related.operation}\n client={client}\n initialValues={lockedPathValues}\n label={related.label}\n defaultAccept={accept}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n <section className=\"space-y-3\">\n {method.toUpperCase() === \"GET\" ? (\n parameters.length > 0 ? (\n // Before a result lands the FilterBar lives here so users can\n // fill in path params / required inputs and submit. Once a\n // result is showing AND auto-run is on (sidebar flow), the same\n // filter chips relocate into the DataTable's filter bar via\n // externalFilters, which is the unified placement the user asked\n // for. The two branches share `formConfig.filters` so the values\n // stay in sync.\n !result || !effectiveAutoRun ? (\n <div className=\"space-y-2\">\n <FilterBar\n autoSubmit={effectiveAutoRun}\n filters={formConfig.filters}\n {...(!effectiveAutoRun ? { onApply: () => handleManualSubmit() } : {})}\n applyLabel=\"Execute request\"\n isPending={isExecuting}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n />\n {submitError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {submitError}\n </div>\n )}\n </div>\n ) : null\n ) : null\n ) : (\n <div className=\"rounded-lg border p-4\">\n <CommandForm\n parameters={parameters}\n onExecute={(params) => executeOperation(params)}\n isPending={isExecuting}\n method={method}\n path={path}\n accept={accept}\n initialValues={effectiveInitialValues}\n />\n </div>\n )}\n\n {preview && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">{preview}</pre>\n )}\n </section>\n\n {error ? (\n <InlineError title={`Failed to load ${path} as ${accept}`} error={error} />\n ) : isExecuting && !result ? (\n <ExecutionResult loading loadingMessage=\"Loading execution results…\" className=\"mt-0\" />\n ) : result ? (\n <div role=\"region\" aria-label=\"Response body\">\n <CommandOutput\n response={result}\n bare\n {...(detailOperation\n ? {\n getTableRowHref: getRowDetailHref,\n onTableRowClick: handleTableRowClick,\n isTableRowClickable: (row: ClickyRow) => Boolean(getRowDetailHref(row)),\n }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.filters.length > 0\n ? { externalFilters: formConfig.filters }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\ntype RelatedOperation = {\n operation: ResolvedOperation;\n label: string;\n href?: string;\n};\n\nfunction findRelatedOperations(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n pathValues: Record<string, string>,\n): RelatedOperation[] {\n if (current.method.toUpperCase() !== \"GET\") return [];\n if (!pathTemplateSatisfied(current.path, pathValues)) return [];\n\n const basePath = current.path.replace(/\\/+$/, \"\");\n return operations\n .filter((candidate) => {\n if (candidate === current) return false;\n if (!candidate.path.startsWith(`${basePath}/`)) return false;\n if (!pathTemplateSatisfied(candidate.path, pathValues)) return false;\n const method = candidate.method.toUpperCase();\n return method === \"GET\" || method === \"POST\" || method === \"PUT\" || method === \"DELETE\";\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href = method === \"GET\" ? hrefForOperation(related, [], pathValues) : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter((related) => related.operation.method.toUpperCase() !== \"GET\" || related.href);\n}\n\nfunction findDetailOperation(current: ResolvedOperation, operations: ResolvedOperation[]) {\n const method = current.method.toUpperCase();\n const detailPath = `${current.path.replace(/\\/+$/, \"\")}/{id}`;\n return operations.find(\n (candidate) =>\n candidate.method.toUpperCase() === method &&\n candidate.path === detailPath &&\n candidate.operation.parameters?.some(\n (param) => param.in === \"path\" && param.name === \"id\" && param.required,\n ),\n );\n}\n\nfunction hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) 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 pathTemplateSatisfied(path: string, values: Record<string, string>) {\n return pathParamNames(path).every((name) => Boolean(values[name]));\n}\n\nfunction operationLabel(operation: ResolvedOperation): string {\n const actionName =\n operation.operation[\"x-clicky\"]?.actionName ||\n operation.path.split(\"/\").filter(Boolean).at(-1) ||\n operation.operation.operationId ||\n operation.method;\n return titleCase(actionName.replace(/[_-]+/g, \" \"));\n}\n\nfunction buildOperationPreview(\n operation: ResolvedOperation,\n values: ParameterValues,\n accept: string,\n mode: OperationPreviewMode,\n) {\n if (mode === \"hidden\") return \"\";\n if (mode === \"cli\") return buildCliPreview(operation, values);\n return buildCurlPreview(operation, values, accept);\n}\n\nfunction buildCurlPreview(operation: ResolvedOperation, values: ParameterValues, accept: string) {\n const params = operation.operation.parameters ?? [];\n const parts = [`curl -X ${operation.method.toUpperCase()}`];\n if (accept !== \"application/json\") parts.push(`-H \"Accept: ${accept}\"`);\n let url = operation.path;\n const queryParts: string[] = [];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\") {\n queryParts.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(value)}`);\n }\n }\n if (queryParts.length > 0) url += `?${queryParts.join(\"&\")}`;\n parts.push(`\"${url}\"`);\n return parts.join(\" \");\n}\n\nfunction buildCliPreview(operation: ResolvedOperation, values: ParameterValues) {\n const command = operation.operation[\"x-clicky\"]?.command;\n if (!command) return buildCurlPreview(operation, values, \"application/json\");\n const params = operation.operation.parameters ?? [];\n const positionalNames = new Set(params.filter(isPositionalParam).map((param) => param.name));\n const parts = [command.replaceAll(\"/\", \" \")];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\" || positionalNames.has(param.name)) {\n parts.push(shellQuote(value));\n continue;\n }\n parts.push(`--${param.name}`, shellQuote(value));\n }\n return parts.join(\" \");\n}\n\nfunction shellQuote(value: string) {\n if (/^[a-zA-Z0-9_./:@-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction stripRunnerParams(values: ParameterValues): ParameterValues {\n const next: ParameterValues = {};\n for (const [key, value] of Object.entries(values)) {\n if (key === \"autoRun\" || key === \"__autoRun\") continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction getClickyRowId(row: ClickyRow) {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields) return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n"],"names":["useOperationById","useState","useMemo","buildInitialParameterValues","values","useEffect","useDebouncedRecord","useQuery","packParameterValues","parametersToFormConfig","useRef","titleCase","pruneParameterValues","useCallback","jsx","jsxs","MethodBadge","AcceptPicker","OperationActionDialog","FilterBar","CommandForm","InlineError","ExecutionResult","CommandOutput","pathParamNames","submitValue","isPositionalParam"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCommandPage.cjs","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport type {\n ClickyCommandRuntime,\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n} from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { AcceptPicker, type OperationPreviewMode } from \"./AcceptPicker\";\nimport { CommandForm, pathParamNames, submitValue } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport type { RenderLink } from \"./EndpointList\";\nimport {\n buildInitialParameterValues,\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { isPositionalParam, type ExecutionResponse, type ResolvedOperation } from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationCommandPageProps = {\n client: OperationsApiClient;\n operationId?: string;\n operation?: ResolvedOperation;\n operations?: ResolvedOperation[];\n initialValues?: ParameterValues;\n autoRun?: boolean;\n backHref?: string;\n backLabel?: string;\n renderLink?: RenderLink;\n commandRuntime?: ClickyCommandRuntime;\n onNavigate?: (href: string) => void;\n hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nconst EMPTY_PARAMETER_VALUES: ParameterValues = {};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = EMPTY_PARAMETER_VALUES,\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(client, providedOperation ? undefined : operationId);\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [accept, setAccept] = useState(\"application/clicky+json\");\n const [previewMode, setPreviewMode] = useState<OperationPreviewMode>(\"hidden\");\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [submitError, setSubmitError] = useState(\"\");\n const [hasAutoRun, setHasAutoRun] = useState(false);\n const parameters = operation?.operation.parameters ?? [];\n const isGet = (operation?.method ?? \"\").toUpperCase() === \"GET\";\n const effectiveAutoRun = operation ? (autoRun ?? isGet) : false;\n const parameterSignature = JSON.stringify(\n parameters.map((param) => ({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n default: param.schema?.default ?? null,\n })),\n );\n const operationKey = `${operation?.method ?? \"\"}:${operation?.path ?? \"\"}:${operation?.operation.operationId ?? \"\"}`;\n const effectiveInitialValues = useMemo(\n () =>\n operation\n ? buildInitialParameterValues(\n parameters,\n operation.method,\n {},\n stripRunnerParams(initialValues),\n )\n : stripRunnerParams(initialValues),\n [initialValues, operation?.method, parameterSignature],\n );\n const pathParameters = parameters.filter((param) => param.in === \"path\");\n const lockedPathValues = useMemo<ParameterValues>(() => {\n const values: ParameterValues = {};\n for (const param of pathParameters) {\n const value = effectiveInitialValues[param.name];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n values[param.name] = value;\n }\n }\n return values;\n }, [effectiveInitialValues, pathParameters]);\n const detailOperation = useMemo(\n () => (operation ? findDetailOperation(operation, operations) : undefined),\n [operation, operations],\n );\n const relatedOperations = useMemo(\n () => (operation ? findRelatedOperations(operation, operations, lockedPathValues) : []),\n [lockedPathValues, operation, operations],\n );\n\n // GET-mode parameter state: filter values + pagination cursor are driven\n // by the page so they can flow natively into <CommandOutput>'s filter bar\n // and pagination footer instead of through a separate OperationQueryFilterBar.\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n setSubmitError(\"\");\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n const lookupQuery = useQuery({\n queryKey: [\"operation-query-lookup\", operation?.method, operation?.path, debouncedValues],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} }\n );\n },\n enabled:\n isGet &&\n !!operation &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);\n\n const dataTablePagination = useMemo(\n () => dataTablePaginationFromForm(formConfig.pagination, result),\n [formConfig.pagination, result],\n );\n\n // Ref tracking the last submitted parameter signature so that the\n // auto-submit-on-debounced-change effect and the manual submit button\n // both coordinate against the same \"have I already fired this set of\n // values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n function handleManualSubmit() {\n if (!operation) return;\n const merged = { ...values, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) {\n setSubmitError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`,\n );\n return;\n }\n setSubmitError(\"\");\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(merged));\n void executeOperation(merged);\n }\n\n async function executeOperation(values: ParameterValues) {\n if (!operation) return;\n\n setIsExecuting(true);\n setError(null);\n\n try {\n const response = await client.executeCommand(\n operation.path,\n operation.method,\n packParameterValues(values, operation.operation.parameters ?? []),\n { Accept: accept },\n );\n setResult(response);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n useEffect(() => {\n setHasAutoRun(false);\n setResult(null);\n setError(null);\n lastSubmittedSignature.current = \"\";\n }, [effectiveAutoRun, operationKey]);\n\n useEffect(() => {\n if (!effectiveAutoRun || !operation || hasAutoRun) return;\n // Auto-run a GET as long as every required parameter has a value. Optional\n // params (limit/offset, filter chips, etc.) get their defaults; the\n // sidebar's \"click → instant table\" flow depends on this not bailing just\n // because the operation declares any parameters at all.\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (effectiveInitialValues[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(effectiveInitialValues));\n void executeOperation(effectiveInitialValues);\n }, [\n accept,\n effectiveAutoRun,\n effectiveInitialValues,\n hasAutoRun,\n operationKey,\n parameterSignature,\n ]);\n\n // GET re-runs on debounced filter/pagination changes once the initial\n // auto-run has fired; non-GETs keep their explicit-submit behavior.\n useEffect(() => {\n if (!isGet || !operation || !hasAutoRun) return;\n const merged = { ...debouncedValues, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n const signature = JSON.stringify(pruneParameterValues(merged));\n if (lastSubmittedSignature.current === signature) return;\n lastSubmittedSignature.current = signature;\n void executeOperation(merged);\n }, [isGet, hasAutoRun, debouncedValues, lockedPathValues, parameterSignature]);\n\n const getRowDetailHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForOperation(detailOperation, [], { id });\n },\n [detailOperation],\n );\n\n const handleTableRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowDetailHref(row);\n if (href) onNavigate?.(href);\n },\n [getRowDetailHref, onNavigate],\n );\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading operation...</div>;\n }\n\n if (!operation) {\n return (\n <div className=\"space-y-4\">\n <div className=\"text-sm text-muted-foreground\">\n Unknown operation: <code>{operationId}</code>\n </div>\n {backLink}\n </div>\n );\n }\n\n const { path, method, operation: op } = operation;\n const preview = buildOperationPreview(operation, effectiveInitialValues, accept, previewMode);\n\n return (\n <div className={className ?? \"min-w-0 flex-1 space-y-6 p-6\"}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={method} />\n <h1 className=\"truncate text-xl font-bold\">{op.summary || op.operationId || path}</h1>\n </div>\n <p className=\"mt-1 font-mono text-xs text-muted-foreground\">{path}</p>\n {op.operationId && op.summary && (\n <p className=\"mt-2 font-mono text-xs text-muted-foreground\">{op.operationId}</p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{op.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n <div>\n <div className=\"mb-1 text-right text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Accept\n </div>\n <AcceptPicker\n value={accept}\n onChange={setAccept}\n previewMode={previewMode}\n onPreviewModeChange={setPreviewMode}\n />\n </div>\n {relatedOperations.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2\">\n {relatedOperations.map((related) =>\n related.href ? (\n renderLink ? (\n renderLink({\n key: `${related.operation.method}:${related.operation.path}`,\n to: related.href,\n className:\n \"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\",\n children: related.label,\n })\n ) : (\n <a\n key={`${related.operation.method}:${related.operation.path}`}\n href={related.href}\n className=\"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\"\n >\n {related.label}\n </a>\n )\n ) : (\n <OperationActionDialog\n key={`${related.operation.method}:${related.operation.path}`}\n operation={related.operation}\n client={client}\n initialValues={lockedPathValues}\n label={related.label}\n defaultAccept={accept}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n <section className=\"space-y-3\">\n {method.toUpperCase() === \"GET\" ? (\n parameters.length > 0 ? (\n // Before a result lands the FilterBar lives here so users can\n // fill in path params / required inputs and submit. Once a\n // result is showing AND auto-run is on (sidebar flow), the same\n // filter chips relocate into the DataTable's filter bar via\n // externalFilters, which is the unified placement the user asked\n // for. The two branches share `formConfig.filters` so the values\n // stay in sync.\n !result || !effectiveAutoRun ? (\n <div className=\"space-y-2\">\n <FilterBar\n autoSubmit={effectiveAutoRun}\n filters={formConfig.filters}\n {...(!effectiveAutoRun ? { onApply: () => handleManualSubmit() } : {})}\n applyLabel=\"Execute request\"\n isPending={isExecuting}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n />\n {submitError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {submitError}\n </div>\n )}\n </div>\n ) : null\n ) : null\n ) : (\n <div className=\"rounded-lg border p-4\">\n <CommandForm\n parameters={parameters}\n onExecute={(params) => executeOperation(params)}\n isPending={isExecuting}\n method={method}\n path={path}\n accept={accept}\n initialValues={effectiveInitialValues}\n />\n </div>\n )}\n\n {preview && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">{preview}</pre>\n )}\n </section>\n\n {error ? (\n <InlineError title={`Failed to load ${path} as ${accept}`} error={error} />\n ) : isExecuting || result ? (\n <div role=\"region\" aria-label=\"Response body\">\n <CommandOutput\n response={result}\n loading={isExecuting}\n loadingMessage=\"Loading execution results…\"\n bare\n {...(detailOperation\n ? {\n getTableRowHref: getRowDetailHref,\n onTableRowClick: handleTableRowClick,\n isTableRowClickable: (row: ClickyRow) => Boolean(getRowDetailHref(row)),\n }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.filters.length > 0\n ? { externalFilters: formConfig.filters }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\ntype RelatedOperation = {\n operation: ResolvedOperation;\n label: string;\n href?: string;\n};\n\nfunction findRelatedOperations(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n pathValues: Record<string, string>,\n): RelatedOperation[] {\n if (current.method.toUpperCase() !== \"GET\") return [];\n if (!pathTemplateSatisfied(current.path, pathValues)) return [];\n\n const basePath = current.path.replace(/\\/+$/, \"\");\n return operations\n .filter((candidate) => {\n if (candidate === current) return false;\n if (!candidate.path.startsWith(`${basePath}/`)) return false;\n if (!pathTemplateSatisfied(candidate.path, pathValues)) return false;\n const method = candidate.method.toUpperCase();\n return method === \"GET\" || method === \"POST\" || method === \"PUT\" || method === \"DELETE\";\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href = method === \"GET\" ? hrefForOperation(related, [], pathValues) : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter((related) => related.operation.method.toUpperCase() !== \"GET\" || related.href);\n}\n\nfunction findDetailOperation(current: ResolvedOperation, operations: ResolvedOperation[]) {\n const method = current.method.toUpperCase();\n const detailPath = `${current.path.replace(/\\/+$/, \"\")}/{id}`;\n return operations.find(\n (candidate) =>\n candidate.method.toUpperCase() === method &&\n candidate.path === detailPath &&\n candidate.operation.parameters?.some(\n (param) => param.in === \"path\" && param.name === \"id\" && param.required,\n ),\n );\n}\n\nfunction hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) 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 pathTemplateSatisfied(path: string, values: Record<string, string>) {\n return pathParamNames(path).every((name) => Boolean(values[name]));\n}\n\nfunction operationLabel(operation: ResolvedOperation): string {\n const actionName =\n operation.operation[\"x-clicky\"]?.actionName ||\n operation.path.split(\"/\").filter(Boolean).at(-1) ||\n operation.operation.operationId ||\n operation.method;\n return titleCase(actionName.replace(/[_-]+/g, \" \"));\n}\n\nfunction buildOperationPreview(\n operation: ResolvedOperation,\n values: ParameterValues,\n accept: string,\n mode: OperationPreviewMode,\n) {\n if (mode === \"hidden\") return \"\";\n if (mode === \"cli\") return buildCliPreview(operation, values);\n return buildCurlPreview(operation, values, accept);\n}\n\nfunction buildCurlPreview(operation: ResolvedOperation, values: ParameterValues, accept: string) {\n const params = operation.operation.parameters ?? [];\n const parts = [`curl -X ${operation.method.toUpperCase()}`];\n if (accept !== \"application/json\") parts.push(`-H \"Accept: ${accept}\"`);\n let url = operation.path;\n const queryParts: string[] = [];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\") {\n queryParts.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(value)}`);\n }\n }\n if (queryParts.length > 0) url += `?${queryParts.join(\"&\")}`;\n parts.push(`\"${url}\"`);\n return parts.join(\" \");\n}\n\nfunction buildCliPreview(operation: ResolvedOperation, values: ParameterValues) {\n const command = operation.operation[\"x-clicky\"]?.command;\n if (!command) return buildCurlPreview(operation, values, \"application/json\");\n const params = operation.operation.parameters ?? [];\n const positionalNames = new Set(params.filter(isPositionalParam).map((param) => param.name));\n const parts = [command.replaceAll(\"/\", \" \")];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\" || positionalNames.has(param.name)) {\n parts.push(shellQuote(value));\n continue;\n }\n parts.push(`--${param.name}`, shellQuote(value));\n }\n return parts.join(\" \");\n}\n\nfunction shellQuote(value: string) {\n if (/^[a-zA-Z0-9_./:@-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction stripRunnerParams(values: ParameterValues): ParameterValues {\n const next: ParameterValues = {};\n for (const [key, value] of Object.entries(values)) {\n if (key === \"autoRun\" || key.startsWith(\"__\")) continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction getClickyRowId(row: ClickyRow) {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields) return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n"],"names":["useOperationById","useState","useMemo","buildInitialParameterValues","values","useEffect","useDebouncedRecord","useQuery","packParameterValues","parametersToFormConfig","dataTablePaginationFromForm","useRef","titleCase","pruneParameterValues","useCallback","jsx","jsxs","MethodBadge","AcceptPicker","OperationActionDialog","FilterBar","CommandForm","InlineError","CommandOutput","pathParamNames","submitValue","isPositionalParam"],"mappings":";;;;;;;;;;;;;;;AA8CA,MAAM,yBAA0C,CAAA;AAEzC,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,aAAa,oBAAoB,CAAC,iBAAiB,IAAI,CAAA;AAAA,EACvD,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,wBAAwB,QAAQ,iBAAiB;AAAA,EACjD;AACF,GAA8B;AAC5B,QAAM,SAASA,cAAAA,iBAAiB,QAAQ,oBAAoB,SAAY,WAAW;AACnF,QAAM,YAAY,qBAAqB,OAAO;AAC9C,QAAM,YAAY,oBAAoB,QAAQ,OAAO;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIC,MAAAA,SAAS,yBAAyB;AAC9D,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAA+B,QAAQ;AAC7E,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,KAAK;AACpD,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAmC,IAAI;AACnE,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAkB,IAAI;AAChD,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,EAAE;AACjD,QAAM,CAAC,YAAY,aAAa,IAAIA,MAAAA,SAAS,KAAK;AAClD,QAAM,cAAa,uCAAW,UAAU,eAAc,CAAA;AACtD,QAAM,UAAS,uCAAW,WAAU,IAAI,kBAAkB;AAC1D,QAAM,mBAAmB,YAAa,WAAW,QAAS;AAC1D,QAAM,qBAAqB,KAAK;AAAA,IAC9B,WAAW,IAAI,CAAC,UAAA;;AAAW;AAAA,QACzB,MAAM,MAAM;AAAA,QACZ,IAAI,MAAM;AAAA,QACV,UAAU,MAAM,YAAY;AAAA,QAC5B,WAAS,WAAM,WAAN,mBAAc,YAAW;AAAA,MAAA;AAAA,KAClC;AAAA,EAAA;AAEJ,QAAM,eAAe,IAAG,uCAAW,WAAU,EAAE,KAAI,uCAAW,SAAQ,EAAE,KAAI,uCAAW,UAAU,gBAAe,EAAE;AAClH,QAAM,yBAAyBC,MAAAA;AAAAA,IAC7B,MACE,YACIC,aAAAA;AAAAA,MACE;AAAA,MACA,UAAU;AAAA,MACV,CAAA;AAAA,MACA,kBAAkB,aAAa;AAAA,IAAA,IAEjC,kBAAkB,aAAa;AAAA,IACrC,CAAC,eAAe,uCAAW,QAAQ,kBAAkB;AAAA,EAAA;AAEvD,QAAM,iBAAiB,WAAW,OAAO,CAAC,UAAU,MAAM,OAAO,MAAM;AACvE,QAAM,mBAAmBD,MAAAA,QAAyB,MAAM;AACtD,UAAME,UAA0B,CAAA;AAChC,eAAW,SAAS,gBAAgB;AAClC,YAAM,QAAQ,uBAAuB,MAAM,IAAI;AAC/C,UAAI,OAAO,UAAU,YAAY,MAAM,KAAA,MAAW,IAAI;AACpDA,gBAAO,MAAM,IAAI,IAAI;AAAA,MACvB;AAAA,IACF;AACA,WAAOA;AAAAA,EACT,GAAG,CAAC,wBAAwB,cAAc,CAAC;AAC3C,QAAM,kBAAkBF,MAAAA;AAAAA,IACtB,MAAO,YAAY,oBAAoB,WAAW,UAAU,IAAI;AAAA,IAChE,CAAC,WAAW,UAAU;AAAA,EAAA;AAExB,QAAM,oBAAoBA,MAAAA;AAAAA,IACxB,MAAO,YAAY,sBAAsB,WAAW,YAAY,gBAAgB,IAAI,CAAA;AAAA,IACpF,CAAC,kBAAkB,WAAW,UAAU;AAAA,EAAA;AAM1C,QAAM,CAAC,QAAQ,SAAS,IAAID,MAAAA,SAA0B,sBAAsB;AAC5EI,QAAAA,UAAU,MAAM;AACd,cAAU,sBAAsB;AAChC,mBAAe,EAAE;AAAA,EACnB,GAAG,CAAC,sBAAsB,CAAC;AAC3B,QAAM,kBAAkBC,aAAAA,mBAAmB,QAAQ,GAAG;AAEtD,QAAM,cAAcC,WAAAA,SAAS;AAAA,IAC3B,UAAU,CAAC,0BAA0B,uCAAW,QAAQ,uCAAW,MAAM,eAAe;AAAA,IACxF,SAAS,YAAY;;AACnB,UAAI,CAAC,UAAW,QAAO,EAAE,SAAS,CAAA,EAAC;AACnC,aACG,QAAM,YAAO,kBAAP;AAAA;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,QACVC,aAAAA,oBAAoB,iBAAiB,UAAU;AAAA,QAC/C,EAAE,QAAQ,0BAAA;AAAA,YACN,EAAE,SAAS,GAAC;AAAA,IAEtB;AAAA,IACA,SACE,SACA,CAAC,CAAC,aACF,CAAC,CAAC,OAAO,iBACT,WAAW,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO;AAAA,IACjD,WAAW;AAAA,IACX,OAAO;AAAA,EAAA,CACR;AAED,QAAM,aAAaN,MAAAA,QAAQ,MAAM;AAC/B,QAAI,CAAC,MAAO,QAAO,EAAE,SAAS,CAAA,EAAC;AAC/B,WAAOO,oCAAuB,YAAY,QAAQ,WAAW;AAAA,MAC3D,QAAQ,YAAY;AAAA,MACpB,cAAc;AAAA,MACd,YAAY;AAAA,IAAA,CACb;AAAA,EACH,GAAG,CAAC,OAAO,YAAY,QAAQ,YAAY,MAAM,kBAAkB,qBAAqB,CAAC;AAEzF,QAAM,sBAAsBP,MAAAA;AAAAA,IAC1B,MAAMQ,yCAA4B,WAAW,YAAY,MAAM;AAAA,IAC/D,CAAC,WAAW,YAAY,MAAM;AAAA,EAAA;AAOhC,QAAM,yBAAyBC,MAAAA,OAAO,EAAE;AAExC,WAAS,qBAAqB;AAC5B,QAAI,CAAC,UAAW;AAChB,UAAM,SAAS,EAAE,GAAG,QAAQ,GAAG,iBAAA;AAC/B,UAAM,kBAAkB,WAAW,OAAO,CAAC,UAAU;AACnD,UAAI,CAAC,MAAM,SAAU,QAAO;AAC5B,cAAQ,OAAO,MAAM,IAAI,KAAK,IAAI,WAAW;AAAA,IAC/C,CAAC;AACD,QAAI,gBAAgB,SAAS,GAAG;AAC9B;AAAA,QACE,4BAA4B,gBACzB,IAAI,CAAC,UAAUC,aAAAA,UAAU,MAAM,IAAI,CAAC,EACpC,KAAK,IAAI,CAAC;AAAA,MAAA;AAEf;AAAA,IACF;AACA,mBAAe,EAAE;AACjB,kBAAc,IAAI;AAClB,2BAAuB,UAAU,KAAK,UAAUC,aAAAA,qBAAqB,MAAM,CAAC;AAC5E,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AAEA,iBAAe,iBAAiBT,SAAyB;AACvD,QAAI,CAAC,UAAW;AAEhB,mBAAe,IAAI;AACnB,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,UAAU;AAAA,QACV,UAAU;AAAA,QACVI,aAAAA,oBAAoBJ,SAAQ,UAAU,UAAU,cAAc,CAAA,CAAE;AAAA,QAChE,EAAE,QAAQ,OAAA;AAAA,MAAO;AAEnB,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,gBAAU,IAAI;AACd,eAAS,GAAG;AAAA,IACd,UAAA;AACE,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAEAC,QAAAA,UAAU,MAAM;AACd,kBAAc,KAAK;AACnB,cAAU,IAAI;AACd,aAAS,IAAI;AACb,2BAAuB,UAAU;AAAA,EACnC,GAAG,CAAC,kBAAkB,YAAY,CAAC;AAEnCA,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,oBAAoB,CAAC,aAAa,WAAY;AAKnD,UAAM,kBAAkB,WAAW,OAAO,CAAC,UAAU;AACnD,UAAI,CAAC,MAAM,SAAU,QAAO;AAC5B,cAAQ,uBAAuB,MAAM,IAAI,KAAK,IAAI,WAAW;AAAA,IAC/D,CAAC;AACD,QAAI,gBAAgB,SAAS,EAAG;AAEhC,kBAAc,IAAI;AAClB,2BAAuB,UAAU,KAAK,UAAUQ,aAAAA,qBAAqB,sBAAsB,CAAC;AAC5F,SAAK,iBAAiB,sBAAsB;AAAA,EAC9C,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAIDR,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,SAAS,CAAC,aAAa,CAAC,WAAY;AACzC,UAAM,SAAS,EAAE,GAAG,iBAAiB,GAAG,iBAAA;AACxC,UAAM,kBAAkB,WAAW,OAAO,CAAC,UAAU;AACnD,UAAI,CAAC,MAAM,SAAU,QAAO;AAC5B,cAAQ,OAAO,MAAM,IAAI,KAAK,IAAI,WAAW;AAAA,IAC/C,CAAC;AACD,QAAI,gBAAgB,SAAS,EAAG;AAChC,UAAM,YAAY,KAAK,UAAUQ,aAAAA,qBAAqB,MAAM,CAAC;AAC7D,QAAI,uBAAuB,YAAY,UAAW;AAClD,2BAAuB,UAAU;AACjC,SAAK,iBAAiB,MAAM;AAAA,EAC9B,GAAG,CAAC,OAAO,YAAY,iBAAiB,kBAAkB,kBAAkB,CAAC;AAE7E,QAAM,mBAAmBC,MAAAA;AAAAA,IACvB,CAAC,QAAQ;AACP,UAAI,CAAC,gBAAiB,QAAO;AAC7B,YAAM,KAAK,eAAe,GAAG;AAC7B,UAAI,CAAC,GAAI,QAAO;AAChB,aAAO,iBAAiB,iBAAiB,IAAI,EAAE,IAAI;AAAA,IACrD;AAAA,IACA,CAAC,eAAe;AAAA,EAAA;AAGlB,QAAM,sBAAsBA,MAAAA;AAAAA,IAC1B,CAAC,QAAQ;AACP,YAAM,OAAO,iBAAiB,GAAG;AACjC,UAAI,+CAAmB;AAAA,IACzB;AAAA,IACA,CAAC,kBAAkB,UAAU;AAAA,EAAA;AAG/B,QAAM,WACJ,YAAY,OAAO,OAAO,aACxB,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,EAAA,CACX,IAEDC,2BAAAA,IAAC,KAAA,EAAE,MAAM,UAAU,WAAU,2DAC1B,UAAA,WACH;AAGJ,MAAI,WAAW;AACb,WAAOA,2BAAAA,IAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,wBAAoB;AAAA,EAC5E;AAEA,MAAI,CAAC,WAAW;AACd,WACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA;AAAA,QAAA;AAAA,QAC1BD,2BAAAA,IAAC,UAAM,UAAA,YAAA,CAAY;AAAA,MAAA,GACxC;AAAA,MACC;AAAA,IAAA,GACH;AAAA,EAEJ;AAEA,QAAM,EAAE,MAAM,QAAQ,WAAW,OAAO;AACxC,QAAM,UAAU,sBAAsB,WAAW,wBAAwB,QAAQ,WAAW;AAE5F,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAW,aAAa,gCAC3B,UAAA;AAAA,IAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,QAAA;AAAA,QACDA,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAAD,+BAACE,YAAAA,eAAY,QAAgB;AAAA,UAC7BF,2BAAAA,IAAC,QAAG,WAAU,8BAA8B,aAAG,WAAW,GAAG,eAAe,KAAA,CAAK;AAAA,QAAA,GACnF;AAAA,QACAA,2BAAAA,IAAC,KAAA,EAAE,WAAU,gDAAgD,UAAA,MAAK;AAAA,QACjE,GAAG,eAAe,GAAG,0CACnB,KAAA,EAAE,WAAU,gDAAgD,UAAA,GAAG,YAAA,CAAY;AAAA,QAE7E,GAAG,eAAe,GAAG,gBAAgB,GAAG,WACvCA,2BAAAA,IAAC,KAAA,EAAE,WAAU,sCAAsC,UAAA,GAAG,YAAA,CAAY;AAAA,MAAA,GAEtE;AAAA,MACAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAAA,gCAAC,OAAA,EACC,UAAA;AAAA,UAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,4FAA2F,UAAA,UAE1G;AAAA,UACAA,2BAAAA;AAAAA,YAACG,aAAAA;AAAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU;AAAA,cACV;AAAA,cACA,qBAAqB;AAAA,YAAA;AAAA,UAAA;AAAA,QACvB,GACF;AAAA,QACC,kBAAkB,SAAS,oCACzB,OAAA,EAAI,WAAU,oCACZ,UAAA,kBAAkB;AAAA,UAAI,CAAC,YACtB,QAAQ,OACN,aACE,WAAW;AAAA,YACT,KAAK,GAAG,QAAQ,UAAU,MAAM,IAAI,QAAQ,UAAU,IAAI;AAAA,YAC1D,IAAI,QAAQ;AAAA,YACZ,WACE;AAAA,YACF,UAAU,QAAQ;AAAA,UAAA,CACnB,IAEDH,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAM,QAAQ;AAAA,cACd,WAAU;AAAA,cAET,UAAA,QAAQ;AAAA,YAAA;AAAA,YAJJ,GAAG,QAAQ,UAAU,MAAM,IAAI,QAAQ,UAAU,IAAI;AAAA,UAAA,IAQ9DA,2BAAAA;AAAAA,YAACI,sBAAAA;AAAAA,YAAA;AAAA,cAEC,WAAW,QAAQ;AAAA,cACnB;AAAA,cACA,eAAe;AAAA,cACf,OAAO,QAAQ;AAAA,cACf,eAAe;AAAA,cACd,GAAI,aAAa,EAAE,kBAAkB,eAAe,CAAA;AAAA,YAAC;AAAA,YANjD,GAAG,QAAQ,UAAU,MAAM,IAAI,QAAQ,UAAU,IAAI;AAAA,UAAA;AAAA,QAO5D,EAEJ,CACF;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,IAEAH,2BAAAA,KAAC,WAAA,EAAQ,WAAU,aAChB,UAAA;AAAA,MAAA,OAAO,YAAA,MAAkB,QACxB,WAAW,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQlB,CAAC,UAAU,CAAC,mBACVA,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,UAAAD,2BAAAA;AAAAA,YAACK,UAAAA;AAAAA,YAAA;AAAA,cACC,YAAY;AAAA,cACZ,SAAS,WAAW;AAAA,cACnB,GAAI,CAAC,mBAAmB,EAAE,SAAS,MAAM,mBAAA,EAAmB,IAAM,CAAA;AAAA,cACnE,YAAW;AAAA,cACX,WAAW;AAAA,cACV,GAAI,WAAW,YAAY,EAAE,WAAW,WAAW,UAAA,IAAc,CAAA;AAAA,YAAC;AAAA,UAAA;AAAA,UAEpE,eACCL,2BAAAA,IAAC,OAAA,EAAI,WAAU,yFACZ,UAAA,YAAA,CACH;AAAA,QAAA,EAAA,CAEJ,IACE;AAAA,UACF,OAEJA,2BAAAA,IAAC,OAAA,EAAI,WAAU,yBACb,UAAAA,2BAAAA;AAAAA,QAACM,YAAAA;AAAAA,QAAA;AAAA,UACC;AAAA,UACA,WAAW,CAAC,WAAW,iBAAiB,MAAM;AAAA,UAC9C,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QAAA;AAAA,MAAA,GAEnB;AAAA,MAGD,WACCN,2BAAAA,IAAC,OAAA,EAAI,WAAU,6DAA6D,UAAA,QAAA,CAAQ;AAAA,IAAA,GAExF;AAAA,IAEC,QACCA,2BAAAA,IAACO,YAAAA,aAAA,EAAY,OAAO,kBAAkB,IAAI,OAAO,MAAM,IAAI,OAAc,IACvE,eAAe,SACjBP,2BAAAA,IAAC,SAAI,MAAK,UAAS,cAAW,iBAC5B,UAAAA,2BAAAA;AAAAA,MAACQ,cAAAA;AAAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,gBAAe;AAAA,QACf,MAAI;AAAA,QACH,GAAI,kBACD;AAAA,UACE,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,qBAAqB,CAAC,QAAmB,QAAQ,iBAAiB,GAAG,CAAC;AAAA,QAAA,IAExE,CAAA;AAAA,QACH,GAAI,SAAS,oBAAoB,WAAW,QAAQ,SAAS,IAC1D,EAAE,iBAAiB,WAAW,QAAA,IAC9B,CAAA;AAAA,QACH,GAAI,SAAS,oBAAoB,sBAC9B,EAAE,YAAY,oBAAA,IACd,CAAA;AAAA,MAAC;AAAA,IAAA,GAET,IACE;AAAA,EAAA,GACN;AAEJ;AAQA,SAAS,sBACP,SACA,YACA,YACoB;AACpB,MAAI,QAAQ,OAAO,YAAA,MAAkB,cAAc,CAAA;AACnD,MAAI,CAAC,sBAAsB,QAAQ,MAAM,UAAU,UAAU,CAAA;AAE7D,QAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,EAAE;AAChD,SAAO,WACJ,OAAO,CAAC,cAAc;AACrB,QAAI,cAAc,QAAS,QAAO;AAClC,QAAI,CAAC,UAAU,KAAK,WAAW,GAAG,QAAQ,GAAG,EAAG,QAAO;AACvD,QAAI,CAAC,sBAAsB,UAAU,MAAM,UAAU,EAAG,QAAO;AAC/D,UAAM,SAAS,UAAU,OAAO,YAAA;AAChC,WAAO,WAAW,SAAS,WAAW,UAAU,WAAW,SAAS,WAAW;AAAA,EACjF,CAAC,EACA,IAAI,CAAC,YAAY;AAChB,UAAM,SAAS,QAAQ,OAAO,YAAA;AAC9B,UAAM,OAAO,WAAW,QAAQ,iBAAiB,SAAS,CAAA,GAAI,UAAU,IAAI;AAC5E,WAAO;AAAA,MACL,WAAW;AAAA,MACX,OAAO,eAAe,OAAO;AAAA,MAC7B,GAAI,OAAO,EAAE,SAAS,CAAA;AAAA,IAAC;AAAA,EAE3B,CAAC,EACA,OAAO,CAAC,YAAY,QAAQ,UAAU,OAAO,YAAA,MAAkB,SAAS,QAAQ,IAAI;AACzF;AAEA,SAAS,oBAAoB,SAA4B,YAAiC;AACxF,QAAM,SAAS,QAAQ,OAAO,YAAA;AAC9B,QAAM,aAAa,GAAG,QAAQ,KAAK,QAAQ,QAAQ,EAAE,CAAC;AACtD,SAAO,WAAW;AAAA,IAChB,CAAC,cAAA;;AACC,uBAAU,OAAO,YAAA,MAAkB,UACnC,UAAU,SAAS,gBACnB,eAAU,UAAU,eAApB,mBAAgC;AAAA,QAC9B,CAAC,UAAU,MAAM,OAAO,UAAU,MAAM,SAAS,QAAQ,MAAM;AAAA;AAAA;AAAA,EACjE;AAEN;AAEA,SAAS,iBACP,WACA,OAAiB,CAAA,GACjB,QAAgC,CAAA,GACZ;AACpB,MAAI,QAAQ,mBAAmB,UAAU,IAAI;AAC7C,QAAM,oCAAoB,IAAA;AAE1BC,cAAAA,eAAe,UAAU,IAAI,EAAE,QAAQ,CAAC,MAAM,UAAU;AACtD,UAAM,QAAQ,MAAM,IAAI,KAAK,KAAK,KAAK;AACvC,QAAI,CAAC,MAAO;AACZ,kBAAc,IAAI,IAAI;AACtB,YAAQ,MAAM,QAAQ,IAAI,IAAI,IAAI,mBAAmB,KAAK,CAAC;AAAA,EAC7D,CAAC;AAED,MAAI,MAAM,SAAS,GAAG,EAAG,QAAO;AAEhC,QAAM,SAAS,IAAI,gBAAA;AACnB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,SAAS,CAAC,cAAc,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,KAAK;AAAA,EAC7D;AACA,QAAM,QAAQ,OAAO,SAAA;AACrB,SAAO,QAAQ,GAAG,KAAK,IAAI,KAAK,KAAK;AACvC;AAEA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,UAAU,KACb,KAAA,EACA,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,QAAQ,EAAE,EAClB,QAAQ,QAAQ,EAAE;AACrB,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,IAAI,QAAQ,QAAQ,gBAAgB,KAAK,CAAC;AACnD;AAEA,SAAS,sBAAsB,MAAc,QAAgC;AAC3E,SAAOA,YAAAA,eAAe,IAAI,EAAE,MAAM,CAAC,SAAS,QAAQ,OAAO,IAAI,CAAC,CAAC;AACnE;AAEA,SAAS,eAAe,WAAsC;;AAC5D,QAAM,eACJ,eAAU,UAAU,UAAU,MAA9B,mBAAiC,eACjC,UAAU,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,KAC/C,UAAU,UAAU,eACpB,UAAU;AACZ,SAAOZ,aAAAA,UAAU,WAAW,QAAQ,UAAU,GAAG,CAAC;AACpD;AAEA,SAAS,sBACP,WACA,QACA,QACA,MACA;AACA,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,MAAO,QAAO,gBAAgB,WAAW,MAAM;AAC5D,SAAO,iBAAiB,WAAW,QAAQ,MAAM;AACnD;AAEA,SAAS,iBAAiB,WAA8B,QAAyB,QAAgB;AAC/F,QAAM,SAAS,UAAU,UAAU,cAAc,CAAA;AACjD,QAAM,QAAQ,CAAC,WAAW,UAAU,OAAO,YAAA,CAAa,EAAE;AAC1D,MAAI,WAAW,mBAAoB,OAAM,KAAK,eAAe,MAAM,GAAG;AACtE,MAAI,MAAM,UAAU;AACpB,QAAM,aAAuB,CAAA;AAC7B,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQa,YAAAA,YAAY,OAAO,OAAO,MAAM,IAAI,CAAC;AACnD,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,OAAO,QAAQ;AACvB,YAAM,IAAI,QAAQ,IAAI,MAAM,IAAI,KAAK,mBAAmB,KAAK,CAAC;AAAA,IAChE,WAAW,MAAM,OAAO,SAAS;AAC/B,iBAAW,KAAK,GAAG,mBAAmB,MAAM,IAAI,CAAC,IAAI,mBAAmB,KAAK,CAAC,EAAE;AAAA,IAClF;AAAA,EACF;AACA,MAAI,WAAW,SAAS,EAAG,QAAO,IAAI,WAAW,KAAK,GAAG,CAAC;AAC1D,QAAM,KAAK,IAAI,GAAG,GAAG;AACrB,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,gBAAgB,WAA8B,QAAyB;;AAC9E,QAAM,WAAU,eAAU,UAAU,UAAU,MAA9B,mBAAiC;AACjD,MAAI,CAAC,QAAS,QAAO,iBAAiB,WAAW,QAAQ,kBAAkB;AAC3E,QAAM,SAAS,UAAU,UAAU,cAAc,CAAA;AACjD,QAAM,kBAAkB,IAAI,IAAI,OAAO,OAAOC,MAAAA,iBAAiB,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAC3F,QAAM,QAAQ,CAAC,QAAQ,WAAW,KAAK,GAAG,CAAC;AAC3C,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQD,YAAAA,YAAY,OAAO,OAAO,MAAM,IAAI,CAAC;AACnD,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,OAAO,UAAU,gBAAgB,IAAI,MAAM,IAAI,GAAG;AAC1D,YAAM,KAAK,WAAW,KAAK,CAAC;AAC5B;AAAA,IACF;AACA,UAAM,KAAK,KAAK,MAAM,IAAI,IAAI,WAAW,KAAK,CAAC;AAAA,EACjD;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,WAAW,OAAe;AACjC,MAAI,uBAAuB,KAAK,KAAK,EAAG,QAAO;AAC/C,SAAO,IAAI,MAAM,WAAW,KAAK,OAAO,CAAC;AAC3C;AAEA,SAAS,kBAAkB,QAA0C;AACnE,QAAM,OAAwB,CAAA;AAC9B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,QAAQ,aAAa,IAAI,WAAW,IAAI,EAAG;AAC/C,SAAK,GAAG,IAAI;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAgB;AACtC,QAAM,aAAa,CAAC,OAAO,MAAM,MAAM,QAAQ,MAAM;AACrD,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,eAAe,IAAI,MAAM,GAAG,CAAC;AAC3C,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAsC;AAC5D,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,MAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,MAAI,KAAK,SAAU,QAAO,KAAK,SAAS,IAAI,cAAc,EAAE,KAAK,EAAE;AACnE,MAAI,KAAK,MAAO,QAAO,KAAK,MAAM,IAAI,cAAc,EAAE,KAAK,GAAG;AAC9D,MAAI,KAAK,OAAQ,QAAO,KAAK,OAAO,IAAI,CAAC,UAAU,eAAe,MAAM,KAAK,CAAC,EAAE,KAAK,GAAG;AACxF,SAAO;AACT;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCommandPage.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCommandPage.tsx"],"names":[],"mappings":"
|
|
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,EAQL,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAA6C,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5F,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;AAIF,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,WAAW,EACX,SAAS,EAAE,iBAAiB,EAC5B,UAAyD,EACzD,aAAsC,EACtC,OAAO,EACP,QAAQ,EACR,SAAkB,EAClB,UAAU,EACV,UAAU,EACV,qBAAkD,EAClD,SAAS,GACV,EAAE,yBAAyB,2CAmY3B"}
|
|
@@ -6,18 +6,18 @@ import { MethodBadge } from "../data/MethodBadge.js";
|
|
|
6
6
|
import { AcceptPicker } from "./AcceptPicker.js";
|
|
7
7
|
import { CommandForm, pathParamNames, submitValue } from "./CommandForm.js";
|
|
8
8
|
import { CommandOutput } from "./CommandOutput.js";
|
|
9
|
-
import {
|
|
10
|
-
import { buildInitialParameterValues, useDebouncedRecord, packParameterValues, parametersToFormConfig, pruneParameterValues, titleCase } from "./formMetadata.js";
|
|
9
|
+
import { buildInitialParameterValues, useDebouncedRecord, packParameterValues, parametersToFormConfig, dataTablePaginationFromForm, pruneParameterValues, titleCase } from "./formMetadata.js";
|
|
11
10
|
import { InlineError } from "./InlineError.js";
|
|
12
11
|
import { OperationActionDialog } from "./OperationActionDialog.js";
|
|
13
12
|
import { isPositionalParam } from "./types.js";
|
|
14
13
|
import { useOperationById } from "./useOperations.js";
|
|
14
|
+
const EMPTY_PARAMETER_VALUES = {};
|
|
15
15
|
function OperationCommandPage({
|
|
16
16
|
client,
|
|
17
17
|
operationId,
|
|
18
18
|
operation: providedOperation,
|
|
19
19
|
operations = providedOperation ? [providedOperation] : [],
|
|
20
|
-
initialValues =
|
|
20
|
+
initialValues = EMPTY_PARAMETER_VALUES,
|
|
21
21
|
autoRun,
|
|
22
22
|
backHref,
|
|
23
23
|
backLabel = "Back",
|
|
@@ -110,22 +110,10 @@ function OperationCommandPage({
|
|
|
110
110
|
hideLocked: hideLockedPathFilters
|
|
111
111
|
});
|
|
112
112
|
}, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);
|
|
113
|
-
const dataTablePagination = useMemo(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const offset = Math.max(parseInt(p.offsetValue, 10) || 0, 0);
|
|
118
|
-
const page = Math.floor(offset / pageSize);
|
|
119
|
-
return {
|
|
120
|
-
page,
|
|
121
|
-
pageSize,
|
|
122
|
-
onPageChange: (next) => p.setOffset(String(Math.max(next, 0) * pageSize)),
|
|
123
|
-
onPageSizeChange: (next) => {
|
|
124
|
-
p.setLimit(String(next));
|
|
125
|
-
p.setOffset("0");
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
}, [formConfig.pagination]);
|
|
113
|
+
const dataTablePagination = useMemo(
|
|
114
|
+
() => dataTablePaginationFromForm(formConfig.pagination, result),
|
|
115
|
+
[formConfig.pagination, result]
|
|
116
|
+
);
|
|
129
117
|
const lastSubmittedSignature = useRef("");
|
|
130
118
|
function handleManualSubmit() {
|
|
131
119
|
if (!operation) return;
|
|
@@ -327,10 +315,12 @@ function OperationCommandPage({
|
|
|
327
315
|
) }),
|
|
328
316
|
preview && /* @__PURE__ */ jsx("pre", { className: "overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs", children: preview })
|
|
329
317
|
] }),
|
|
330
|
-
error ? /* @__PURE__ */ jsx(InlineError, { title: `Failed to load ${path} as ${accept}`, error }) : isExecuting
|
|
318
|
+
error ? /* @__PURE__ */ jsx(InlineError, { title: `Failed to load ${path} as ${accept}`, error }) : isExecuting || result ? /* @__PURE__ */ jsx("div", { role: "region", "aria-label": "Response body", children: /* @__PURE__ */ jsx(
|
|
331
319
|
CommandOutput,
|
|
332
320
|
{
|
|
333
321
|
response: result,
|
|
322
|
+
loading: isExecuting,
|
|
323
|
+
loadingMessage: "Loading execution results…",
|
|
334
324
|
bare: true,
|
|
335
325
|
...detailOperation ? {
|
|
336
326
|
getTableRowHref: getRowDetailHref,
|
|
@@ -454,7 +444,7 @@ function shellQuote(value) {
|
|
|
454
444
|
function stripRunnerParams(values) {
|
|
455
445
|
const next = {};
|
|
456
446
|
for (const [key, value] of Object.entries(values)) {
|
|
457
|
-
if (key === "autoRun" || key
|
|
447
|
+
if (key === "autoRun" || key.startsWith("__")) continue;
|
|
458
448
|
next[key] = value;
|
|
459
449
|
}
|
|
460
450
|
return next;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCommandPage.js","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\n ClickyCommandRuntime,\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n} from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { AcceptPicker, type OperationPreviewMode } from \"./AcceptPicker\";\nimport { CommandForm, pathParamNames, submitValue } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport type { RenderLink } from \"./EndpointList\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport {\n buildInitialParameterValues,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { isPositionalParam, type ExecutionResponse, type ResolvedOperation } from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationCommandPageProps = {\n client: OperationsApiClient;\n operationId?: string;\n operation?: ResolvedOperation;\n operations?: ResolvedOperation[];\n initialValues?: ParameterValues;\n autoRun?: boolean;\n backHref?: string;\n backLabel?: string;\n renderLink?: RenderLink;\n commandRuntime?: ClickyCommandRuntime;\n onNavigate?: (href: string) => void;\n hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = {},\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(client, providedOperation ? undefined : operationId);\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [accept, setAccept] = useState(\"application/clicky+json\");\n const [previewMode, setPreviewMode] = useState<OperationPreviewMode>(\"hidden\");\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [submitError, setSubmitError] = useState(\"\");\n const [hasAutoRun, setHasAutoRun] = useState(false);\n const parameters = operation?.operation.parameters ?? [];\n const isGet = (operation?.method ?? \"\").toUpperCase() === \"GET\";\n const effectiveAutoRun = operation ? (autoRun ?? isGet) : false;\n const parameterSignature = JSON.stringify(\n parameters.map((param) => ({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n default: param.schema?.default ?? null,\n })),\n );\n const operationKey = `${operation?.method ?? \"\"}:${operation?.path ?? \"\"}:${operation?.operation.operationId ?? \"\"}`;\n const effectiveInitialValues = useMemo(\n () =>\n operation\n ? buildInitialParameterValues(\n parameters,\n operation.method,\n {},\n stripRunnerParams(initialValues),\n )\n : stripRunnerParams(initialValues),\n [initialValues, operation?.method, parameterSignature],\n );\n const pathParameters = parameters.filter((param) => param.in === \"path\");\n const lockedPathValues = useMemo<ParameterValues>(() => {\n const values: ParameterValues = {};\n for (const param of pathParameters) {\n const value = effectiveInitialValues[param.name];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n values[param.name] = value;\n }\n }\n return values;\n }, [effectiveInitialValues, pathParameters]);\n const detailOperation = useMemo(\n () => (operation ? findDetailOperation(operation, operations) : undefined),\n [operation, operations],\n );\n const relatedOperations = useMemo(\n () => (operation ? findRelatedOperations(operation, operations, lockedPathValues) : []),\n [lockedPathValues, operation, operations],\n );\n\n // GET-mode parameter state: filter values + pagination cursor are driven\n // by the page so they can flow natively into <CommandOutput>'s filter bar\n // and pagination footer instead of through a separate OperationQueryFilterBar.\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n setSubmitError(\"\");\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n const lookupQuery = useQuery({\n queryKey: [\"operation-query-lookup\", operation?.method, operation?.path, debouncedValues],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} }\n );\n },\n enabled:\n isGet &&\n !!operation &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);\n\n const dataTablePagination = useMemo<DataTablePagination | undefined>(() => {\n const p = formConfig.pagination;\n if (!p) return undefined;\n const pageSize = Math.max(parseInt(p.limitValue, 10) || 25, 1);\n const offset = Math.max(parseInt(p.offsetValue, 10) || 0, 0);\n const page = Math.floor(offset / pageSize);\n return {\n page,\n pageSize,\n onPageChange: (next: number) => p.setOffset(String(Math.max(next, 0) * pageSize)),\n onPageSizeChange: (next: number) => {\n p.setLimit(String(next));\n p.setOffset(\"0\");\n },\n };\n }, [formConfig.pagination]);\n\n // Ref tracking the last submitted parameter signature so that the\n // auto-submit-on-debounced-change effect and the manual submit button\n // both coordinate against the same \"have I already fired this set of\n // values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n function handleManualSubmit() {\n if (!operation) return;\n const merged = { ...values, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) {\n setSubmitError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`,\n );\n return;\n }\n setSubmitError(\"\");\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(merged));\n void executeOperation(merged);\n }\n\n async function executeOperation(values: ParameterValues) {\n if (!operation) return;\n\n setIsExecuting(true);\n setError(null);\n\n try {\n const response = await client.executeCommand(\n operation.path,\n operation.method,\n packParameterValues(values, operation.operation.parameters ?? []),\n { Accept: accept },\n );\n setResult(response);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n useEffect(() => {\n setHasAutoRun(false);\n setResult(null);\n setError(null);\n lastSubmittedSignature.current = \"\";\n }, [effectiveAutoRun, operationKey]);\n\n useEffect(() => {\n if (!effectiveAutoRun || !operation || hasAutoRun) return;\n // Auto-run a GET as long as every required parameter has a value. Optional\n // params (limit/offset, filter chips, etc.) get their defaults; the\n // sidebar's \"click → instant table\" flow depends on this not bailing just\n // because the operation declares any parameters at all.\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (effectiveInitialValues[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(effectiveInitialValues));\n void executeOperation(effectiveInitialValues);\n }, [\n accept,\n effectiveAutoRun,\n effectiveInitialValues,\n hasAutoRun,\n operationKey,\n parameterSignature,\n ]);\n\n // GET re-runs on debounced filter/pagination changes once the initial\n // auto-run has fired; non-GETs keep their explicit-submit behavior.\n useEffect(() => {\n if (!isGet || !operation || !hasAutoRun) return;\n const merged = { ...debouncedValues, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n const signature = JSON.stringify(pruneParameterValues(merged));\n if (lastSubmittedSignature.current === signature) return;\n lastSubmittedSignature.current = signature;\n void executeOperation(merged);\n }, [isGet, hasAutoRun, debouncedValues, lockedPathValues, parameterSignature]);\n\n const getRowDetailHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForOperation(detailOperation, [], { id });\n },\n [detailOperation],\n );\n\n const handleTableRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowDetailHref(row);\n if (href) onNavigate?.(href);\n },\n [getRowDetailHref, onNavigate],\n );\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading operation...</div>;\n }\n\n if (!operation) {\n return (\n <div className=\"space-y-4\">\n <div className=\"text-sm text-muted-foreground\">\n Unknown operation: <code>{operationId}</code>\n </div>\n {backLink}\n </div>\n );\n }\n\n const { path, method, operation: op } = operation;\n const preview = buildOperationPreview(operation, effectiveInitialValues, accept, previewMode);\n\n return (\n <div className={className ?? \"min-w-0 flex-1 space-y-6 p-6\"}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={method} />\n <h1 className=\"truncate text-xl font-bold\">{op.summary || op.operationId || path}</h1>\n </div>\n <p className=\"mt-1 font-mono text-xs text-muted-foreground\">{path}</p>\n {op.operationId && op.summary && (\n <p className=\"mt-2 font-mono text-xs text-muted-foreground\">{op.operationId}</p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{op.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n <div>\n <div className=\"mb-1 text-right text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Accept\n </div>\n <AcceptPicker\n value={accept}\n onChange={setAccept}\n previewMode={previewMode}\n onPreviewModeChange={setPreviewMode}\n />\n </div>\n {relatedOperations.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2\">\n {relatedOperations.map((related) =>\n related.href ? (\n renderLink ? (\n renderLink({\n key: `${related.operation.method}:${related.operation.path}`,\n to: related.href,\n className:\n \"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\",\n children: related.label,\n })\n ) : (\n <a\n key={`${related.operation.method}:${related.operation.path}`}\n href={related.href}\n className=\"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\"\n >\n {related.label}\n </a>\n )\n ) : (\n <OperationActionDialog\n key={`${related.operation.method}:${related.operation.path}`}\n operation={related.operation}\n client={client}\n initialValues={lockedPathValues}\n label={related.label}\n defaultAccept={accept}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n <section className=\"space-y-3\">\n {method.toUpperCase() === \"GET\" ? (\n parameters.length > 0 ? (\n // Before a result lands the FilterBar lives here so users can\n // fill in path params / required inputs and submit. Once a\n // result is showing AND auto-run is on (sidebar flow), the same\n // filter chips relocate into the DataTable's filter bar via\n // externalFilters, which is the unified placement the user asked\n // for. The two branches share `formConfig.filters` so the values\n // stay in sync.\n !result || !effectiveAutoRun ? (\n <div className=\"space-y-2\">\n <FilterBar\n autoSubmit={effectiveAutoRun}\n filters={formConfig.filters}\n {...(!effectiveAutoRun ? { onApply: () => handleManualSubmit() } : {})}\n applyLabel=\"Execute request\"\n isPending={isExecuting}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n />\n {submitError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {submitError}\n </div>\n )}\n </div>\n ) : null\n ) : null\n ) : (\n <div className=\"rounded-lg border p-4\">\n <CommandForm\n parameters={parameters}\n onExecute={(params) => executeOperation(params)}\n isPending={isExecuting}\n method={method}\n path={path}\n accept={accept}\n initialValues={effectiveInitialValues}\n />\n </div>\n )}\n\n {preview && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">{preview}</pre>\n )}\n </section>\n\n {error ? (\n <InlineError title={`Failed to load ${path} as ${accept}`} error={error} />\n ) : isExecuting && !result ? (\n <ExecutionResult loading loadingMessage=\"Loading execution results…\" className=\"mt-0\" />\n ) : result ? (\n <div role=\"region\" aria-label=\"Response body\">\n <CommandOutput\n response={result}\n bare\n {...(detailOperation\n ? {\n getTableRowHref: getRowDetailHref,\n onTableRowClick: handleTableRowClick,\n isTableRowClickable: (row: ClickyRow) => Boolean(getRowDetailHref(row)),\n }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.filters.length > 0\n ? { externalFilters: formConfig.filters }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\ntype RelatedOperation = {\n operation: ResolvedOperation;\n label: string;\n href?: string;\n};\n\nfunction findRelatedOperations(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n pathValues: Record<string, string>,\n): RelatedOperation[] {\n if (current.method.toUpperCase() !== \"GET\") return [];\n if (!pathTemplateSatisfied(current.path, pathValues)) return [];\n\n const basePath = current.path.replace(/\\/+$/, \"\");\n return operations\n .filter((candidate) => {\n if (candidate === current) return false;\n if (!candidate.path.startsWith(`${basePath}/`)) return false;\n if (!pathTemplateSatisfied(candidate.path, pathValues)) return false;\n const method = candidate.method.toUpperCase();\n return method === \"GET\" || method === \"POST\" || method === \"PUT\" || method === \"DELETE\";\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href = method === \"GET\" ? hrefForOperation(related, [], pathValues) : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter((related) => related.operation.method.toUpperCase() !== \"GET\" || related.href);\n}\n\nfunction findDetailOperation(current: ResolvedOperation, operations: ResolvedOperation[]) {\n const method = current.method.toUpperCase();\n const detailPath = `${current.path.replace(/\\/+$/, \"\")}/{id}`;\n return operations.find(\n (candidate) =>\n candidate.method.toUpperCase() === method &&\n candidate.path === detailPath &&\n candidate.operation.parameters?.some(\n (param) => param.in === \"path\" && param.name === \"id\" && param.required,\n ),\n );\n}\n\nfunction hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) 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 pathTemplateSatisfied(path: string, values: Record<string, string>) {\n return pathParamNames(path).every((name) => Boolean(values[name]));\n}\n\nfunction operationLabel(operation: ResolvedOperation): string {\n const actionName =\n operation.operation[\"x-clicky\"]?.actionName ||\n operation.path.split(\"/\").filter(Boolean).at(-1) ||\n operation.operation.operationId ||\n operation.method;\n return titleCase(actionName.replace(/[_-]+/g, \" \"));\n}\n\nfunction buildOperationPreview(\n operation: ResolvedOperation,\n values: ParameterValues,\n accept: string,\n mode: OperationPreviewMode,\n) {\n if (mode === \"hidden\") return \"\";\n if (mode === \"cli\") return buildCliPreview(operation, values);\n return buildCurlPreview(operation, values, accept);\n}\n\nfunction buildCurlPreview(operation: ResolvedOperation, values: ParameterValues, accept: string) {\n const params = operation.operation.parameters ?? [];\n const parts = [`curl -X ${operation.method.toUpperCase()}`];\n if (accept !== \"application/json\") parts.push(`-H \"Accept: ${accept}\"`);\n let url = operation.path;\n const queryParts: string[] = [];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\") {\n queryParts.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(value)}`);\n }\n }\n if (queryParts.length > 0) url += `?${queryParts.join(\"&\")}`;\n parts.push(`\"${url}\"`);\n return parts.join(\" \");\n}\n\nfunction buildCliPreview(operation: ResolvedOperation, values: ParameterValues) {\n const command = operation.operation[\"x-clicky\"]?.command;\n if (!command) return buildCurlPreview(operation, values, \"application/json\");\n const params = operation.operation.parameters ?? [];\n const positionalNames = new Set(params.filter(isPositionalParam).map((param) => param.name));\n const parts = [command.replaceAll(\"/\", \" \")];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\" || positionalNames.has(param.name)) {\n parts.push(shellQuote(value));\n continue;\n }\n parts.push(`--${param.name}`, shellQuote(value));\n }\n return parts.join(\" \");\n}\n\nfunction shellQuote(value: string) {\n if (/^[a-zA-Z0-9_./:@-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction stripRunnerParams(values: ParameterValues): ParameterValues {\n const next: ParameterValues = {};\n for (const [key, value] of Object.entries(values)) {\n if (key === \"autoRun\" || key === \"__autoRun\") continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction getClickyRowId(row: ClickyRow) {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields) return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n"],"names":["values"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCommandPage.js","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport type {\n ClickyCommandRuntime,\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n} from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { AcceptPicker, type OperationPreviewMode } from \"./AcceptPicker\";\nimport { CommandForm, pathParamNames, submitValue } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport type { RenderLink } from \"./EndpointList\";\nimport {\n buildInitialParameterValues,\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { isPositionalParam, type ExecutionResponse, type ResolvedOperation } from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationCommandPageProps = {\n client: OperationsApiClient;\n operationId?: string;\n operation?: ResolvedOperation;\n operations?: ResolvedOperation[];\n initialValues?: ParameterValues;\n autoRun?: boolean;\n backHref?: string;\n backLabel?: string;\n renderLink?: RenderLink;\n commandRuntime?: ClickyCommandRuntime;\n onNavigate?: (href: string) => void;\n hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nconst EMPTY_PARAMETER_VALUES: ParameterValues = {};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = EMPTY_PARAMETER_VALUES,\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(client, providedOperation ? undefined : operationId);\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [accept, setAccept] = useState(\"application/clicky+json\");\n const [previewMode, setPreviewMode] = useState<OperationPreviewMode>(\"hidden\");\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [submitError, setSubmitError] = useState(\"\");\n const [hasAutoRun, setHasAutoRun] = useState(false);\n const parameters = operation?.operation.parameters ?? [];\n const isGet = (operation?.method ?? \"\").toUpperCase() === \"GET\";\n const effectiveAutoRun = operation ? (autoRun ?? isGet) : false;\n const parameterSignature = JSON.stringify(\n parameters.map((param) => ({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n default: param.schema?.default ?? null,\n })),\n );\n const operationKey = `${operation?.method ?? \"\"}:${operation?.path ?? \"\"}:${operation?.operation.operationId ?? \"\"}`;\n const effectiveInitialValues = useMemo(\n () =>\n operation\n ? buildInitialParameterValues(\n parameters,\n operation.method,\n {},\n stripRunnerParams(initialValues),\n )\n : stripRunnerParams(initialValues),\n [initialValues, operation?.method, parameterSignature],\n );\n const pathParameters = parameters.filter((param) => param.in === \"path\");\n const lockedPathValues = useMemo<ParameterValues>(() => {\n const values: ParameterValues = {};\n for (const param of pathParameters) {\n const value = effectiveInitialValues[param.name];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n values[param.name] = value;\n }\n }\n return values;\n }, [effectiveInitialValues, pathParameters]);\n const detailOperation = useMemo(\n () => (operation ? findDetailOperation(operation, operations) : undefined),\n [operation, operations],\n );\n const relatedOperations = useMemo(\n () => (operation ? findRelatedOperations(operation, operations, lockedPathValues) : []),\n [lockedPathValues, operation, operations],\n );\n\n // GET-mode parameter state: filter values + pagination cursor are driven\n // by the page so they can flow natively into <CommandOutput>'s filter bar\n // and pagination footer instead of through a separate OperationQueryFilterBar.\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n setSubmitError(\"\");\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n const lookupQuery = useQuery({\n queryKey: [\"operation-query-lookup\", operation?.method, operation?.path, debouncedValues],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} }\n );\n },\n enabled:\n isGet &&\n !!operation &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);\n\n const dataTablePagination = useMemo(\n () => dataTablePaginationFromForm(formConfig.pagination, result),\n [formConfig.pagination, result],\n );\n\n // Ref tracking the last submitted parameter signature so that the\n // auto-submit-on-debounced-change effect and the manual submit button\n // both coordinate against the same \"have I already fired this set of\n // values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n function handleManualSubmit() {\n if (!operation) return;\n const merged = { ...values, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) {\n setSubmitError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`,\n );\n return;\n }\n setSubmitError(\"\");\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(merged));\n void executeOperation(merged);\n }\n\n async function executeOperation(values: ParameterValues) {\n if (!operation) return;\n\n setIsExecuting(true);\n setError(null);\n\n try {\n const response = await client.executeCommand(\n operation.path,\n operation.method,\n packParameterValues(values, operation.operation.parameters ?? []),\n { Accept: accept },\n );\n setResult(response);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n useEffect(() => {\n setHasAutoRun(false);\n setResult(null);\n setError(null);\n lastSubmittedSignature.current = \"\";\n }, [effectiveAutoRun, operationKey]);\n\n useEffect(() => {\n if (!effectiveAutoRun || !operation || hasAutoRun) return;\n // Auto-run a GET as long as every required parameter has a value. Optional\n // params (limit/offset, filter chips, etc.) get their defaults; the\n // sidebar's \"click → instant table\" flow depends on this not bailing just\n // because the operation declares any parameters at all.\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (effectiveInitialValues[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(effectiveInitialValues));\n void executeOperation(effectiveInitialValues);\n }, [\n accept,\n effectiveAutoRun,\n effectiveInitialValues,\n hasAutoRun,\n operationKey,\n parameterSignature,\n ]);\n\n // GET re-runs on debounced filter/pagination changes once the initial\n // auto-run has fired; non-GETs keep their explicit-submit behavior.\n useEffect(() => {\n if (!isGet || !operation || !hasAutoRun) return;\n const merged = { ...debouncedValues, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n const signature = JSON.stringify(pruneParameterValues(merged));\n if (lastSubmittedSignature.current === signature) return;\n lastSubmittedSignature.current = signature;\n void executeOperation(merged);\n }, [isGet, hasAutoRun, debouncedValues, lockedPathValues, parameterSignature]);\n\n const getRowDetailHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForOperation(detailOperation, [], { id });\n },\n [detailOperation],\n );\n\n const handleTableRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowDetailHref(row);\n if (href) onNavigate?.(href);\n },\n [getRowDetailHref, onNavigate],\n );\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading operation...</div>;\n }\n\n if (!operation) {\n return (\n <div className=\"space-y-4\">\n <div className=\"text-sm text-muted-foreground\">\n Unknown operation: <code>{operationId}</code>\n </div>\n {backLink}\n </div>\n );\n }\n\n const { path, method, operation: op } = operation;\n const preview = buildOperationPreview(operation, effectiveInitialValues, accept, previewMode);\n\n return (\n <div className={className ?? \"min-w-0 flex-1 space-y-6 p-6\"}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={method} />\n <h1 className=\"truncate text-xl font-bold\">{op.summary || op.operationId || path}</h1>\n </div>\n <p className=\"mt-1 font-mono text-xs text-muted-foreground\">{path}</p>\n {op.operationId && op.summary && (\n <p className=\"mt-2 font-mono text-xs text-muted-foreground\">{op.operationId}</p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{op.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n <div>\n <div className=\"mb-1 text-right text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Accept\n </div>\n <AcceptPicker\n value={accept}\n onChange={setAccept}\n previewMode={previewMode}\n onPreviewModeChange={setPreviewMode}\n />\n </div>\n {relatedOperations.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2\">\n {relatedOperations.map((related) =>\n related.href ? (\n renderLink ? (\n renderLink({\n key: `${related.operation.method}:${related.operation.path}`,\n to: related.href,\n className:\n \"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\",\n children: related.label,\n })\n ) : (\n <a\n key={`${related.operation.method}:${related.operation.path}`}\n href={related.href}\n className=\"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\"\n >\n {related.label}\n </a>\n )\n ) : (\n <OperationActionDialog\n key={`${related.operation.method}:${related.operation.path}`}\n operation={related.operation}\n client={client}\n initialValues={lockedPathValues}\n label={related.label}\n defaultAccept={accept}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n <section className=\"space-y-3\">\n {method.toUpperCase() === \"GET\" ? (\n parameters.length > 0 ? (\n // Before a result lands the FilterBar lives here so users can\n // fill in path params / required inputs and submit. Once a\n // result is showing AND auto-run is on (sidebar flow), the same\n // filter chips relocate into the DataTable's filter bar via\n // externalFilters, which is the unified placement the user asked\n // for. The two branches share `formConfig.filters` so the values\n // stay in sync.\n !result || !effectiveAutoRun ? (\n <div className=\"space-y-2\">\n <FilterBar\n autoSubmit={effectiveAutoRun}\n filters={formConfig.filters}\n {...(!effectiveAutoRun ? { onApply: () => handleManualSubmit() } : {})}\n applyLabel=\"Execute request\"\n isPending={isExecuting}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n />\n {submitError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {submitError}\n </div>\n )}\n </div>\n ) : null\n ) : null\n ) : (\n <div className=\"rounded-lg border p-4\">\n <CommandForm\n parameters={parameters}\n onExecute={(params) => executeOperation(params)}\n isPending={isExecuting}\n method={method}\n path={path}\n accept={accept}\n initialValues={effectiveInitialValues}\n />\n </div>\n )}\n\n {preview && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">{preview}</pre>\n )}\n </section>\n\n {error ? (\n <InlineError title={`Failed to load ${path} as ${accept}`} error={error} />\n ) : isExecuting || result ? (\n <div role=\"region\" aria-label=\"Response body\">\n <CommandOutput\n response={result}\n loading={isExecuting}\n loadingMessage=\"Loading execution results…\"\n bare\n {...(detailOperation\n ? {\n getTableRowHref: getRowDetailHref,\n onTableRowClick: handleTableRowClick,\n isTableRowClickable: (row: ClickyRow) => Boolean(getRowDetailHref(row)),\n }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.filters.length > 0\n ? { externalFilters: formConfig.filters }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\ntype RelatedOperation = {\n operation: ResolvedOperation;\n label: string;\n href?: string;\n};\n\nfunction findRelatedOperations(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n pathValues: Record<string, string>,\n): RelatedOperation[] {\n if (current.method.toUpperCase() !== \"GET\") return [];\n if (!pathTemplateSatisfied(current.path, pathValues)) return [];\n\n const basePath = current.path.replace(/\\/+$/, \"\");\n return operations\n .filter((candidate) => {\n if (candidate === current) return false;\n if (!candidate.path.startsWith(`${basePath}/`)) return false;\n if (!pathTemplateSatisfied(candidate.path, pathValues)) return false;\n const method = candidate.method.toUpperCase();\n return method === \"GET\" || method === \"POST\" || method === \"PUT\" || method === \"DELETE\";\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href = method === \"GET\" ? hrefForOperation(related, [], pathValues) : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter((related) => related.operation.method.toUpperCase() !== \"GET\" || related.href);\n}\n\nfunction findDetailOperation(current: ResolvedOperation, operations: ResolvedOperation[]) {\n const method = current.method.toUpperCase();\n const detailPath = `${current.path.replace(/\\/+$/, \"\")}/{id}`;\n return operations.find(\n (candidate) =>\n candidate.method.toUpperCase() === method &&\n candidate.path === detailPath &&\n candidate.operation.parameters?.some(\n (param) => param.in === \"path\" && param.name === \"id\" && param.required,\n ),\n );\n}\n\nfunction hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) 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 pathTemplateSatisfied(path: string, values: Record<string, string>) {\n return pathParamNames(path).every((name) => Boolean(values[name]));\n}\n\nfunction operationLabel(operation: ResolvedOperation): string {\n const actionName =\n operation.operation[\"x-clicky\"]?.actionName ||\n operation.path.split(\"/\").filter(Boolean).at(-1) ||\n operation.operation.operationId ||\n operation.method;\n return titleCase(actionName.replace(/[_-]+/g, \" \"));\n}\n\nfunction buildOperationPreview(\n operation: ResolvedOperation,\n values: ParameterValues,\n accept: string,\n mode: OperationPreviewMode,\n) {\n if (mode === \"hidden\") return \"\";\n if (mode === \"cli\") return buildCliPreview(operation, values);\n return buildCurlPreview(operation, values, accept);\n}\n\nfunction buildCurlPreview(operation: ResolvedOperation, values: ParameterValues, accept: string) {\n const params = operation.operation.parameters ?? [];\n const parts = [`curl -X ${operation.method.toUpperCase()}`];\n if (accept !== \"application/json\") parts.push(`-H \"Accept: ${accept}\"`);\n let url = operation.path;\n const queryParts: string[] = [];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\") {\n queryParts.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(value)}`);\n }\n }\n if (queryParts.length > 0) url += `?${queryParts.join(\"&\")}`;\n parts.push(`\"${url}\"`);\n return parts.join(\" \");\n}\n\nfunction buildCliPreview(operation: ResolvedOperation, values: ParameterValues) {\n const command = operation.operation[\"x-clicky\"]?.command;\n if (!command) return buildCurlPreview(operation, values, \"application/json\");\n const params = operation.operation.parameters ?? [];\n const positionalNames = new Set(params.filter(isPositionalParam).map((param) => param.name));\n const parts = [command.replaceAll(\"/\", \" \")];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\" || positionalNames.has(param.name)) {\n parts.push(shellQuote(value));\n continue;\n }\n parts.push(`--${param.name}`, shellQuote(value));\n }\n return parts.join(\" \");\n}\n\nfunction shellQuote(value: string) {\n if (/^[a-zA-Z0-9_./:@-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction stripRunnerParams(values: ParameterValues): ParameterValues {\n const next: ParameterValues = {};\n for (const [key, value] of Object.entries(values)) {\n if (key === \"autoRun\" || key.startsWith(\"__\")) continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction getClickyRowId(row: ClickyRow) {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields) return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n"],"names":["values"],"mappings":"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"}
|
package/dist/rpc/apiClient.cjs
CHANGED
|
@@ -176,6 +176,7 @@ function parseExecutionResponse(response, parsed, context) {
|
|
|
176
176
|
const exitCode = parseInt(headers["x-exit-code"] ?? (success ? "0" : "1"), 10);
|
|
177
177
|
const cli = headers["x-cli-command"];
|
|
178
178
|
const error = headers["x-error"] || clickyError;
|
|
179
|
+
const pagination = paginationFromHeaders(headers);
|
|
179
180
|
return {
|
|
180
181
|
success,
|
|
181
182
|
stdout,
|
|
@@ -183,6 +184,8 @@ function parseExecutionResponse(response, parsed, context) {
|
|
|
183
184
|
exit_code: Number.isFinite(exitCode) ? exitCode : success ? 0 : 1,
|
|
184
185
|
contentType: parsed.contentType || headers["content-type"] || "application/json",
|
|
185
186
|
requestUrl: context.requestUrl,
|
|
187
|
+
responseHeaders: headers,
|
|
188
|
+
...pagination ? { pagination } : {},
|
|
186
189
|
...cli ? { cli } : {},
|
|
187
190
|
...error ? { error } : {},
|
|
188
191
|
...parsed.blob ? { blob: parsed.blob } : {},
|
|
@@ -266,6 +269,21 @@ function responseHeaders(headers) {
|
|
|
266
269
|
});
|
|
267
270
|
return out;
|
|
268
271
|
}
|
|
272
|
+
function paginationFromHeaders(headers) {
|
|
273
|
+
const pagination = {};
|
|
274
|
+
const total = integerHeader(headers["x-total-count"]);
|
|
275
|
+
const limit = integerHeader(headers["x-page-limit"]);
|
|
276
|
+
const offset = integerHeader(headers["x-page-offset"]);
|
|
277
|
+
if (total !== void 0) pagination.total = total;
|
|
278
|
+
if (limit !== void 0) pagination.limit = limit;
|
|
279
|
+
if (offset !== void 0) pagination.offset = offset;
|
|
280
|
+
return Object.keys(pagination).length > 0 ? pagination : void 0;
|
|
281
|
+
}
|
|
282
|
+
function integerHeader(value) {
|
|
283
|
+
if (value == null || value.trim() === "") return void 0;
|
|
284
|
+
const parsed = parseInt(value, 10);
|
|
285
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
286
|
+
}
|
|
269
287
|
function shouldParseJson(text, contentType) {
|
|
270
288
|
const trimmed = text.trim();
|
|
271
289
|
return trimmed !== "" && (contentType.toLowerCase().includes("json") || trimmed.startsWith("{") || trimmed.startsWith("["));
|