@flanksource/clicky-ui 0.3.22 → 0.3.23
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/CountryFlag.cjs +55 -0
- package/dist/components/CountryFlag.cjs.map +1 -0
- package/dist/components/CountryFlag.d.ts +8 -0
- package/dist/components/CountryFlag.d.ts.map +1 -0
- package/dist/components/CountryFlag.js +38 -0
- package/dist/components/CountryFlag.js.map +1 -0
- package/dist/components/CountryPicker.cjs +35 -0
- package/dist/components/CountryPicker.cjs.map +1 -0
- package/dist/components/CountryPicker.d.ts +4 -0
- package/dist/components/CountryPicker.d.ts.map +1 -0
- package/dist/components/CountryPicker.js +35 -0
- package/dist/components/CountryPicker.js.map +1 -0
- package/dist/components/SplitButton.cjs +3 -2
- package/dist/components/SplitButton.cjs.map +1 -1
- package/dist/components/SplitButton.d.ts +6 -1
- package/dist/components/SplitButton.d.ts.map +1 -1
- package/dist/components/SplitButton.js +3 -2
- package/dist/components/SplitButton.js.map +1 -1
- package/dist/components/country-options.cjs +34 -0
- package/dist/components/country-options.cjs.map +1 -0
- package/dist/components/country-options.d.ts +8 -0
- package/dist/components/country-options.d.ts.map +1 -0
- package/dist/components/country-options.js +34 -0
- package/dist/components/country-options.js.map +1 -0
- package/dist/components.cjs +11 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +4 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +11 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -1
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -1
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeDiff.cjs +3 -18
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.d.ts.map +1 -1
- package/dist/data/CodeDiff.js +3 -18
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/DataTable.cjs +182 -64
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +9 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.cjs +26 -0
- package/dist/data/DataTable.grouping.cjs.map +1 -1
- package/dist/data/DataTable.grouping.d.ts +38 -0
- package/dist/data/DataTable.grouping.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.js +26 -0
- package/dist/data/DataTable.grouping.js.map +1 -1
- package/dist/data/DataTable.js +183 -65
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/DataTableGroupingControls.cjs +84 -0
- package/dist/data/DataTableGroupingControls.cjs.map +1 -0
- package/dist/data/DataTableGroupingControls.d.ts +17 -0
- package/dist/data/DataTableGroupingControls.d.ts.map +1 -0
- package/dist/data/DataTableGroupingControls.js +84 -0
- package/dist/data/DataTableGroupingControls.js.map +1 -0
- package/dist/data/HighlightedTokens.cjs +21 -0
- package/dist/data/HighlightedTokens.cjs.map +1 -0
- package/dist/data/HighlightedTokens.d.ts +6 -0
- package/dist/data/HighlightedTokens.d.ts.map +1 -0
- package/dist/data/HighlightedTokens.js +21 -0
- package/dist/data/HighlightedTokens.js.map +1 -0
- package/dist/data/code-highlight.cjs +0 -6
- package/dist/data/code-highlight.cjs.map +1 -1
- package/dist/data/code-highlight.d.ts +4 -3
- package/dist/data/code-highlight.d.ts.map +1 -1
- package/dist/data/code-highlight.js +1 -7
- package/dist/data/code-highlight.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +6 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +8 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +6 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.cjs +29 -5
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +29 -5
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +54 -24
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +2 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +54 -24
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +3 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.cjs +14 -30
- package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.d.ts +6 -9
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.js +15 -31
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.cjs +14 -144
- package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +6 -6
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.js +15 -145
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs +65 -0
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.d.ts +13 -0
- package/dist/data/diagnostics/StackFrameRow.d.ts.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.js +65 -0
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -0
- package/dist/data/diagnostics/ThreadCard.cjs +9 -2
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +9 -2
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/frame-heuristics.cjs +26 -0
- package/dist/data/diagnostics/frame-heuristics.cjs.map +1 -0
- package/dist/data/diagnostics/frame-heuristics.d.ts +5 -0
- package/dist/data/diagnostics/frame-heuristics.d.ts.map +1 -0
- package/dist/data/diagnostics/frame-heuristics.js +26 -0
- package/dist/data/diagnostics/frame-heuristics.js.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.cjs +5 -7
- package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.js +5 -7
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.cjs +4 -9
- package/dist/data/diagnostics/stacktrace-parse.cjs.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.js +4 -9
- package/dist/data/diagnostics/stacktrace-parse.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +7 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +8 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +18 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +8 -18
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.d.ts +8 -2
- package/dist/rpc/CommandForm.d.ts.map +1 -1
- package/dist/rpc/CommandForm.js +9 -19
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/OperationActionDialog.cjs +3 -3
- package/dist/rpc/OperationActionDialog.cjs.map +1 -1
- package/dist/rpc/OperationActionDialog.js +3 -3
- package/dist/rpc/OperationActionDialog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +7 -7
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +7 -7
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/apiClient.cjs +17 -3
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts +4 -4
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +17 -3
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +5 -9
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +3 -3
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +5 -9
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc/useOperations.cjs.map +1 -1
- package/dist/rpc/useOperations.d.ts +4 -4
- package/dist/rpc/useOperations.d.ts.map +1 -1
- package/dist/rpc/useOperations.js.map +1 -1
- package/dist/rpc.d.ts +2 -2
- package/dist/rpc.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formMetadata.cjs","sources":["../../src/rpc/formMetadata.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type {\n WorkloadKind,\n WorkloadResource,\n} from \"../components/workload-picker-utils\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type { SortState } from \"../hooks/use-sort\";\nimport {\n parseBoundsValue,\n parseMultiFilterValue,\n serializeBoundsValue,\n serializeMultiFilterValue,\n splitCommaValues,\n} from \"../data/data-table-filter-values\";\nimport { filterShapesByName } from \"./filterShapes\";\nimport type {\n ClickyFilterShape,\n ExecutionResponse,\n OpenAPIParameter,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport { isPositionalParam, parameterPlaceholder } from \"./types\";\n\nexport type ParameterValues = Record<string, string>;\nexport type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;\n\n// ParameterPagination plumbs limit/offset query parameters into the\n// DataTable's pagination footer. The UI exposes both as the\n// {pageSize, pageIndex} tuple but here we keep raw string limit/offset\n// values so the executor sees exactly what the operation declared.\nexport type ParameterPagination = {\n limitParam: string; // parameter name on the operation, e.g. \"limit\"\n limitValue: string;\n setLimit: (next: string) => void;\n\n // Offset paging, when the operation declares an offset parameter. Absent for\n // a surface that cannot name a position past its first page — a profile with\n // no total order, say. Such a surface still sizes its page and still reports\n // how many rows it is showing of how many; it just cannot step.\n offsetParam?: string;\n offsetValue?: string;\n setOffset?: (next: string) => void;\n\n // Cursor paging, when the operation declares a cursor parameter. Present\n // alongside limit/offset rather than instead of them: an operation can serve\n // both, and which one a page uses is decided per request.\n cursorParam?: string;\n cursorValue?: string;\n setCursor?: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n sort?: ParameterSort;\n};\n\nexport type ParameterSort = {\n value: SortState | null;\n onChange: (sort: SortState | null) => void;\n};\n// LookupSearch fetches the options of one filter matching `query`, server-side.\n// It is what a truncated option set is reachable through: the head the lookup\n// returned is only the first page of a larger distinct set, and everything past\n// it is found by typing rather than by scrolling.\nexport type LookupSearch = (\n filterKey: string,\n query: string,\n) => Promise<{ value: string; label: string; title?: string }[]>;\n\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\n // Wired only into filters the server marked truncated: one that fully\n // enumerated needs no round trip to search what is already in the browser.\n lookupSearch?: LookupSearch | undefined;\n // The spec's `components[\"x-clicky-filters\"]` map, which every filter\n // parameter names via its `$ref`. It is what a control's identity is read\n // from, so that identity survives a filter change: `lookup` carries the same\n // answer but is refetched per selection, and reading shape from it is what\n // used to collapse every chip into a text box for the length of that fetch.\n components?: Record<string, ClickyFilterShape> | undefined;\n};\n\n// A truncated set has to say so even where nothing can search it: the footer\n// telling the user 350 values are missing is what stops a partial list reading\n// as the whole answer.\nfunction truncationProps(filter: OperationLookupFilter) {\n if (!filter.truncated) return {};\n return {\n truncated: true,\n ...(filter.total !== undefined ? { total: filter.total } : {}),\n };\n}\n\n// Server-side search applies only when the server said it withheld options. A\n// filter whose set arrived whole is searched in the browser, which is both\n// faster and exactly as complete.\nfunction searchProps(\n filter: OperationLookupFilter,\n key: string,\n search: LookupSearch | undefined,\n) {\n if (!filter.truncated) return {};\n return {\n ...truncationProps(filter),\n ...(search ? { onSearch: (query: string) => search(key, query) } : {}),\n };\n}\n\nexport function titleCase(value: string) {\n return value\n .split(/[-_]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport function defaultValueForParameter(\n param: OpenAPIParameter,\n method: string,\n): string {\n if (\n method.toUpperCase() === \"GET\" &&\n param.in === \"query\" &&\n !param.required\n ) {\n return \"\";\n }\n const fallback = param.in === \"path\" ? \"\" : undefined;\n const value = param.schema?.default ?? fallback;\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value) || (value != null && typeof value === \"object\")) {\n return \"\";\n }\n if (value == null) {\n return \"\";\n }\n return String(value);\n}\n\nexport function buildInitialParameterValues(\n parameters: OpenAPIParameter[],\n method: string,\n lockedValues: ParameterValues = {},\n initialValues: ParameterValues = {},\n): ParameterValues {\n const values = Object.fromEntries(\n parameters.map((param) => [\n param.name,\n defaultValueForParameter(param, method),\n ]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\n\n// OFFSET_DEPTH_LIMIT is where offset paging stops being available and a cursor\n// takes over. It exists because backends refuse a deep offset outright —\n// OpenSearch's default result window is 10,000 — so this is the one place that\n// decides the changeover rather than each surface discovering the refusal for\n// itself. Below it, page-number jumps stay available; past it there is nothing\n// to jump with, because a cursor names a position rather than a page.\nexport const OFFSET_DEPTH_LIMIT = 10_000;\n\nexport function dataTablePaginationFromForm(\n pagination: ParameterPagination | undefined,\n response: Pick<ExecutionResponse, \"pagination\"> | null | undefined,\n): DataTablePagination | undefined {\n if (!pagination) return undefined;\n\n // The footer describes the rows currently rendered, not the request that is\n // replacing them. During keepPreviousData refetches the form already holds\n // the next offset while the response still holds the retained page.\n const pageSize =\n response?.pagination?.limit ?? positiveInt(pagination.limitValue) ?? 25;\n const offset =\n response?.pagination?.offset ?? nonNegativeInt(pagination.offsetValue) ?? 0;\n const page = Math.floor(offset / pageSize);\n const served = response?.pagination;\n const setCursor = pagination.setCursor;\n const setOffset = pagination.setOffset;\n\n return {\n page,\n pageSize,\n ...(served?.total !== undefined ? { total: served.total } : {}),\n ...(served?.totalRelation !== undefined\n ? { totalRelation: served.totalRelation }\n : {}),\n ...(served?.hasMore !== undefined ? { hasMore: served.hasMore } : {}),\n // Cursor mode needs both halves: a parameter to send the cursor on, and a\n // cursor to send. An operation that declares one without the server minting\n // the other pages by offset, which is correct and merely slower.\n //\n // Which mode applies is depth, not preference: a walk already under way\n // continues, and a shallow page keeps its jump controls until the next one\n // would cross OFFSET_DEPTH_LIMIT — the point past which the offset would be\n // refused anyway.\n ...(setCursor &&\n (pagination.cursorValue ||\n (served?.nextCursor &&\n (!setOffset || offset + pageSize >= OFFSET_DEPTH_LIMIT)))\n ? {\n cursor: {\n ...(pagination.cursorValue\n ? { current: pagination.cursorValue }\n : {}),\n ...(served?.nextCursor ? { next: served.nextCursor } : {}),\n onCursorChange: (next: string | undefined) => {\n // Offset and cursor are two disagreeing positions in one request,\n // so taking the cursor means dropping the offset.\n setOffset?.(\"0\");\n setCursor(next ?? \"\");\n },\n },\n }\n : {}),\n // Offered only when there is somewhere to step to. A surface with no offset\n // parameter still counts and still resizes, but naming page two would be\n // naming a page the server will refuse.\n ...(setOffset\n ? {\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n setCursor?.(\"\");\n setOffset(String(Math.max(next, 0) * pageSize));\n },\n }\n : {}),\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n // A cursor names a position in a page of the old size, so resizing the\n // page invalidates it and the walk restarts.\n setCursor?.(\"\");\n setOffset?.(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(\n Object.entries(values).filter(([, value]) => value !== \"\"),\n );\n}\n\n/**\n * Packs form/filter state into the request the operation actually describes.\n *\n * Values a parameter list does not name are dropped rather than forwarded.\n * Filter state outlives a single surface — the explorer seeds it from the URL\n * and carries it across routes — and a server asked for a filter it does not\n * have rejects the whole request rather than the one value, so a leftover\n * `filter.*` from another profile turns a working table into an error.\n */\nexport function packParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): ParameterValues {\n const positionalNames = new Set(\n parameters\n .filter((param) => param.in !== \"path\" && isPositionalParam(param))\n .map((p) => p.name),\n );\n const declaredNames = new Set(parameters.map((param) => param.name));\n const params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) continue;\n if (!declaredNames.has(key)) continue;\n if (positionalNames.has(key)) {\n args.push(value);\n } else {\n params[key] = value;\n }\n }\n\n if (args.length > 0) {\n params.args = args.join(\",\");\n }\n\n return params;\n}\n\nexport function packLookupParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): ParameterValues {\n return packParameterValues(\n values,\n parameters.filter(\n (parameter) =>\n parameter[\"x-clicky\"]?.role !== \"limit\" &&\n parameter[\"x-clicky\"]?.role !== \"offset\" &&\n parameter[\"x-clicky\"]?.role !== \"cursor\" &&\n parameter[\"x-clicky\"]?.role !== \"sort\" &&\n parameter[\"x-clicky\"]?.role !== \"order\",\n ),\n );\n}\n\nexport function parametersToFormConfig(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n setValues: ParameterValuesSetter,\n options: ParameterFormOptions = {},\n): ParameterFormConfig {\n const emitFilters: FilterBarFilter[] = [];\n const lookupFilters = options.lookup?.filters ?? {};\n // Shape comes from the spec, values from the lookup. The lookup answers both\n // questions, but only the values half of its answer can change, so a control\n // that reads its identity from the spec keeps that identity while the values\n // half is being refetched.\n const shapes = filterShapesByName(parameters, options.components);\n const includeLocations = new Set(\n options.includeLocations ?? [\"path\", \"query\", \"header\"],\n );\n const lockedValues = options.lockedValues ?? {};\n const hideLocked = options.hideLocked ?? false;\n\n // Pull limit/offset out of the filter loop entirely — they drive pagination,\n // not filter pills. Roles come from server-side `paramRole` (see\n // clicky/rpc/openapi.go); the older \"named limit on a GET\" heuristic is\n // intentionally not duplicated here so the server stays the single source\n // of truth for parameter classification.\n const limitParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"limit\");\n const offsetParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"offset\");\n // A cursor is an opaque server-minted token, so it is never a filter chip a\n // user could type into — it is only ever echoed back from a previous page.\n const cursorParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"cursor\");\n const sortParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"sort\");\n const orderParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"order\");\n if ((sortParam == null) !== (orderParam == null)) {\n throw new Error(\"Server sorting requires both sort and order parameters\");\n }\n const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.name);\n if (cursorParam) paginationOmitNames.add(cursorParam.name);\n if (sortParam) paginationOmitNames.add(sortParam.name);\n if (orderParam) paginationOmitNames.add(orderParam.name);\n\n // The search-role param drives the FilterBar's dedicated search input rather\n // than a filter chip; pull it out of the chip loop the same way pagination is.\n const searchParam = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"search\" && includeLocations.has(p.in),\n );\n const omitNames = new Set(paginationOmitNames);\n if (searchParam) omitNames.add(searchParam.name);\n\n // rewind returns the caller to the first page whenever the result set itself\n // changes. Both positions have to go: an offset into the old rows names\n // different rows in the new ones, and a cursor minted under the old filters\n // is rejected by the server outright rather than silently reinterpreted.\n const rewind = (next: ParameterValues): ParameterValues => ({\n ...next,\n ...(offsetParam ? { [offsetParam.name]: \"0\" } : {}),\n ...(cursorParam ? { [cursorParam.name]: \"\" } : {}),\n });\n\n // Time-range first looks for server-stamped roles, then falls back to the\n // existing lookup-driven \"from\"/\"to\" detection so older specs keep working.\n const roleRangeStart = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"time-from\",\n );\n const roleRangeEnd = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"time-to\",\n );\n const edgeType = (param: OpenAPIParameter) =>\n shapes.get(param.name)?.type ?? lookupFilters[param.name]?.type;\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n edgeType(param) === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n edgeType(param) === \"to\",\n );\n const hasTimeRange = rangeStart != null && rangeEnd != null;\n\n for (const param of parameters) {\n if (!includeLocations.has(param.in)) continue;\n if (omitNames.has(param.name)) continue;\n if (\n hasTimeRange &&\n (param.name === rangeStart?.name || param.name === rangeEnd?.name)\n ) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(\n lockedValues,\n param.name,\n );\n if (disabled && hideLocked) continue;\n const value = disabled\n ? (lockedValues[param.name] ?? \"\")\n : (values[param.name] ?? \"\");\n const shape = shapes.get(param.name);\n const label =\n shape?.label ?? lookupFilters[param.name]?.label ?? titleCase(param.name);\n // Only an explicit placeholder is rendered — never synthesize one. The\n // field already carries `label`, so a fallback placeholder is redundant\n // and generic defaults (e.g. \"value-1, value-2\") read as fake data.\n const placeholder = parameterPlaceholder(param);\n const placeholderProp = placeholder !== undefined ? { placeholder } : {};\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue =\n typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => rewind({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n // The spec's answer wins: it is the one that is still there mid-refetch.\n const filterType = shape?.type ?? lookupFilter?.type;\n\n if (filterType === \"workload\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"workload\",\n label,\n value,\n disabled,\n kinds: [\"pod\", \"deployment\", \"statefulset\", \"daemonset\"],\n loadWorkloads: async (kinds) =>\n lookupFilter ? workloadsFromLookup(lookupFilter, kinds) : {},\n // A server-generated workload filter is scoped by the operation itself,\n // so a lookup returning one workload means the scope already picked it.\n collapseSingleOption: true,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"labels\" && param.in === \"query\") {\n const fieldOptions = lookupFilter\n ? lookupOptionsToFieldOptions(lookupFilter)\n : [];\n const selection = parseMultiFilterValue(value);\n const grouped =\n fieldOptions.some((option) => option.value.includes(\"=\")) ||\n Object.keys(selection).some((selected) => selected.includes(\"=\"));\n if (grouped) {\n emitFilters.push({\n key: param.name,\n kind: \"nested-multi\",\n label,\n value: selection,\n disabled,\n groups: labelOptionGroups(fieldOptions),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n } else {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: selection,\n disabled,\n options: fieldOptions,\n ...(lookupFilter\n ? searchProps(lookupFilter, param.name, options.lookupSearch)\n : {}),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n }\n continue;\n }\n\n // Both edges of a range travel under one parameter, so the control is built\n // from that parameter alone rather than from the from/to pair below.\n // A \"day-range\" is the same control with the clock taken off it, so it\n // shares this branch and differs only in timeEnabled.\n if (\n (filterType === \"date-range\" || filterType === \"day-range\") &&\n param.in === \"query\"\n ) {\n // A server that declares a default applies it to a request that names no\n // bound, so the control shows that default rather than \"any time\" — an\n // empty range control over a bounded query states the wrong query. Only\n // the display falls back; the value is still whatever was selected, so\n // nothing is written to the URL on the strength of a default.\n const bounds = parseBoundsValue(\n value || String(param.schema?.default ?? \"\"),\n );\n emitFilters.push({\n key: param.name,\n kind: \"date-range\",\n label,\n disabled,\n ...(bounds.min !== undefined ? { from: bounds.min } : {}),\n ...(bounds.max !== undefined ? { to: bounds.max } : {}),\n ...(lookupFilter?.presets ? { presets: lookupFilter.presets } : {}),\n timeEnabled:\n filterType === \"day-range\" ? false : (lookupFilter?.timeEnabled ?? true),\n ...(lookupFilter?.timeZone ? { timeZone: lookupFilter.timeZone } : {}),\n ...(lookupFilter?.timeZones\n ? { timeZones: lookupFilter.timeZones }\n : {}),\n onApply: (from: string, to: string) => {\n if (disabled) return;\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeBoundsValue({ min: from, max: to }),\n }),\n );\n },\n });\n continue;\n }\n\n // An exact-value selection with nothing to enumerate. It shares the\n // multi-filter grammar, so the raw string is written through unchanged:\n // \"a,b\" is two values and \"!a\" excludes one, exactly as picking them would.\n if (filterType === \"value\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"multi-filter\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: parseMultiFilterValue(value),\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n ...(lookupFilter\n ? searchProps(lookupFilter, param.name, options.lookupSearch)\n : {}),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n continue;\n }\n\n if (schema?.enum) {\n emitFilters.push({\n key: param.name,\n kind: \"enum\",\n label,\n value,\n disabled,\n options: schema.enum.map((item) => ({\n value: String(item),\n label: String(item),\n })),\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"bool\" || schema?.type === \"boolean\") {\n emitFilters.push({\n key: param.name,\n kind: \"boolean\",\n label,\n value: value === \"true\",\n disabled,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if ((shape != null || lookupFilter != null) && param.in === \"query\") {\n if (shape?.multi ?? lookupFilter?.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n // Reported, not searched: this control's onSearch hands the query back\n // to the consumer to refetch and re-feed `options`, which is a\n // different contract from the one searchProps satisfies.\n ...(lookupFilter ? truncationProps(lookupFilter) : {}),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) =>\n rewind({ ...current, [param.name]: next.join(\",\") }),\n ),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n ...placeholderProp,\n inputType:\n filterType === \"number\"\n ? \"number\"\n : filterType === \"date\"\n ? \"date\"\n : \"text\",\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (sortParam && orderParam) {\n const key = values[sortParam.name] ?? \"\";\n const direction = values[orderParam.name] || \"asc\";\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new Error(`Unsupported server sort direction ${direction}`);\n }\n config.sort = {\n value: key ? { key, dir: direction } : null,\n onChange: (next) =>\n setValues((current) => {\n const updated = { ...current };\n if (next) {\n updated[sortParam.name] = next.key;\n updated[orderParam.name] = next.dir;\n } else {\n delete updated[sortParam.name];\n delete updated[orderParam.name];\n }\n return rewind(updated);\n }),\n };\n }\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(\n lockedValues,\n searchParam.name,\n );\n const searchValue = searchDisabled\n ? (lockedValues[searchParam.name] ?? \"\")\n : (values[searchParam.name] ?? \"\");\n const searchPlaceholder = parameterPlaceholder(searchParam);\n config.search = {\n value: searchValue,\n onChange: (next) => {\n if (searchDisabled) return;\n setValues((current) =>\n rewind({ ...current, [searchParam.name]: next }),\n );\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel:\n lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n // Gated on the limit alone. An operation that caps its rows can report how\n // many of how many it is showing and can resize the cap, both of which are\n // independent of being able to step to a second page — and gating the whole\n // footer on the offset is what made a surface without one report \"100 of 100\"\n // while the server was answering with a total of 12,558.\n if (limitParam) {\n config.pagination = {\n limitParam: limitParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n setLimit: (next) =>\n setValues((current) => ({ ...current, [limitParam.name]: next })),\n ...(offsetParam\n ? {\n offsetParam: offsetParam.name,\n offsetValue: values[offsetParam.name] ?? \"\",\n setOffset: (next: string) =>\n setValues((current) => ({\n ...current,\n [offsetParam.name]: next,\n })),\n }\n : {}),\n ...(cursorParam\n ? {\n cursorParam: cursorParam.name,\n cursorValue: values[cursorParam.name] ?? \"\",\n setCursor: (next: string) =>\n setValues((current) => ({\n ...current,\n [cursorParam.name]: next,\n })),\n }\n : {}),\n };\n }\n if (hasTimeRange && rangeStart != null && rangeEnd != null) {\n const rangeStartMeta = lookupFilters[rangeStart.name];\n const rangeEndMeta = lookupFilters[rangeEnd.name];\n const rangeMeta = rangeStartMeta ?? rangeEndMeta;\n const explicitTimeEnabled =\n rangeStartMeta?.timeEnabled ?? rangeEndMeta?.timeEnabled;\n config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) =>\n rewind({ ...current, [rangeStart.name]: from, [rangeEnd.name]: to }),\n ),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n timeEnabled:\n explicitTimeEnabled ??\n (rangeStart.schema?.format === \"date-time\" ||\n rangeEnd.schema?.format === \"date-time\"),\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description\n ? { fromPlaceholder: rangeStart.description }\n : {}),\n ...(rangeEnd.description ? { toPlaceholder: rangeEnd.description } : {}),\n };\n }\n\n return config;\n}\n\nexport function useDebouncedRecord<T>(value: T, delayMs: number) {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(timeoutId);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nfunction positiveInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction nonNegativeInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nexport function lookupOptionsToFieldOptions(filter: OperationLookupFilter) {\n const merged = new Map<string, { label?: string; title?: string }>();\n\n for (const [value, node] of Object.entries(filter.options ?? {})) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n\n for (const [value, node] of Object.entries(filter.selected ?? {})) {\n if (!merged.has(value)) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n }\n\n return Array.from(merged.entries()).map(([value, meta]) => ({\n value,\n label: meta.label ?? value,\n title: meta.title ?? value,\n }));\n}\n\nfunction workloadsFromLookup(\n filter: OperationLookupFilter,\n kinds: WorkloadKind[],\n): Partial<Record<WorkloadKind, WorkloadResource[]>> {\n const requested = new Set(kinds);\n const result: Partial<Record<WorkloadKind, WorkloadResource[]>> = {};\n for (const kind of kinds) result[kind] = [];\n for (const option of lookupOptionsToFieldOptions(filter)) {\n const parts = option.value.split(\"/\");\n const name = parts.at(-1);\n const providerKind = parts.at(-2)?.toLowerCase() as\n | WorkloadKind\n | undefined;\n const namespace =\n parts.length > 2 ? parts.slice(0, -2).join(\"/\") : undefined;\n if (!name || !providerKind || !requested.has(providerKind)) continue;\n result[providerKind]?.push({ name, ...(namespace ? { namespace } : {}) });\n }\n return result;\n}\n\nfunction labelOptionGroups(\n options: ReturnType<typeof lookupOptionsToFieldOptions>,\n) {\n const grouped = new Map<string, typeof options>();\n for (const option of options) {\n const separator = option.value.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = option.value.slice(0, separator);\n const value = option.value.slice(separator + 1);\n const values = grouped.get(key) ?? [];\n values.push({ ...option, label: value || option.label });\n grouped.set(key, values);\n }\n return Array.from(grouped, ([groupKey, groupOptions]) => ({\n groupKey,\n label: groupKey,\n options: groupOptions,\n }));\n}\n\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(\n node: PlainTextClickyNode | null | undefined,\n): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? [])\n .map((child) => clickyNodeToPlainText(child))\n .join(\"\");\n}\n"],"names":["isPositionalParam","filterShapesByName","_a","_b","parameterPlaceholder","parseMultiFilterValue","serializeMultiFilterValue","parseBoundsValue","serializeBoundsValue","splitCommaValues","useState","useEffect"],"mappings":";;;;;;AAiGA,SAAS,gBAAgB,QAA+B;AACtD,MAAI,CAAC,OAAO,UAAW,QAAO,CAAA;AAC9B,SAAO;AAAA,IACL,WAAW;AAAA,IACX,GAAI,OAAO,UAAU,SAAY,EAAE,OAAO,OAAO,UAAU,CAAA;AAAA,EAAC;AAEhE;AAKA,SAAS,YACP,QACA,KACA,QACA;AACA,MAAI,CAAC,OAAO,UAAW,QAAO,CAAA;AAC9B,SAAO;AAAA,IACL,GAAG,gBAAgB,MAAM;AAAA,IACzB,GAAI,SAAS,EAAE,UAAU,CAAC,UAAkB,OAAO,KAAK,KAAK,MAAM,CAAA;AAAA,EAAC;AAExE;AAEO,SAAS,UAAU,OAAe;AACvC,SAAO,MACJ,MAAM,MAAM,EACZ,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;AAEO,SAAS,yBACd,OACA,QACQ;;AACR,MACE,OAAO,kBAAkB,SACzB,MAAM,OAAO,WACb,CAAC,MAAM,UACP;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,OAAO,SAAS,KAAK;AAC5C,QAAM,UAAQ,WAAM,WAAN,mBAAc,YAAW;AACvC,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,QAAQ,SAAS;AAAA,EAC1B;AACA,MAAI,MAAM,QAAQ,KAAK,KAAM,SAAS,QAAQ,OAAO,UAAU,UAAW;AACxE,WAAO;AAAA,EACT;AACA,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,4BACd,YACA,QACA,eAAgC,CAAA,GAChC,gBAAiC,IAChB;AACjB,QAAM,SAAS,OAAO;AAAA,IACpB,WAAW,IAAI,CAAC,UAAU;AAAA,MACxB,MAAM;AAAA,MACN,yBAAyB,OAAO,MAAM;AAAA,IAAA,CACvC;AAAA,EAAA;AAEH,SAAO,EAAE,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAA;AAC3C;AAQO,MAAM,qBAAqB;AAE3B,SAAS,4BACd,YACA,UACiC;;AACjC,MAAI,CAAC,WAAY,QAAO;AAKxB,QAAM,aACJ,0CAAU,eAAV,mBAAsB,UAAS,YAAY,WAAW,UAAU,KAAK;AACvE,QAAM,WACJ,0CAAU,eAAV,mBAAsB,WAAU,eAAe,WAAW,WAAW,KAAK;AAC5E,QAAM,OAAO,KAAK,MAAM,SAAS,QAAQ;AACzC,QAAM,SAAS,qCAAU;AACzB,QAAM,YAAY,WAAW;AAC7B,QAAM,YAAY,WAAW;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,iCAAQ,WAAU,SAAY,EAAE,OAAO,OAAO,MAAA,IAAU,CAAA;AAAA,IAC5D,IAAI,iCAAQ,mBAAkB,SAC1B,EAAE,eAAe,OAAO,cAAA,IACxB,CAAA;AAAA,IACJ,IAAI,iCAAQ,aAAY,SAAY,EAAE,SAAS,OAAO,QAAA,IAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASlE,GAAI,cACH,WAAW,gBACT,iCAAQ,gBACN,CAAC,aAAa,SAAS,YAAY,uBACpC;AAAA,MACE,QAAQ;AAAA,QACN,GAAI,WAAW,cACX,EAAE,SAAS,WAAW,YAAA,IACtB,CAAA;AAAA,QACJ,IAAI,iCAAQ,cAAa,EAAE,MAAM,OAAO,WAAA,IAAe,CAAA;AAAA,QACvD,gBAAgB,CAAC,SAA6B;AAG5C,iDAAY;AACZ,oBAAU,QAAQ,EAAE;AAAA,QACtB;AAAA,MAAA;AAAA,IACF,IAEF,CAAA;AAAA;AAAA;AAAA;AAAA,IAIJ,GAAI,YACA;AAAA,MACE,cAAc,CAAC,SAAiB;AAC9B,YAAI,YAAY,WAAW,UAAU,KAAK,MAAM;AAC9C,qBAAW,SAAS,OAAO,QAAQ,CAAC;AAAA,QACtC;AACA,+CAAY;AACZ,kBAAU,OAAO,KAAK,IAAI,MAAM,CAAC,IAAI,QAAQ,CAAC;AAAA,MAChD;AAAA,IAAA,IAEF,CAAA;AAAA,IACJ,kBAAkB,CAAC,SAAiB;AAClC,iBAAW,SAAS,OAAO,IAAI,CAAC;AAGhC,6CAAY;AACZ,6CAAY;AAAA,IACd;AAAA,EAAA;AAEJ;AAEO,SAAS,qBAAqB,QAAyB;AAC5D,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,MAAM,UAAU,EAAE;AAAA,EAAA;AAE7D;AAWO,SAAS,oBACd,QACA,YACiB;AACjB,QAAM,kBAAkB,IAAI;AAAA,IAC1B,WACG,OAAO,CAAC,UAAU,MAAM,OAAO,UAAUA,wBAAkB,KAAK,CAAC,EACjE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAAA;AAEtB,QAAM,gBAAgB,IAAI,IAAI,WAAW,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AACnE,QAAM,SAA0B,CAAA;AAChC,QAAM,OAAiB,CAAA;AAEvB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,CAAC,MAAO;AACZ,QAAI,CAAC,cAAc,IAAI,GAAG,EAAG;AAC7B,QAAI,gBAAgB,IAAI,GAAG,GAAG;AAC5B,WAAK,KAAK,KAAK;AAAA,IACjB,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO,OAAO,KAAK,KAAK,GAAG;AAAA,EAC7B;AAEA,SAAO;AACT;AAEO,SAAS,0BACd,QACA,YACiB;AACjB,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,MACT,CAAC,cAAA;;AACC,gCAAU,UAAU,MAApB,mBAAuB,UAAS,aAChC,eAAU,UAAU,MAApB,mBAAuB,UAAS,cAChC,eAAU,UAAU,MAApB,mBAAuB,UAAS,cAChC,eAAU,UAAU,MAApB,mBAAuB,UAAS,YAChC,eAAU,UAAU,MAApB,mBAAuB,UAAS;AAAA;AAAA,IAAA;AAAA,EACpC;AAEJ;AAEO,SAAS,uBACd,YACA,QACA,WACA,UAAgC,CAAA,GACX;;AACrB,QAAM,cAAiC,CAAA;AACvC,QAAM,kBAAgB,aAAQ,WAAR,mBAAgB,YAAW,CAAA;AAKjD,QAAM,SAASC,aAAAA,mBAAmB,YAAY,QAAQ,UAAU;AAChE,QAAM,mBAAmB,IAAI;AAAA,IAC3B,QAAQ,oBAAoB,CAAC,QAAQ,SAAS,QAAQ;AAAA,EAAA;AAExD,QAAM,eAAe,QAAQ,gBAAgB,CAAA;AAC7C,QAAM,aAAa,QAAQ,cAAc;AAOzC,QAAM,aAAa,WAAW,KAAK,CAAC;;AAAM,aAAAC,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAO;AACzE,QAAM,cAAc,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAQ;AAG3E,QAAM,cAAc,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAQ;AAC3E,QAAM,YAAY,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAM;AACvE,QAAM,aAAa,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAO;AACzE,MAAK,aAAa,UAAW,cAAc,OAAO;AAChD,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,QAAM,0CAA0B,IAAA;AAChC,MAAI,WAAY,qBAAoB,IAAI,WAAW,IAAI;AACvD,MAAI,YAAa,qBAAoB,IAAI,YAAY,IAAI;AACzD,MAAI,YAAa,qBAAoB,IAAI,YAAY,IAAI;AACzD,MAAI,UAAW,qBAAoB,IAAI,UAAU,IAAI;AACrD,MAAI,WAAY,qBAAoB,IAAI,WAAW,IAAI;AAIvD,QAAM,cAAc,WAAW;AAAA,IAC7B,CAAC,MAAA;;AAAM,eAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS,YAAY,iBAAiB,IAAI,EAAE,EAAE;AAAA;AAAA,EAAA;AAEtE,QAAM,YAAY,IAAI,IAAI,mBAAmB;AAC7C,MAAI,YAAa,WAAU,IAAI,YAAY,IAAI;AAM/C,QAAM,SAAS,CAAC,UAA4C;AAAA,IAC1D,GAAG;AAAA,IACH,GAAI,cAAc,EAAE,CAAC,YAAY,IAAI,GAAG,IAAA,IAAQ,CAAA;AAAA,IAChD,GAAI,cAAc,EAAE,CAAC,YAAY,IAAI,GAAG,GAAA,IAAO,CAAA;AAAA,EAAC;AAKlD,QAAM,iBAAiB,WAAW;AAAA,IAChC,CAAC,MAAA;;AAAM,eAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA;AAAA,EAAA;AAEjC,QAAM,eAAe,WAAW;AAAA,IAC9B,CAAC,MAAA;;AAAM,eAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA;AAAA,EAAA;AAEjC,QAAM,WAAW,CAAC;;AAChB,aAAAA,MAAA,OAAO,IAAI,MAAM,IAAI,MAArB,gBAAAA,IAAwB,WAAQC,MAAA,cAAc,MAAM,IAAI,MAAxB,gBAAAA,IAA2B;AAAA;AAC7D,QAAM,aACJ,kBACA,WAAW;AAAA,IACT,CAAC,UACC,iBAAiB,IAAI,MAAM,EAAE,KAC7B,MAAM,OAAO,WACb,SAAS,KAAK,MAAM;AAAA,EAAA;AAE1B,QAAM,WACJ,gBACA,WAAW;AAAA,IACT,CAAC,UACC,iBAAiB,IAAI,MAAM,EAAE,KAC7B,MAAM,OAAO,WACb,SAAS,KAAK,MAAM;AAAA,EAAA;AAE1B,QAAM,eAAe,cAAc,QAAQ,YAAY;AAEvD,aAAW,SAAS,YAAY;AAC9B,QAAI,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAG;AACrC,QAAI,UAAU,IAAI,MAAM,IAAI,EAAG;AAC/B,QACE,iBACC,MAAM,UAAS,yCAAY,SAAQ,MAAM,UAAS,qCAAU,QAC7D;AACA;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,UAAU,eAAe;AAAA,MAC/C;AAAA,MACA,MAAM;AAAA,IAAA;AAER,QAAI,YAAY,WAAY;AAC5B,UAAM,QAAQ,WACT,aAAa,MAAM,IAAI,KAAK,KAC5B,OAAO,MAAM,IAAI,KAAK;AAC3B,UAAM,QAAQ,OAAO,IAAI,MAAM,IAAI;AACnC,UAAM,SACJ,+BAAO,YAAS,mBAAc,MAAM,IAAI,MAAxB,mBAA2B,UAAS,UAAU,MAAM,IAAI;AAI1E,UAAM,cAAcC,MAAAA,qBAAqB,KAAK;AAC9C,UAAM,kBAAkB,gBAAgB,SAAY,EAAE,YAAA,IAAgB,CAAA;AACtE,UAAM,WAAW,CAAC,SAA2B;AAC3C,UAAI,SAAU;AACd,YAAM,cACJ,OAAO,SAAS,YAAa,OAAO,SAAS,UAAW;AAC1D,gBAAU,CAAC,YAAY,OAAO,EAAE,GAAG,SAAS,CAAC,MAAM,IAAI,GAAG,YAAA,CAAa,CAAC;AAAA,IAC1E;AAEA,UAAM,SAAS,MAAM;AACrB,UAAM,eAAe,cAAc,MAAM,IAAI;AAE7C,UAAM,cAAa,+BAAO,UAAQ,6CAAc;AAEhD,QAAI,eAAe,cAAc,MAAM,OAAO,SAAS;AACrD,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,CAAC,OAAO,cAAc,eAAe,WAAW;AAAA,QACvD,eAAe,OAAO,UACpB,eAAe,oBAAoB,cAAc,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA,QAG5D,sBAAsB;AAAA,QACtB,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,QAAI,eAAe,YAAY,MAAM,OAAO,SAAS;AACnD,YAAM,eAAe,eACjB,4BAA4B,YAAY,IACxC,CAAA;AACJ,YAAM,YAAYC,sBAAAA,sBAAsB,KAAK;AAC7C,YAAM,UACJ,aAAa,KAAK,CAAC,WAAW,OAAO,MAAM,SAAS,GAAG,CAAC,KACxD,OAAO,KAAK,SAAS,EAAE,KAAK,CAAC,aAAa,SAAS,SAAS,GAAG,CAAC;AAClE,UAAI,SAAS;AACX,oBAAY,KAAK;AAAA,UACf,KAAK,MAAM;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,QAAQ,kBAAkB,YAAY;AAAA,UACtC,UAAU,CAAC,SACT;AAAA,YAAU,CAAC,YACT,OAAO;AAAA,cACL,GAAG;AAAA,cACH,CAAC,MAAM,IAAI,GAAGC,sBAAAA,0BAA0B,IAAI;AAAA,YAAA,CAC7C;AAAA,UAAA;AAAA,QACH,CACH;AAAA,MACH,OAAO;AACL,oBAAY,KAAK;AAAA,UACf,KAAK,MAAM;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,SAAS;AAAA,UACT,GAAI,eACA,YAAY,cAAc,MAAM,MAAM,QAAQ,YAAY,IAC1D,CAAA;AAAA,UACJ,UAAU,CAAC,SACT;AAAA,YAAU,CAAC,YACT,OAAO;AAAA,cACL,GAAG;AAAA,cACH,CAAC,MAAM,IAAI,GAAGA,sBAAAA,0BAA0B,IAAI;AAAA,YAAA,CAC7C;AAAA,UAAA;AAAA,QACH,CACH;AAAA,MACH;AACA;AAAA,IACF;AAMA,SACG,eAAe,gBAAgB,eAAe,gBAC/C,MAAM,OAAO,SACb;AAMA,YAAM,SAASC,sBAAAA;AAAAA,QACb,SAAS,SAAO,WAAM,WAAN,mBAAc,YAAW,EAAE;AAAA,MAAA;AAE7C,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,GAAI,OAAO,QAAQ,SAAY,EAAE,MAAM,OAAO,IAAA,IAAQ,CAAA;AAAA,QACtD,GAAI,OAAO,QAAQ,SAAY,EAAE,IAAI,OAAO,IAAA,IAAQ,CAAA;AAAA,QACpD,IAAI,6CAAc,WAAU,EAAE,SAAS,aAAa,QAAA,IAAY,CAAA;AAAA,QAChE,aACE,eAAe,cAAc,SAAS,6CAAc,gBAAe;AAAA,QACrE,IAAI,6CAAc,YAAW,EAAE,UAAU,aAAa,SAAA,IAAa,CAAA;AAAA,QACnE,IAAI,6CAAc,aACd,EAAE,WAAW,aAAa,UAAA,IAC1B,CAAA;AAAA,QACJ,SAAS,CAAC,MAAc,OAAe;AACrC,cAAI,SAAU;AACd;AAAA,YAAU,CAAC,YACT,OAAO;AAAA,cACL,GAAG;AAAA,cACH,CAAC,MAAM,IAAI,GAAGC,sBAAAA,qBAAqB,EAAE,KAAK,MAAM,KAAK,GAAA,CAAI;AAAA,YAAA,CAC1D;AAAA,UAAA;AAAA,QAEL;AAAA,MAAA,CACD;AACD;AAAA,IACF;AAKA,QAAI,eAAe,WAAW,MAAM,OAAO,SAAS;AAClD,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,QAAI,eAAe,kBAAkB,MAAM,OAAO,SAAS;AACzD,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,OAAOH,sBAAAA,sBAAsB,KAAK;AAAA,QAClC;AAAA,QACA,SAAS,eAAe,4BAA4B,YAAY,IAAI,CAAA;AAAA,QACpE,GAAI,eACA,YAAY,cAAc,MAAM,MAAM,QAAQ,YAAY,IAC1D,CAAA;AAAA,QACJ,UAAU,CAAC,SACT;AAAA,UAAU,CAAC,YACT,OAAO;AAAA,YACL,GAAG;AAAA,YACH,CAAC,MAAM,IAAI,GAAGC,sBAAAA,0BAA0B,IAAI;AAAA,UAAA,CAC7C;AAAA,QAAA;AAAA,MACH,CACH;AACD;AAAA,IACF;AAEA,QAAI,iCAAQ,MAAM;AAChB,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,OAAO,KAAK,IAAI,CAAC,UAAU;AAAA,UAClC,OAAO,OAAO,IAAI;AAAA,UAClB,OAAO,OAAO,IAAI;AAAA,QAAA,EAClB;AAAA,QACF,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,QAAI,eAAe,WAAU,iCAAQ,UAAS,WAAW;AACvD,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,OAAO,UAAU;AAAA,QACjB;AAAA,QACA,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,SAAK,SAAS,QAAQ,gBAAgB,SAAS,MAAM,OAAO,SAAS;AACnE,WAAI,+BAAO,WAAS,6CAAc,QAAO;AACvC,oBAAY,KAAK;AAAA,UACf,KAAK,MAAM;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,OAAOG,sBAAAA,iBAAiB,KAAK;AAAA,UAC7B;AAAA,UACA,SAAS,eAAe,4BAA4B,YAAY,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,UAIpE,GAAI,eAAe,gBAAgB,YAAY,IAAI,CAAA;AAAA,UACnD,GAAG;AAAA,UACH,UAAU,CAAC,SACT;AAAA,YAAU,CAAC,YACT,OAAO,EAAE,GAAG,SAAS,CAAC,MAAM,IAAI,GAAG,KAAK,KAAK,GAAG,GAAG;AAAA,UAAA;AAAA,QACrD,CACH;AACD;AAAA,MACF;AAEA,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,eAAe,4BAA4B,YAAY,IAAI,CAAA;AAAA,QACpE,GAAG;AAAA,QACH,WACE,eAAe,WACX,WACA,eAAe,SACb,SACA;AAAA,QACR,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,gBAAY,KAAK;AAAA,MACf,KAAK,MAAM;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,IAAA,CAClC;AAAA,EACH;AAEA,QAAM,SAA8B,EAAE,SAAS,YAAA;AAC/C,MAAI,aAAa,YAAY;AAC3B,UAAM,MAAM,OAAO,UAAU,IAAI,KAAK;AACtC,UAAM,YAAY,OAAO,WAAW,IAAI,KAAK;AAC7C,QAAI,cAAc,SAAS,cAAc,QAAQ;AAC/C,YAAM,IAAI,MAAM,qCAAqC,SAAS,EAAE;AAAA,IAClE;AACA,WAAO,OAAO;AAAA,MACZ,OAAO,MAAM,EAAE,KAAK,KAAK,cAAc;AAAA,MACvC,UAAU,CAAC,SACT,UAAU,CAAC,YAAY;AACrB,cAAM,UAAU,EAAE,GAAG,QAAA;AACrB,YAAI,MAAM;AACR,kBAAQ,UAAU,IAAI,IAAI,KAAK;AAC/B,kBAAQ,WAAW,IAAI,IAAI,KAAK;AAAA,QAClC,OAAO;AACL,iBAAO,QAAQ,UAAU,IAAI;AAC7B,iBAAO,QAAQ,WAAW,IAAI;AAAA,QAChC;AACA,eAAO,OAAO,OAAO;AAAA,MACvB,CAAC;AAAA,IAAA;AAAA,EAEP;AACA,MAAI,aAAa;AACf,UAAM,iBAAiB,OAAO,UAAU,eAAe;AAAA,MACrD;AAAA,MACA,YAAY;AAAA,IAAA;AAEd,UAAM,cAAc,iBACf,aAAa,YAAY,IAAI,KAAK,KAClC,OAAO,YAAY,IAAI,KAAK;AACjC,UAAM,oBAAoBL,MAAAA,qBAAqB,WAAW;AAC1D,WAAO,SAAS;AAAA,MACd,OAAO;AAAA,MACP,UAAU,CAAC,SAAS;AAClB,YAAI,eAAgB;AACpB;AAAA,UAAU,CAAC,YACT,OAAO,EAAE,GAAG,SAAS,CAAC,YAAY,IAAI,GAAG,KAAA,CAAM;AAAA,QAAA;AAAA,MAEnD;AAAA,MACA,GAAI,oBAAoB,EAAE,aAAa,kBAAA,IAAsB,CAAA;AAAA,MAC7D,aACE,mBAAc,YAAY,IAAI,MAA9B,mBAAiC,UAAS,UAAU,YAAY,IAAI;AAAA,IAAA;AAAA,EAE1E;AAMA,MAAI,YAAY;AACd,WAAO,aAAa;AAAA,MAClB,YAAY,WAAW;AAAA,MACvB,YAAY,OAAO,WAAW,IAAI,KAAK;AAAA,MACvC,UAAU,CAAC,SACT,UAAU,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,WAAW,IAAI,GAAG,OAAO;AAAA,MAClE,GAAI,cACA;AAAA,QACE,aAAa,YAAY;AAAA,QACzB,aAAa,OAAO,YAAY,IAAI,KAAK;AAAA,QACzC,WAAW,CAAC,SACV,UAAU,CAAC,aAAa;AAAA,UACtB,GAAG;AAAA,UACH,CAAC,YAAY,IAAI,GAAG;AAAA,QAAA,EACpB;AAAA,MAAA,IAEN,CAAA;AAAA,MACJ,GAAI,cACA;AAAA,QACE,aAAa,YAAY;AAAA,QACzB,aAAa,OAAO,YAAY,IAAI,KAAK;AAAA,QACzC,WAAW,CAAC,SACV,UAAU,CAAC,aAAa;AAAA,UACtB,GAAG;AAAA,UACH,CAAC,YAAY,IAAI,GAAG;AAAA,QAAA,EACpB;AAAA,MAAA,IAEN,CAAA;AAAA,IAAC;AAAA,EAET;AACA,MAAI,gBAAgB,cAAc,QAAQ,YAAY,MAAM;AAC1D,UAAM,iBAAiB,cAAc,WAAW,IAAI;AACpD,UAAM,eAAe,cAAc,SAAS,IAAI;AAChD,UAAM,YAAY,kBAAkB;AACpC,UAAM,uBACJ,iDAAgB,iBAAe,6CAAc;AAC/C,WAAO,YAAY;AAAA,MACjB,MAAM,OAAO,WAAW,IAAI,KAAK;AAAA,MACjC,IAAI,OAAO,SAAS,IAAI,KAAK;AAAA,MAC7B,SAAS,CAAC,MAAM,OACd;AAAA,QAAU,CAAC,YACT,OAAO,EAAE,GAAG,SAAS,CAAC,WAAW,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,IAAI;AAAA,MAAA;AAAA,MAEvE,IAAI,uCAAW,WAAU,EAAE,SAAS,UAAU,QAAA,IAAY,CAAA;AAAA,MAC1D,aACE,0BACC,gBAAW,WAAX,mBAAmB,YAAW,iBAC7B,cAAS,WAAT,mBAAiB,YAAW;AAAA,MAChC,IAAI,uCAAW,YAAW,EAAE,UAAU,UAAU,SAAA,IAAa,CAAA;AAAA,MAC7D,IAAI,uCAAW,aAAY,EAAE,WAAW,UAAU,UAAA,IAAc,CAAA;AAAA,MAChE,GAAI,WAAW,cACX,EAAE,iBAAiB,WAAW,YAAA,IAC9B,CAAA;AAAA,MACJ,GAAI,SAAS,cAAc,EAAE,eAAe,SAAS,YAAA,IAAgB,CAAA;AAAA,IAAC;AAAA,EAE1E;AAEA,SAAO;AACT;AAEO,SAAS,mBAAsB,OAAU,SAAiB;AAC/D,QAAM,CAAC,WAAW,YAAY,IAAIM,MAAAA,SAAS,KAAK;AAEhDC,QAAAA,UAAU,MAAM;AACd,UAAM,YAAY,OAAO,WAAW,MAAM,aAAa,KAAK,GAAG,OAAO;AACtE,WAAO,MAAM,OAAO,aAAa,SAAS;AAAA,EAC5C,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,SAAO;AACT;AAEA,SAAS,YAAY,OAA+C;AAClE,QAAM,SAAS,SAAS,SAAS,IAAI,EAAE;AACvC,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAC1D;AAEA,SAAS,eAAe,OAA+C;AACrE,QAAM,SAAS,SAAS,SAAS,IAAI,EAAE;AACvC,SAAO,OAAO,SAAS,MAAM,KAAK,UAAU,IAAI,SAAS;AAC3D;AAEO,SAAS,4BAA4B,QAA+B;AACzE,QAAM,6BAAa,IAAA;AAEnB,aAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,OAAO,WAAW,CAAA,CAAE,GAAG;AAChE,WAAO,IAAI,OAAO;AAAA,MAChB,OAAO,sBAAsB,IAAI,KAAK;AAAA,MACtC,OAAO,sBAAsB,IAAI,KAAK;AAAA,IAAA,CACvC;AAAA,EACH;AAEA,aAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,OAAO,YAAY,CAAA,CAAE,GAAG;AACjE,QAAI,CAAC,OAAO,IAAI,KAAK,GAAG;AACtB,aAAO,IAAI,OAAO;AAAA,QAChB,OAAO,sBAAsB,IAAI,KAAK;AAAA,QACtC,OAAO,sBAAsB,IAAI,KAAK;AAAA,MAAA,CACvC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,OAAO,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO;AAAA,IAC1D;AAAA,IACA,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO,KAAK,SAAS;AAAA,EAAA,EACrB;AACJ;AAEA,SAAS,oBACP,QACA,OACmD;;AACnD,QAAM,YAAY,IAAI,IAAI,KAAK;AAC/B,QAAM,SAA4D,CAAA;AAClE,aAAW,QAAQ,MAAO,QAAO,IAAI,IAAI,CAAA;AACzC,aAAW,UAAU,4BAA4B,MAAM,GAAG;AACxD,UAAM,QAAQ,OAAO,MAAM,MAAM,GAAG;AACpC,UAAM,OAAO,MAAM,GAAG,EAAE;AACxB,UAAM,gBAAe,WAAM,GAAG,EAAE,MAAX,mBAAc;AAGnC,UAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI;AACpD,QAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,IAAI,YAAY,EAAG;AAC5D,iBAAO,YAAY,MAAnB,mBAAsB,KAAK,EAAE,MAAM,GAAI,YAAY,EAAE,cAAc,CAAA;EACrE;AACA,SAAO;AACT;AAEA,SAAS,kBACP,SACA;AACA,QAAM,8BAAc,IAAA;AACpB,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAY,OAAO,MAAM,QAAQ,GAAG;AAC1C,QAAI,aAAa,EAAG;AACpB,UAAM,MAAM,OAAO,MAAM,MAAM,GAAG,SAAS;AAC3C,UAAM,QAAQ,OAAO,MAAM,MAAM,YAAY,CAAC;AAC9C,UAAM,SAAS,QAAQ,IAAI,GAAG,KAAK,CAAA;AACnC,WAAO,KAAK,EAAE,GAAG,QAAQ,OAAO,SAAS,OAAO,OAAO;AACvD,YAAQ,IAAI,KAAK,MAAM;AAAA,EACzB;AACA,SAAO,MAAM,KAAK,SAAS,CAAC,CAAC,UAAU,YAAY,OAAO;AAAA,IACxD;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,EACT;AACJ;AASA,SAAS,sBACP,MACQ;AACR,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,UAAQ,KAAK,YAAY,CAAA,GACtB,IAAI,CAAC,UAAU,sBAAsB,KAAK,CAAC,EAC3C,KAAK,EAAE;AACZ;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"formMetadata.cjs","sources":["../../src/rpc/formMetadata.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type {\n WorkloadKind,\n WorkloadResource,\n} from \"../components/workload-picker-utils\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type { SortState } from \"../hooks/use-sort\";\nimport {\n parseBoundsValue,\n parseMultiFilterValue,\n serializeBoundsValue,\n serializeMultiFilterValue,\n splitCommaValues,\n} from \"../data/data-table-filter-values\";\nimport { filterShapesByName } from \"./filterShapes\";\nimport type {\n ClickyFilterShape,\n ExecutionResponse,\n OpenAPIParameter,\n OperationLookupFilter,\n OperationLookupResponse,\n OperationRequestValues,\n} from \"./types\";\nimport { isPositionalParam, parameterPlaceholder } from \"./types\";\n\nexport type ParameterValues = Record<string, string>;\nexport type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;\n\n// ParameterPagination plumbs limit/offset query parameters into the\n// DataTable's pagination footer. The UI exposes both as the\n// {pageSize, pageIndex} tuple but here we keep raw string limit/offset\n// values so the executor sees exactly what the operation declared.\nexport type ParameterPagination = {\n limitParam: string; // parameter name on the operation, e.g. \"limit\"\n limitValue: string;\n setLimit: (next: string) => void;\n\n // Offset paging, when the operation declares an offset parameter. Absent for\n // a surface that cannot name a position past its first page — a profile with\n // no total order, say. Such a surface still sizes its page and still reports\n // how many rows it is showing of how many; it just cannot step.\n offsetParam?: string;\n offsetValue?: string;\n setOffset?: (next: string) => void;\n\n // Cursor paging, when the operation declares a cursor parameter. Present\n // alongside limit/offset rather than instead of them: an operation can serve\n // both, and which one a page uses is decided per request.\n cursorParam?: string;\n cursorValue?: string;\n setCursor?: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n sort?: ParameterSort;\n};\n\nexport type ParameterSort = {\n value: SortState | null;\n onChange: (sort: SortState | null) => void;\n};\n// LookupSearch fetches the options of one filter matching `query`, server-side.\n// It is what a truncated option set is reachable through: the head the lookup\n// returned is only the first page of a larger distinct set, and everything past\n// it is found by typing rather than by scrolling.\nexport type LookupSearch = (\n filterKey: string,\n query: string,\n) => Promise<{ value: string; label: string; title?: string }[]>;\n\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\n // Wired only into filters the server marked truncated: one that fully\n // enumerated needs no round trip to search what is already in the browser.\n lookupSearch?: LookupSearch | undefined;\n // The spec's `components[\"x-clicky-filters\"]` map, which every filter\n // parameter names via its `$ref`. It is what a control's identity is read\n // from, so that identity survives a filter change: `lookup` carries the same\n // answer but is refetched per selection, and reading shape from it is what\n // used to collapse every chip into a text box for the length of that fetch.\n components?: Record<string, ClickyFilterShape> | undefined;\n};\n\n// A truncated set has to say so even where nothing can search it: the footer\n// telling the user 350 values are missing is what stops a partial list reading\n// as the whole answer.\nfunction truncationProps(filter: OperationLookupFilter) {\n if (!filter.truncated) return {};\n return {\n truncated: true,\n ...(filter.total !== undefined ? { total: filter.total } : {}),\n };\n}\n\n// Server-side search applies only when the server said it withheld options. A\n// filter whose set arrived whole is searched in the browser, which is both\n// faster and exactly as complete.\nfunction searchProps(\n filter: OperationLookupFilter,\n key: string,\n search: LookupSearch | undefined,\n) {\n if (!filter.truncated) return {};\n return {\n ...truncationProps(filter),\n ...(search ? { onSearch: (query: string) => search(key, query) } : {}),\n };\n}\n\nexport function titleCase(value: string) {\n return value\n .split(/[-_]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport function defaultValueForParameter(\n param: OpenAPIParameter,\n method: string,\n): string {\n if (\n method.toUpperCase() === \"GET\" &&\n param.in === \"query\" &&\n !param.required\n ) {\n return \"\";\n }\n const fallback = param.in === \"path\" ? \"\" : undefined;\n const value = param.schema?.default ?? fallback;\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value) || (value != null && typeof value === \"object\")) {\n return \"\";\n }\n if (value == null) {\n return \"\";\n }\n return String(value);\n}\n\nexport function buildInitialParameterValues(\n parameters: OpenAPIParameter[],\n method: string,\n lockedValues: ParameterValues = {},\n initialValues: ParameterValues = {},\n): ParameterValues {\n const values = Object.fromEntries(\n parameters.map((param) => [\n param.name,\n defaultValueForParameter(param, method),\n ]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\n\n// OFFSET_DEPTH_LIMIT is where offset paging stops being available and a cursor\n// takes over. It exists because backends refuse a deep offset outright —\n// OpenSearch's default result window is 10,000 — so this is the one place that\n// decides the changeover rather than each surface discovering the refusal for\n// itself. Below it, page-number jumps stay available; past it there is nothing\n// to jump with, because a cursor names a position rather than a page.\nexport const OFFSET_DEPTH_LIMIT = 10_000;\n\nexport function dataTablePaginationFromForm(\n pagination: ParameterPagination | undefined,\n response: Pick<ExecutionResponse, \"pagination\"> | null | undefined,\n): DataTablePagination | undefined {\n if (!pagination) return undefined;\n\n // The footer describes the rows currently rendered, not the request that is\n // replacing them. During keepPreviousData refetches the form already holds\n // the next offset while the response still holds the retained page.\n const pageSize =\n response?.pagination?.limit ?? positiveInt(pagination.limitValue) ?? 25;\n const offset =\n response?.pagination?.offset ?? nonNegativeInt(pagination.offsetValue) ?? 0;\n const page = Math.floor(offset / pageSize);\n const served = response?.pagination;\n const setCursor = pagination.setCursor;\n const setOffset = pagination.setOffset;\n\n return {\n page,\n pageSize,\n ...(served?.total !== undefined ? { total: served.total } : {}),\n ...(served?.totalRelation !== undefined\n ? { totalRelation: served.totalRelation }\n : {}),\n ...(served?.hasMore !== undefined ? { hasMore: served.hasMore } : {}),\n // Cursor mode needs both halves: a parameter to send the cursor on, and a\n // cursor to send. An operation that declares one without the server minting\n // the other pages by offset, which is correct and merely slower.\n //\n // Which mode applies is depth, not preference: a walk already under way\n // continues, and a shallow page keeps its jump controls until the next one\n // would cross OFFSET_DEPTH_LIMIT — the point past which the offset would be\n // refused anyway.\n ...(setCursor &&\n (pagination.cursorValue ||\n (served?.nextCursor &&\n (!setOffset || offset + pageSize >= OFFSET_DEPTH_LIMIT)))\n ? {\n cursor: {\n ...(pagination.cursorValue\n ? { current: pagination.cursorValue }\n : {}),\n ...(served?.nextCursor ? { next: served.nextCursor } : {}),\n onCursorChange: (next: string | undefined) => {\n // Offset and cursor are two disagreeing positions in one request,\n // so taking the cursor means dropping the offset.\n setOffset?.(\"0\");\n setCursor(next ?? \"\");\n },\n },\n }\n : {}),\n // Offered only when there is somewhere to step to. A surface with no offset\n // parameter still counts and still resizes, but naming page two would be\n // naming a page the server will refuse.\n ...(setOffset\n ? {\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n setCursor?.(\"\");\n setOffset(String(Math.max(next, 0) * pageSize));\n },\n }\n : {}),\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n // A cursor names a position in a page of the old size, so resizing the\n // page invalidates it and the walk restarts.\n setCursor?.(\"\");\n setOffset?.(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(\n Object.entries(values).filter(([, value]) => value !== \"\"),\n );\n}\n\n/**\n * Packs form/filter state into the request the operation actually describes.\n *\n * Values a parameter list does not name are dropped rather than forwarded.\n * Filter state outlives a single surface — the explorer seeds it from the URL\n * and carries it across routes — and a server asked for a filter it does not\n * have rejects the whole request rather than the one value, so a leftover\n * `filter.*` from another profile turns a working table into an error.\n */\nexport function packParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): OperationRequestValues {\n const params: OperationRequestValues = {};\n const args: string[] = [];\n\n for (const parameter of parameters) {\n const value = values[parameter.name];\n if (!value) continue;\n if (parameter.in !== \"path\" && isPositionalParam(parameter)) {\n args.push(value);\n } else {\n params[parameter.name] = value;\n }\n }\n\n if (args.length > 0) {\n params.args = args;\n }\n\n return params;\n}\n\nexport function packLookupParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): OperationRequestValues {\n return packParameterValues(\n values,\n parameters.filter(\n (parameter) =>\n parameter[\"x-clicky\"]?.role !== \"limit\" &&\n parameter[\"x-clicky\"]?.role !== \"offset\" &&\n parameter[\"x-clicky\"]?.role !== \"cursor\" &&\n parameter[\"x-clicky\"]?.role !== \"sort\" &&\n parameter[\"x-clicky\"]?.role !== \"order\",\n ),\n );\n}\n\nexport function parametersToFormConfig(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n setValues: ParameterValuesSetter,\n options: ParameterFormOptions = {},\n): ParameterFormConfig {\n const emitFilters: FilterBarFilter[] = [];\n const lookupFilters = options.lookup?.filters ?? {};\n // Shape comes from the spec, values from the lookup. The lookup answers both\n // questions, but only the values half of its answer can change, so a control\n // that reads its identity from the spec keeps that identity while the values\n // half is being refetched.\n const shapes = filterShapesByName(parameters, options.components);\n const includeLocations = new Set(\n options.includeLocations ?? [\"path\", \"query\", \"header\"],\n );\n const lockedValues = options.lockedValues ?? {};\n const hideLocked = options.hideLocked ?? false;\n\n // Pull limit/offset out of the filter loop entirely — they drive pagination,\n // not filter pills. Roles come from server-side `paramRole` (see\n // clicky/rpc/openapi.go); the older \"named limit on a GET\" heuristic is\n // intentionally not duplicated here so the server stays the single source\n // of truth for parameter classification.\n const limitParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"limit\");\n const offsetParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"offset\");\n // A cursor is an opaque server-minted token, so it is never a filter chip a\n // user could type into — it is only ever echoed back from a previous page.\n const cursorParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"cursor\");\n const sortParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"sort\");\n const orderParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"order\");\n if ((sortParam == null) !== (orderParam == null)) {\n throw new Error(\"Server sorting requires both sort and order parameters\");\n }\n const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.name);\n if (cursorParam) paginationOmitNames.add(cursorParam.name);\n if (sortParam) paginationOmitNames.add(sortParam.name);\n if (orderParam) paginationOmitNames.add(orderParam.name);\n\n // The search-role param drives the FilterBar's dedicated search input rather\n // than a filter chip; pull it out of the chip loop the same way pagination is.\n const searchParam = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"search\" && includeLocations.has(p.in),\n );\n const omitNames = new Set(paginationOmitNames);\n if (searchParam) omitNames.add(searchParam.name);\n\n // rewind returns the caller to the first page whenever the result set itself\n // changes. Both positions have to go: an offset into the old rows names\n // different rows in the new ones, and a cursor minted under the old filters\n // is rejected by the server outright rather than silently reinterpreted.\n const rewind = (next: ParameterValues): ParameterValues => ({\n ...next,\n ...(offsetParam ? { [offsetParam.name]: \"0\" } : {}),\n ...(cursorParam ? { [cursorParam.name]: \"\" } : {}),\n });\n\n // Time-range first looks for server-stamped roles, then falls back to the\n // existing lookup-driven \"from\"/\"to\" detection so older specs keep working.\n const roleRangeStart = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"time-from\",\n );\n const roleRangeEnd = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"time-to\",\n );\n const edgeType = (param: OpenAPIParameter) =>\n shapes.get(param.name)?.type ?? lookupFilters[param.name]?.type;\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n edgeType(param) === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n edgeType(param) === \"to\",\n );\n const hasTimeRange = rangeStart != null && rangeEnd != null;\n\n for (const param of parameters) {\n if (!includeLocations.has(param.in)) continue;\n if (omitNames.has(param.name)) continue;\n if (\n hasTimeRange &&\n (param.name === rangeStart?.name || param.name === rangeEnd?.name)\n ) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(\n lockedValues,\n param.name,\n );\n if (disabled && hideLocked) continue;\n const value = disabled\n ? (lockedValues[param.name] ?? \"\")\n : (values[param.name] ?? \"\");\n const shape = shapes.get(param.name);\n const label =\n shape?.label ?? lookupFilters[param.name]?.label ?? titleCase(param.name);\n // Only an explicit placeholder is rendered — never synthesize one. The\n // field already carries `label`, so a fallback placeholder is redundant\n // and generic defaults (e.g. \"value-1, value-2\") read as fake data.\n const placeholder = parameterPlaceholder(param);\n const placeholderProp = placeholder !== undefined ? { placeholder } : {};\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue =\n typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => rewind({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n // The spec's answer wins: it is the one that is still there mid-refetch.\n const filterType = shape?.type ?? lookupFilter?.type;\n\n if (filterType === \"workload\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"workload\",\n label,\n value,\n disabled,\n kinds: [\"pod\", \"deployment\", \"statefulset\", \"daemonset\"],\n loadWorkloads: async (kinds) =>\n lookupFilter ? workloadsFromLookup(lookupFilter, kinds) : {},\n // A server-generated workload filter is scoped by the operation itself,\n // so a lookup returning one workload means the scope already picked it.\n collapseSingleOption: true,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"labels\" && param.in === \"query\") {\n const fieldOptions = lookupFilter\n ? lookupOptionsToFieldOptions(lookupFilter)\n : [];\n const selection = parseMultiFilterValue(value);\n const grouped =\n fieldOptions.some((option) => option.value.includes(\"=\")) ||\n Object.keys(selection).some((selected) => selected.includes(\"=\"));\n if (grouped) {\n emitFilters.push({\n key: param.name,\n kind: \"nested-multi\",\n label,\n value: selection,\n disabled,\n groups: labelOptionGroups(fieldOptions),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n } else {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: selection,\n disabled,\n options: fieldOptions,\n ...(lookupFilter\n ? searchProps(lookupFilter, param.name, options.lookupSearch)\n : {}),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n }\n continue;\n }\n\n // Both edges of a range travel under one parameter, so the control is built\n // from that parameter alone rather than from the from/to pair below.\n // A \"day-range\" is the same control with the clock taken off it, so it\n // shares this branch and differs only in timeEnabled.\n if (\n (filterType === \"date-range\" || filterType === \"day-range\") &&\n param.in === \"query\"\n ) {\n // A server that declares a default applies it to a request that names no\n // bound, so the control shows that default rather than \"any time\" — an\n // empty range control over a bounded query states the wrong query. Only\n // the display falls back; the value is still whatever was selected, so\n // nothing is written to the URL on the strength of a default.\n const bounds = parseBoundsValue(\n value || String(param.schema?.default ?? \"\"),\n );\n emitFilters.push({\n key: param.name,\n kind: \"date-range\",\n label,\n disabled,\n ...(bounds.min !== undefined ? { from: bounds.min } : {}),\n ...(bounds.max !== undefined ? { to: bounds.max } : {}),\n ...(lookupFilter?.presets ? { presets: lookupFilter.presets } : {}),\n timeEnabled:\n filterType === \"day-range\" ? false : (lookupFilter?.timeEnabled ?? true),\n ...(lookupFilter?.timeZone ? { timeZone: lookupFilter.timeZone } : {}),\n ...(lookupFilter?.timeZones\n ? { timeZones: lookupFilter.timeZones }\n : {}),\n onApply: (from: string, to: string) => {\n if (disabled) return;\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeBoundsValue({ min: from, max: to }),\n }),\n );\n },\n });\n continue;\n }\n\n // An exact-value selection with nothing to enumerate. It shares the\n // multi-filter grammar, so the raw string is written through unchanged:\n // \"a,b\" is two values and \"!a\" excludes one, exactly as picking them would.\n if (filterType === \"value\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"multi-filter\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: parseMultiFilterValue(value),\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n ...(lookupFilter\n ? searchProps(lookupFilter, param.name, options.lookupSearch)\n : {}),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n continue;\n }\n\n if (schema?.enum) {\n emitFilters.push({\n key: param.name,\n kind: \"enum\",\n label,\n value,\n disabled,\n options: schema.enum.map((item) => ({\n value: String(item),\n label: String(item),\n })),\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"bool\" || schema?.type === \"boolean\") {\n emitFilters.push({\n key: param.name,\n kind: \"boolean\",\n label,\n value: value === \"true\",\n disabled,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if ((shape != null || lookupFilter != null) && param.in === \"query\") {\n if (shape?.multi ?? lookupFilter?.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n // Reported, not searched: this control's onSearch hands the query back\n // to the consumer to refetch and re-feed `options`, which is a\n // different contract from the one searchProps satisfies.\n ...(lookupFilter ? truncationProps(lookupFilter) : {}),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) =>\n rewind({ ...current, [param.name]: next.join(\",\") }),\n ),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n ...placeholderProp,\n inputType:\n filterType === \"number\"\n ? \"number\"\n : filterType === \"date\"\n ? \"date\"\n : \"text\",\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (sortParam && orderParam) {\n const key = values[sortParam.name] ?? \"\";\n const direction = values[orderParam.name] || \"asc\";\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new Error(`Unsupported server sort direction ${direction}`);\n }\n config.sort = {\n value: key ? { key, dir: direction } : null,\n onChange: (next) =>\n setValues((current) => {\n const updated = { ...current };\n if (next) {\n updated[sortParam.name] = next.key;\n updated[orderParam.name] = next.dir;\n } else {\n delete updated[sortParam.name];\n delete updated[orderParam.name];\n }\n return rewind(updated);\n }),\n };\n }\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(\n lockedValues,\n searchParam.name,\n );\n const searchValue = searchDisabled\n ? (lockedValues[searchParam.name] ?? \"\")\n : (values[searchParam.name] ?? \"\");\n const searchPlaceholder = parameterPlaceholder(searchParam);\n config.search = {\n value: searchValue,\n onChange: (next) => {\n if (searchDisabled) return;\n setValues((current) =>\n rewind({ ...current, [searchParam.name]: next }),\n );\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel:\n lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n // Gated on the limit alone. An operation that caps its rows can report how\n // many of how many it is showing and can resize the cap, both of which are\n // independent of being able to step to a second page — and gating the whole\n // footer on the offset is what made a surface without one report \"100 of 100\"\n // while the server was answering with a total of 12,558.\n if (limitParam) {\n config.pagination = {\n limitParam: limitParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n setLimit: (next) =>\n setValues((current) => ({ ...current, [limitParam.name]: next })),\n ...(offsetParam\n ? {\n offsetParam: offsetParam.name,\n offsetValue: values[offsetParam.name] ?? \"\",\n setOffset: (next: string) =>\n setValues((current) => ({\n ...current,\n [offsetParam.name]: next,\n })),\n }\n : {}),\n ...(cursorParam\n ? {\n cursorParam: cursorParam.name,\n cursorValue: values[cursorParam.name] ?? \"\",\n setCursor: (next: string) =>\n setValues((current) => ({\n ...current,\n [cursorParam.name]: next,\n })),\n }\n : {}),\n };\n }\n if (hasTimeRange && rangeStart != null && rangeEnd != null) {\n const rangeStartMeta = lookupFilters[rangeStart.name];\n const rangeEndMeta = lookupFilters[rangeEnd.name];\n const rangeMeta = rangeStartMeta ?? rangeEndMeta;\n const explicitTimeEnabled =\n rangeStartMeta?.timeEnabled ?? rangeEndMeta?.timeEnabled;\n config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) =>\n rewind({ ...current, [rangeStart.name]: from, [rangeEnd.name]: to }),\n ),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n timeEnabled:\n explicitTimeEnabled ??\n (rangeStart.schema?.format === \"date-time\" ||\n rangeEnd.schema?.format === \"date-time\"),\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description\n ? { fromPlaceholder: rangeStart.description }\n : {}),\n ...(rangeEnd.description ? { toPlaceholder: rangeEnd.description } : {}),\n };\n }\n\n return config;\n}\n\nexport function useDebouncedRecord<T>(value: T, delayMs: number) {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(timeoutId);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nfunction positiveInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction nonNegativeInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nexport function lookupOptionsToFieldOptions(filter: OperationLookupFilter) {\n const merged = new Map<string, { label?: string; title?: string }>();\n\n for (const [value, node] of Object.entries(filter.options ?? {})) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n\n for (const [value, node] of Object.entries(filter.selected ?? {})) {\n if (!merged.has(value)) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n }\n\n return Array.from(merged.entries()).map(([value, meta]) => ({\n value,\n label: meta.label ?? value,\n title: meta.title ?? value,\n }));\n}\n\nfunction workloadsFromLookup(\n filter: OperationLookupFilter,\n kinds: WorkloadKind[],\n): Partial<Record<WorkloadKind, WorkloadResource[]>> {\n const requested = new Set(kinds);\n const result: Partial<Record<WorkloadKind, WorkloadResource[]>> = {};\n for (const kind of kinds) result[kind] = [];\n for (const option of lookupOptionsToFieldOptions(filter)) {\n const parts = option.value.split(\"/\");\n const name = parts.at(-1);\n const providerKind = parts.at(-2)?.toLowerCase() as\n | WorkloadKind\n | undefined;\n const namespace =\n parts.length > 2 ? parts.slice(0, -2).join(\"/\") : undefined;\n if (!name || !providerKind || !requested.has(providerKind)) continue;\n result[providerKind]?.push({ name, ...(namespace ? { namespace } : {}) });\n }\n return result;\n}\n\nfunction labelOptionGroups(\n options: ReturnType<typeof lookupOptionsToFieldOptions>,\n) {\n const grouped = new Map<string, typeof options>();\n for (const option of options) {\n const separator = option.value.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = option.value.slice(0, separator);\n const value = option.value.slice(separator + 1);\n const values = grouped.get(key) ?? [];\n values.push({ ...option, label: value || option.label });\n grouped.set(key, values);\n }\n return Array.from(grouped, ([groupKey, groupOptions]) => ({\n groupKey,\n label: groupKey,\n options: groupOptions,\n }));\n}\n\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(\n node: PlainTextClickyNode | null | undefined,\n): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? [])\n .map((child) => clickyNodeToPlainText(child))\n .join(\"\");\n}\n"],"names":["isPositionalParam","filterShapesByName","_a","_b","parameterPlaceholder","parseMultiFilterValue","serializeMultiFilterValue","parseBoundsValue","serializeBoundsValue","splitCommaValues","useState","useEffect"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { Dispatch, SetStateAction } from 'react';
|
|
|
2
2
|
import { FilterBarFilter, FilterBarRangeProps, FilterBarSearchProps } from '../components/FilterBar';
|
|
3
3
|
import { DataTablePagination } from '../data/DataTable';
|
|
4
4
|
import { SortState } from '../hooks/use-sort';
|
|
5
|
-
import { ClickyFilterShape, ExecutionResponse, OpenAPIParameter, OperationLookupFilter, OperationLookupResponse } from './types';
|
|
5
|
+
import { ClickyFilterShape, ExecutionResponse, OpenAPIParameter, OperationLookupFilter, OperationLookupResponse, OperationRequestValues } from './types';
|
|
6
6
|
export type ParameterValues = Record<string, string>;
|
|
7
7
|
export type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;
|
|
8
8
|
export type ParameterPagination = {
|
|
@@ -57,8 +57,8 @@ export declare function pruneParameterValues(values: ParameterValues): {
|
|
|
57
57
|
* have rejects the whole request rather than the one value, so a leftover
|
|
58
58
|
* `filter.*` from another profile turns a working table into an error.
|
|
59
59
|
*/
|
|
60
|
-
export declare function packParameterValues(values: ParameterValues, parameters: OpenAPIParameter[]):
|
|
61
|
-
export declare function packLookupParameterValues(values: ParameterValues, parameters: OpenAPIParameter[]):
|
|
60
|
+
export declare function packParameterValues(values: ParameterValues, parameters: OpenAPIParameter[]): OperationRequestValues;
|
|
61
|
+
export declare function packLookupParameterValues(values: ParameterValues, parameters: OpenAPIParameter[]): OperationRequestValues;
|
|
62
62
|
export declare function parametersToFormConfig(parameters: OpenAPIParameter[], values: ParameterValues, setValues: ParameterValuesSetter, options?: ParameterFormOptions): ParameterFormConfig;
|
|
63
63
|
export declare function useDebouncedRecord<T>(value: T, delayMs: number): T;
|
|
64
64
|
export declare function lookupOptionsToFieldOptions(filter: OperationLookupFilter): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formMetadata.d.ts","sourceRoot":"","sources":["../../src/rpc/formMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AASnD,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"formMetadata.d.ts","sourceRoot":"","sources":["../../src/rpc/formMetadata.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc/formMetadata.js
CHANGED
|
@@ -105,23 +105,19 @@ function pruneParameterValues(values) {
|
|
|
105
105
|
);
|
|
106
106
|
}
|
|
107
107
|
function packParameterValues(values, parameters) {
|
|
108
|
-
const positionalNames = new Set(
|
|
109
|
-
parameters.filter((param) => param.in !== "path" && isPositionalParam(param)).map((p) => p.name)
|
|
110
|
-
);
|
|
111
|
-
const declaredNames = new Set(parameters.map((param) => param.name));
|
|
112
108
|
const params = {};
|
|
113
109
|
const args = [];
|
|
114
|
-
for (const
|
|
110
|
+
for (const parameter of parameters) {
|
|
111
|
+
const value = values[parameter.name];
|
|
115
112
|
if (!value) continue;
|
|
116
|
-
if (
|
|
117
|
-
if (positionalNames.has(key)) {
|
|
113
|
+
if (parameter.in !== "path" && isPositionalParam(parameter)) {
|
|
118
114
|
args.push(value);
|
|
119
115
|
} else {
|
|
120
|
-
params[
|
|
116
|
+
params[parameter.name] = value;
|
|
121
117
|
}
|
|
122
118
|
}
|
|
123
119
|
if (args.length > 0) {
|
|
124
|
-
params.args = args
|
|
120
|
+
params.args = args;
|
|
125
121
|
}
|
|
126
122
|
return params;
|
|
127
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formMetadata.js","sources":["../../src/rpc/formMetadata.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type {\n WorkloadKind,\n WorkloadResource,\n} from \"../components/workload-picker-utils\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type { SortState } from \"../hooks/use-sort\";\nimport {\n parseBoundsValue,\n parseMultiFilterValue,\n serializeBoundsValue,\n serializeMultiFilterValue,\n splitCommaValues,\n} from \"../data/data-table-filter-values\";\nimport { filterShapesByName } from \"./filterShapes\";\nimport type {\n ClickyFilterShape,\n ExecutionResponse,\n OpenAPIParameter,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport { isPositionalParam, parameterPlaceholder } from \"./types\";\n\nexport type ParameterValues = Record<string, string>;\nexport type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;\n\n// ParameterPagination plumbs limit/offset query parameters into the\n// DataTable's pagination footer. The UI exposes both as the\n// {pageSize, pageIndex} tuple but here we keep raw string limit/offset\n// values so the executor sees exactly what the operation declared.\nexport type ParameterPagination = {\n limitParam: string; // parameter name on the operation, e.g. \"limit\"\n limitValue: string;\n setLimit: (next: string) => void;\n\n // Offset paging, when the operation declares an offset parameter. Absent for\n // a surface that cannot name a position past its first page — a profile with\n // no total order, say. Such a surface still sizes its page and still reports\n // how many rows it is showing of how many; it just cannot step.\n offsetParam?: string;\n offsetValue?: string;\n setOffset?: (next: string) => void;\n\n // Cursor paging, when the operation declares a cursor parameter. Present\n // alongside limit/offset rather than instead of them: an operation can serve\n // both, and which one a page uses is decided per request.\n cursorParam?: string;\n cursorValue?: string;\n setCursor?: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n sort?: ParameterSort;\n};\n\nexport type ParameterSort = {\n value: SortState | null;\n onChange: (sort: SortState | null) => void;\n};\n// LookupSearch fetches the options of one filter matching `query`, server-side.\n// It is what a truncated option set is reachable through: the head the lookup\n// returned is only the first page of a larger distinct set, and everything past\n// it is found by typing rather than by scrolling.\nexport type LookupSearch = (\n filterKey: string,\n query: string,\n) => Promise<{ value: string; label: string; title?: string }[]>;\n\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\n // Wired only into filters the server marked truncated: one that fully\n // enumerated needs no round trip to search what is already in the browser.\n lookupSearch?: LookupSearch | undefined;\n // The spec's `components[\"x-clicky-filters\"]` map, which every filter\n // parameter names via its `$ref`. It is what a control's identity is read\n // from, so that identity survives a filter change: `lookup` carries the same\n // answer but is refetched per selection, and reading shape from it is what\n // used to collapse every chip into a text box for the length of that fetch.\n components?: Record<string, ClickyFilterShape> | undefined;\n};\n\n// A truncated set has to say so even where nothing can search it: the footer\n// telling the user 350 values are missing is what stops a partial list reading\n// as the whole answer.\nfunction truncationProps(filter: OperationLookupFilter) {\n if (!filter.truncated) return {};\n return {\n truncated: true,\n ...(filter.total !== undefined ? { total: filter.total } : {}),\n };\n}\n\n// Server-side search applies only when the server said it withheld options. A\n// filter whose set arrived whole is searched in the browser, which is both\n// faster and exactly as complete.\nfunction searchProps(\n filter: OperationLookupFilter,\n key: string,\n search: LookupSearch | undefined,\n) {\n if (!filter.truncated) return {};\n return {\n ...truncationProps(filter),\n ...(search ? { onSearch: (query: string) => search(key, query) } : {}),\n };\n}\n\nexport function titleCase(value: string) {\n return value\n .split(/[-_]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport function defaultValueForParameter(\n param: OpenAPIParameter,\n method: string,\n): string {\n if (\n method.toUpperCase() === \"GET\" &&\n param.in === \"query\" &&\n !param.required\n ) {\n return \"\";\n }\n const fallback = param.in === \"path\" ? \"\" : undefined;\n const value = param.schema?.default ?? fallback;\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value) || (value != null && typeof value === \"object\")) {\n return \"\";\n }\n if (value == null) {\n return \"\";\n }\n return String(value);\n}\n\nexport function buildInitialParameterValues(\n parameters: OpenAPIParameter[],\n method: string,\n lockedValues: ParameterValues = {},\n initialValues: ParameterValues = {},\n): ParameterValues {\n const values = Object.fromEntries(\n parameters.map((param) => [\n param.name,\n defaultValueForParameter(param, method),\n ]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\n\n// OFFSET_DEPTH_LIMIT is where offset paging stops being available and a cursor\n// takes over. It exists because backends refuse a deep offset outright —\n// OpenSearch's default result window is 10,000 — so this is the one place that\n// decides the changeover rather than each surface discovering the refusal for\n// itself. Below it, page-number jumps stay available; past it there is nothing\n// to jump with, because a cursor names a position rather than a page.\nexport const OFFSET_DEPTH_LIMIT = 10_000;\n\nexport function dataTablePaginationFromForm(\n pagination: ParameterPagination | undefined,\n response: Pick<ExecutionResponse, \"pagination\"> | null | undefined,\n): DataTablePagination | undefined {\n if (!pagination) return undefined;\n\n // The footer describes the rows currently rendered, not the request that is\n // replacing them. During keepPreviousData refetches the form already holds\n // the next offset while the response still holds the retained page.\n const pageSize =\n response?.pagination?.limit ?? positiveInt(pagination.limitValue) ?? 25;\n const offset =\n response?.pagination?.offset ?? nonNegativeInt(pagination.offsetValue) ?? 0;\n const page = Math.floor(offset / pageSize);\n const served = response?.pagination;\n const setCursor = pagination.setCursor;\n const setOffset = pagination.setOffset;\n\n return {\n page,\n pageSize,\n ...(served?.total !== undefined ? { total: served.total } : {}),\n ...(served?.totalRelation !== undefined\n ? { totalRelation: served.totalRelation }\n : {}),\n ...(served?.hasMore !== undefined ? { hasMore: served.hasMore } : {}),\n // Cursor mode needs both halves: a parameter to send the cursor on, and a\n // cursor to send. An operation that declares one without the server minting\n // the other pages by offset, which is correct and merely slower.\n //\n // Which mode applies is depth, not preference: a walk already under way\n // continues, and a shallow page keeps its jump controls until the next one\n // would cross OFFSET_DEPTH_LIMIT — the point past which the offset would be\n // refused anyway.\n ...(setCursor &&\n (pagination.cursorValue ||\n (served?.nextCursor &&\n (!setOffset || offset + pageSize >= OFFSET_DEPTH_LIMIT)))\n ? {\n cursor: {\n ...(pagination.cursorValue\n ? { current: pagination.cursorValue }\n : {}),\n ...(served?.nextCursor ? { next: served.nextCursor } : {}),\n onCursorChange: (next: string | undefined) => {\n // Offset and cursor are two disagreeing positions in one request,\n // so taking the cursor means dropping the offset.\n setOffset?.(\"0\");\n setCursor(next ?? \"\");\n },\n },\n }\n : {}),\n // Offered only when there is somewhere to step to. A surface with no offset\n // parameter still counts and still resizes, but naming page two would be\n // naming a page the server will refuse.\n ...(setOffset\n ? {\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n setCursor?.(\"\");\n setOffset(String(Math.max(next, 0) * pageSize));\n },\n }\n : {}),\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n // A cursor names a position in a page of the old size, so resizing the\n // page invalidates it and the walk restarts.\n setCursor?.(\"\");\n setOffset?.(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(\n Object.entries(values).filter(([, value]) => value !== \"\"),\n );\n}\n\n/**\n * Packs form/filter state into the request the operation actually describes.\n *\n * Values a parameter list does not name are dropped rather than forwarded.\n * Filter state outlives a single surface — the explorer seeds it from the URL\n * and carries it across routes — and a server asked for a filter it does not\n * have rejects the whole request rather than the one value, so a leftover\n * `filter.*` from another profile turns a working table into an error.\n */\nexport function packParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): ParameterValues {\n const positionalNames = new Set(\n parameters\n .filter((param) => param.in !== \"path\" && isPositionalParam(param))\n .map((p) => p.name),\n );\n const declaredNames = new Set(parameters.map((param) => param.name));\n const params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) continue;\n if (!declaredNames.has(key)) continue;\n if (positionalNames.has(key)) {\n args.push(value);\n } else {\n params[key] = value;\n }\n }\n\n if (args.length > 0) {\n params.args = args.join(\",\");\n }\n\n return params;\n}\n\nexport function packLookupParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): ParameterValues {\n return packParameterValues(\n values,\n parameters.filter(\n (parameter) =>\n parameter[\"x-clicky\"]?.role !== \"limit\" &&\n parameter[\"x-clicky\"]?.role !== \"offset\" &&\n parameter[\"x-clicky\"]?.role !== \"cursor\" &&\n parameter[\"x-clicky\"]?.role !== \"sort\" &&\n parameter[\"x-clicky\"]?.role !== \"order\",\n ),\n );\n}\n\nexport function parametersToFormConfig(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n setValues: ParameterValuesSetter,\n options: ParameterFormOptions = {},\n): ParameterFormConfig {\n const emitFilters: FilterBarFilter[] = [];\n const lookupFilters = options.lookup?.filters ?? {};\n // Shape comes from the spec, values from the lookup. The lookup answers both\n // questions, but only the values half of its answer can change, so a control\n // that reads its identity from the spec keeps that identity while the values\n // half is being refetched.\n const shapes = filterShapesByName(parameters, options.components);\n const includeLocations = new Set(\n options.includeLocations ?? [\"path\", \"query\", \"header\"],\n );\n const lockedValues = options.lockedValues ?? {};\n const hideLocked = options.hideLocked ?? false;\n\n // Pull limit/offset out of the filter loop entirely — they drive pagination,\n // not filter pills. Roles come from server-side `paramRole` (see\n // clicky/rpc/openapi.go); the older \"named limit on a GET\" heuristic is\n // intentionally not duplicated here so the server stays the single source\n // of truth for parameter classification.\n const limitParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"limit\");\n const offsetParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"offset\");\n // A cursor is an opaque server-minted token, so it is never a filter chip a\n // user could type into — it is only ever echoed back from a previous page.\n const cursorParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"cursor\");\n const sortParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"sort\");\n const orderParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"order\");\n if ((sortParam == null) !== (orderParam == null)) {\n throw new Error(\"Server sorting requires both sort and order parameters\");\n }\n const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.name);\n if (cursorParam) paginationOmitNames.add(cursorParam.name);\n if (sortParam) paginationOmitNames.add(sortParam.name);\n if (orderParam) paginationOmitNames.add(orderParam.name);\n\n // The search-role param drives the FilterBar's dedicated search input rather\n // than a filter chip; pull it out of the chip loop the same way pagination is.\n const searchParam = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"search\" && includeLocations.has(p.in),\n );\n const omitNames = new Set(paginationOmitNames);\n if (searchParam) omitNames.add(searchParam.name);\n\n // rewind returns the caller to the first page whenever the result set itself\n // changes. Both positions have to go: an offset into the old rows names\n // different rows in the new ones, and a cursor minted under the old filters\n // is rejected by the server outright rather than silently reinterpreted.\n const rewind = (next: ParameterValues): ParameterValues => ({\n ...next,\n ...(offsetParam ? { [offsetParam.name]: \"0\" } : {}),\n ...(cursorParam ? { [cursorParam.name]: \"\" } : {}),\n });\n\n // Time-range first looks for server-stamped roles, then falls back to the\n // existing lookup-driven \"from\"/\"to\" detection so older specs keep working.\n const roleRangeStart = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"time-from\",\n );\n const roleRangeEnd = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"time-to\",\n );\n const edgeType = (param: OpenAPIParameter) =>\n shapes.get(param.name)?.type ?? lookupFilters[param.name]?.type;\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n edgeType(param) === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n edgeType(param) === \"to\",\n );\n const hasTimeRange = rangeStart != null && rangeEnd != null;\n\n for (const param of parameters) {\n if (!includeLocations.has(param.in)) continue;\n if (omitNames.has(param.name)) continue;\n if (\n hasTimeRange &&\n (param.name === rangeStart?.name || param.name === rangeEnd?.name)\n ) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(\n lockedValues,\n param.name,\n );\n if (disabled && hideLocked) continue;\n const value = disabled\n ? (lockedValues[param.name] ?? \"\")\n : (values[param.name] ?? \"\");\n const shape = shapes.get(param.name);\n const label =\n shape?.label ?? lookupFilters[param.name]?.label ?? titleCase(param.name);\n // Only an explicit placeholder is rendered — never synthesize one. The\n // field already carries `label`, so a fallback placeholder is redundant\n // and generic defaults (e.g. \"value-1, value-2\") read as fake data.\n const placeholder = parameterPlaceholder(param);\n const placeholderProp = placeholder !== undefined ? { placeholder } : {};\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue =\n typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => rewind({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n // The spec's answer wins: it is the one that is still there mid-refetch.\n const filterType = shape?.type ?? lookupFilter?.type;\n\n if (filterType === \"workload\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"workload\",\n label,\n value,\n disabled,\n kinds: [\"pod\", \"deployment\", \"statefulset\", \"daemonset\"],\n loadWorkloads: async (kinds) =>\n lookupFilter ? workloadsFromLookup(lookupFilter, kinds) : {},\n // A server-generated workload filter is scoped by the operation itself,\n // so a lookup returning one workload means the scope already picked it.\n collapseSingleOption: true,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"labels\" && param.in === \"query\") {\n const fieldOptions = lookupFilter\n ? lookupOptionsToFieldOptions(lookupFilter)\n : [];\n const selection = parseMultiFilterValue(value);\n const grouped =\n fieldOptions.some((option) => option.value.includes(\"=\")) ||\n Object.keys(selection).some((selected) => selected.includes(\"=\"));\n if (grouped) {\n emitFilters.push({\n key: param.name,\n kind: \"nested-multi\",\n label,\n value: selection,\n disabled,\n groups: labelOptionGroups(fieldOptions),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n } else {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: selection,\n disabled,\n options: fieldOptions,\n ...(lookupFilter\n ? searchProps(lookupFilter, param.name, options.lookupSearch)\n : {}),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n }\n continue;\n }\n\n // Both edges of a range travel under one parameter, so the control is built\n // from that parameter alone rather than from the from/to pair below.\n // A \"day-range\" is the same control with the clock taken off it, so it\n // shares this branch and differs only in timeEnabled.\n if (\n (filterType === \"date-range\" || filterType === \"day-range\") &&\n param.in === \"query\"\n ) {\n // A server that declares a default applies it to a request that names no\n // bound, so the control shows that default rather than \"any time\" — an\n // empty range control over a bounded query states the wrong query. Only\n // the display falls back; the value is still whatever was selected, so\n // nothing is written to the URL on the strength of a default.\n const bounds = parseBoundsValue(\n value || String(param.schema?.default ?? \"\"),\n );\n emitFilters.push({\n key: param.name,\n kind: \"date-range\",\n label,\n disabled,\n ...(bounds.min !== undefined ? { from: bounds.min } : {}),\n ...(bounds.max !== undefined ? { to: bounds.max } : {}),\n ...(lookupFilter?.presets ? { presets: lookupFilter.presets } : {}),\n timeEnabled:\n filterType === \"day-range\" ? false : (lookupFilter?.timeEnabled ?? true),\n ...(lookupFilter?.timeZone ? { timeZone: lookupFilter.timeZone } : {}),\n ...(lookupFilter?.timeZones\n ? { timeZones: lookupFilter.timeZones }\n : {}),\n onApply: (from: string, to: string) => {\n if (disabled) return;\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeBoundsValue({ min: from, max: to }),\n }),\n );\n },\n });\n continue;\n }\n\n // An exact-value selection with nothing to enumerate. It shares the\n // multi-filter grammar, so the raw string is written through unchanged:\n // \"a,b\" is two values and \"!a\" excludes one, exactly as picking them would.\n if (filterType === \"value\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"multi-filter\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: parseMultiFilterValue(value),\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n ...(lookupFilter\n ? searchProps(lookupFilter, param.name, options.lookupSearch)\n : {}),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n continue;\n }\n\n if (schema?.enum) {\n emitFilters.push({\n key: param.name,\n kind: \"enum\",\n label,\n value,\n disabled,\n options: schema.enum.map((item) => ({\n value: String(item),\n label: String(item),\n })),\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"bool\" || schema?.type === \"boolean\") {\n emitFilters.push({\n key: param.name,\n kind: \"boolean\",\n label,\n value: value === \"true\",\n disabled,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if ((shape != null || lookupFilter != null) && param.in === \"query\") {\n if (shape?.multi ?? lookupFilter?.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n // Reported, not searched: this control's onSearch hands the query back\n // to the consumer to refetch and re-feed `options`, which is a\n // different contract from the one searchProps satisfies.\n ...(lookupFilter ? truncationProps(lookupFilter) : {}),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) =>\n rewind({ ...current, [param.name]: next.join(\",\") }),\n ),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n ...placeholderProp,\n inputType:\n filterType === \"number\"\n ? \"number\"\n : filterType === \"date\"\n ? \"date\"\n : \"text\",\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (sortParam && orderParam) {\n const key = values[sortParam.name] ?? \"\";\n const direction = values[orderParam.name] || \"asc\";\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new Error(`Unsupported server sort direction ${direction}`);\n }\n config.sort = {\n value: key ? { key, dir: direction } : null,\n onChange: (next) =>\n setValues((current) => {\n const updated = { ...current };\n if (next) {\n updated[sortParam.name] = next.key;\n updated[orderParam.name] = next.dir;\n } else {\n delete updated[sortParam.name];\n delete updated[orderParam.name];\n }\n return rewind(updated);\n }),\n };\n }\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(\n lockedValues,\n searchParam.name,\n );\n const searchValue = searchDisabled\n ? (lockedValues[searchParam.name] ?? \"\")\n : (values[searchParam.name] ?? \"\");\n const searchPlaceholder = parameterPlaceholder(searchParam);\n config.search = {\n value: searchValue,\n onChange: (next) => {\n if (searchDisabled) return;\n setValues((current) =>\n rewind({ ...current, [searchParam.name]: next }),\n );\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel:\n lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n // Gated on the limit alone. An operation that caps its rows can report how\n // many of how many it is showing and can resize the cap, both of which are\n // independent of being able to step to a second page — and gating the whole\n // footer on the offset is what made a surface without one report \"100 of 100\"\n // while the server was answering with a total of 12,558.\n if (limitParam) {\n config.pagination = {\n limitParam: limitParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n setLimit: (next) =>\n setValues((current) => ({ ...current, [limitParam.name]: next })),\n ...(offsetParam\n ? {\n offsetParam: offsetParam.name,\n offsetValue: values[offsetParam.name] ?? \"\",\n setOffset: (next: string) =>\n setValues((current) => ({\n ...current,\n [offsetParam.name]: next,\n })),\n }\n : {}),\n ...(cursorParam\n ? {\n cursorParam: cursorParam.name,\n cursorValue: values[cursorParam.name] ?? \"\",\n setCursor: (next: string) =>\n setValues((current) => ({\n ...current,\n [cursorParam.name]: next,\n })),\n }\n : {}),\n };\n }\n if (hasTimeRange && rangeStart != null && rangeEnd != null) {\n const rangeStartMeta = lookupFilters[rangeStart.name];\n const rangeEndMeta = lookupFilters[rangeEnd.name];\n const rangeMeta = rangeStartMeta ?? rangeEndMeta;\n const explicitTimeEnabled =\n rangeStartMeta?.timeEnabled ?? rangeEndMeta?.timeEnabled;\n config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) =>\n rewind({ ...current, [rangeStart.name]: from, [rangeEnd.name]: to }),\n ),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n timeEnabled:\n explicitTimeEnabled ??\n (rangeStart.schema?.format === \"date-time\" ||\n rangeEnd.schema?.format === \"date-time\"),\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description\n ? { fromPlaceholder: rangeStart.description }\n : {}),\n ...(rangeEnd.description ? { toPlaceholder: rangeEnd.description } : {}),\n };\n }\n\n return config;\n}\n\nexport function useDebouncedRecord<T>(value: T, delayMs: number) {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(timeoutId);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nfunction positiveInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction nonNegativeInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nexport function lookupOptionsToFieldOptions(filter: OperationLookupFilter) {\n const merged = new Map<string, { label?: string; title?: string }>();\n\n for (const [value, node] of Object.entries(filter.options ?? {})) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n\n for (const [value, node] of Object.entries(filter.selected ?? {})) {\n if (!merged.has(value)) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n }\n\n return Array.from(merged.entries()).map(([value, meta]) => ({\n value,\n label: meta.label ?? value,\n title: meta.title ?? value,\n }));\n}\n\nfunction workloadsFromLookup(\n filter: OperationLookupFilter,\n kinds: WorkloadKind[],\n): Partial<Record<WorkloadKind, WorkloadResource[]>> {\n const requested = new Set(kinds);\n const result: Partial<Record<WorkloadKind, WorkloadResource[]>> = {};\n for (const kind of kinds) result[kind] = [];\n for (const option of lookupOptionsToFieldOptions(filter)) {\n const parts = option.value.split(\"/\");\n const name = parts.at(-1);\n const providerKind = parts.at(-2)?.toLowerCase() as\n | WorkloadKind\n | undefined;\n const namespace =\n parts.length > 2 ? parts.slice(0, -2).join(\"/\") : undefined;\n if (!name || !providerKind || !requested.has(providerKind)) continue;\n result[providerKind]?.push({ name, ...(namespace ? { namespace } : {}) });\n }\n return result;\n}\n\nfunction labelOptionGroups(\n options: ReturnType<typeof lookupOptionsToFieldOptions>,\n) {\n const grouped = new Map<string, typeof options>();\n for (const option of options) {\n const separator = option.value.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = option.value.slice(0, separator);\n const value = option.value.slice(separator + 1);\n const values = grouped.get(key) ?? [];\n values.push({ ...option, label: value || option.label });\n grouped.set(key, values);\n }\n return Array.from(grouped, ([groupKey, groupOptions]) => ({\n groupKey,\n label: groupKey,\n options: groupOptions,\n }));\n}\n\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(\n node: PlainTextClickyNode | null | undefined,\n): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? [])\n .map((child) => clickyNodeToPlainText(child))\n .join(\"\");\n}\n"],"names":["_a","_b"],"mappings":";;;;AAiGA,SAAS,gBAAgB,QAA+B;AACtD,MAAI,CAAC,OAAO,UAAW,QAAO,CAAA;AAC9B,SAAO;AAAA,IACL,WAAW;AAAA,IACX,GAAI,OAAO,UAAU,SAAY,EAAE,OAAO,OAAO,UAAU,CAAA;AAAA,EAAC;AAEhE;AAKA,SAAS,YACP,QACA,KACA,QACA;AACA,MAAI,CAAC,OAAO,UAAW,QAAO,CAAA;AAC9B,SAAO;AAAA,IACL,GAAG,gBAAgB,MAAM;AAAA,IACzB,GAAI,SAAS,EAAE,UAAU,CAAC,UAAkB,OAAO,KAAK,KAAK,MAAM,CAAA;AAAA,EAAC;AAExE;AAEO,SAAS,UAAU,OAAe;AACvC,SAAO,MACJ,MAAM,MAAM,EACZ,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;AAEO,SAAS,yBACd,OACA,QACQ;;AACR,MACE,OAAO,kBAAkB,SACzB,MAAM,OAAO,WACb,CAAC,MAAM,UACP;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,OAAO,SAAS,KAAK;AAC5C,QAAM,UAAQ,WAAM,WAAN,mBAAc,YAAW;AACvC,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,QAAQ,SAAS;AAAA,EAC1B;AACA,MAAI,MAAM,QAAQ,KAAK,KAAM,SAAS,QAAQ,OAAO,UAAU,UAAW;AACxE,WAAO;AAAA,EACT;AACA,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,4BACd,YACA,QACA,eAAgC,CAAA,GAChC,gBAAiC,IAChB;AACjB,QAAM,SAAS,OAAO;AAAA,IACpB,WAAW,IAAI,CAAC,UAAU;AAAA,MACxB,MAAM;AAAA,MACN,yBAAyB,OAAO,MAAM;AAAA,IAAA,CACvC;AAAA,EAAA;AAEH,SAAO,EAAE,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAA;AAC3C;AAQO,MAAM,qBAAqB;AAE3B,SAAS,4BACd,YACA,UACiC;;AACjC,MAAI,CAAC,WAAY,QAAO;AAKxB,QAAM,aACJ,0CAAU,eAAV,mBAAsB,UAAS,YAAY,WAAW,UAAU,KAAK;AACvE,QAAM,WACJ,0CAAU,eAAV,mBAAsB,WAAU,eAAe,WAAW,WAAW,KAAK;AAC5E,QAAM,OAAO,KAAK,MAAM,SAAS,QAAQ;AACzC,QAAM,SAAS,qCAAU;AACzB,QAAM,YAAY,WAAW;AAC7B,QAAM,YAAY,WAAW;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,iCAAQ,WAAU,SAAY,EAAE,OAAO,OAAO,MAAA,IAAU,CAAA;AAAA,IAC5D,IAAI,iCAAQ,mBAAkB,SAC1B,EAAE,eAAe,OAAO,cAAA,IACxB,CAAA;AAAA,IACJ,IAAI,iCAAQ,aAAY,SAAY,EAAE,SAAS,OAAO,QAAA,IAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASlE,GAAI,cACH,WAAW,gBACT,iCAAQ,gBACN,CAAC,aAAa,SAAS,YAAY,uBACpC;AAAA,MACE,QAAQ;AAAA,QACN,GAAI,WAAW,cACX,EAAE,SAAS,WAAW,YAAA,IACtB,CAAA;AAAA,QACJ,IAAI,iCAAQ,cAAa,EAAE,MAAM,OAAO,WAAA,IAAe,CAAA;AAAA,QACvD,gBAAgB,CAAC,SAA6B;AAG5C,iDAAY;AACZ,oBAAU,QAAQ,EAAE;AAAA,QACtB;AAAA,MAAA;AAAA,IACF,IAEF,CAAA;AAAA;AAAA;AAAA;AAAA,IAIJ,GAAI,YACA;AAAA,MACE,cAAc,CAAC,SAAiB;AAC9B,YAAI,YAAY,WAAW,UAAU,KAAK,MAAM;AAC9C,qBAAW,SAAS,OAAO,QAAQ,CAAC;AAAA,QACtC;AACA,+CAAY;AACZ,kBAAU,OAAO,KAAK,IAAI,MAAM,CAAC,IAAI,QAAQ,CAAC;AAAA,MAChD;AAAA,IAAA,IAEF,CAAA;AAAA,IACJ,kBAAkB,CAAC,SAAiB;AAClC,iBAAW,SAAS,OAAO,IAAI,CAAC;AAGhC,6CAAY;AACZ,6CAAY;AAAA,IACd;AAAA,EAAA;AAEJ;AAEO,SAAS,qBAAqB,QAAyB;AAC5D,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,MAAM,UAAU,EAAE;AAAA,EAAA;AAE7D;AAWO,SAAS,oBACd,QACA,YACiB;AACjB,QAAM,kBAAkB,IAAI;AAAA,IAC1B,WACG,OAAO,CAAC,UAAU,MAAM,OAAO,UAAU,kBAAkB,KAAK,CAAC,EACjE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAAA;AAEtB,QAAM,gBAAgB,IAAI,IAAI,WAAW,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AACnE,QAAM,SAA0B,CAAA;AAChC,QAAM,OAAiB,CAAA;AAEvB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,CAAC,MAAO;AACZ,QAAI,CAAC,cAAc,IAAI,GAAG,EAAG;AAC7B,QAAI,gBAAgB,IAAI,GAAG,GAAG;AAC5B,WAAK,KAAK,KAAK;AAAA,IACjB,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO,OAAO,KAAK,KAAK,GAAG;AAAA,EAC7B;AAEA,SAAO;AACT;AAEO,SAAS,0BACd,QACA,YACiB;AACjB,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,MACT,CAAC,cAAA;;AACC,gCAAU,UAAU,MAApB,mBAAuB,UAAS,aAChC,eAAU,UAAU,MAApB,mBAAuB,UAAS,cAChC,eAAU,UAAU,MAApB,mBAAuB,UAAS,cAChC,eAAU,UAAU,MAApB,mBAAuB,UAAS,YAChC,eAAU,UAAU,MAApB,mBAAuB,UAAS;AAAA;AAAA,IAAA;AAAA,EACpC;AAEJ;AAEO,SAAS,uBACd,YACA,QACA,WACA,UAAgC,CAAA,GACX;;AACrB,QAAM,cAAiC,CAAA;AACvC,QAAM,kBAAgB,aAAQ,WAAR,mBAAgB,YAAW,CAAA;AAKjD,QAAM,SAAS,mBAAmB,YAAY,QAAQ,UAAU;AAChE,QAAM,mBAAmB,IAAI;AAAA,IAC3B,QAAQ,oBAAoB,CAAC,QAAQ,SAAS,QAAQ;AAAA,EAAA;AAExD,QAAM,eAAe,QAAQ,gBAAgB,CAAA;AAC7C,QAAM,aAAa,QAAQ,cAAc;AAOzC,QAAM,aAAa,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAO;AACzE,QAAM,cAAc,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAQ;AAG3E,QAAM,cAAc,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAQ;AAC3E,QAAM,YAAY,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAM;AACvE,QAAM,aAAa,WAAW,KAAK,CAAC;;AAAM,aAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA,GAAO;AACzE,MAAK,aAAa,UAAW,cAAc,OAAO;AAChD,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,QAAM,0CAA0B,IAAA;AAChC,MAAI,WAAY,qBAAoB,IAAI,WAAW,IAAI;AACvD,MAAI,YAAa,qBAAoB,IAAI,YAAY,IAAI;AACzD,MAAI,YAAa,qBAAoB,IAAI,YAAY,IAAI;AACzD,MAAI,UAAW,qBAAoB,IAAI,UAAU,IAAI;AACrD,MAAI,WAAY,qBAAoB,IAAI,WAAW,IAAI;AAIvD,QAAM,cAAc,WAAW;AAAA,IAC7B,CAAC,MAAA;;AAAM,eAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS,YAAY,iBAAiB,IAAI,EAAE,EAAE;AAAA;AAAA,EAAA;AAEtE,QAAM,YAAY,IAAI,IAAI,mBAAmB;AAC7C,MAAI,YAAa,WAAU,IAAI,YAAY,IAAI;AAM/C,QAAM,SAAS,CAAC,UAA4C;AAAA,IAC1D,GAAG;AAAA,IACH,GAAI,cAAc,EAAE,CAAC,YAAY,IAAI,GAAG,IAAA,IAAQ,CAAA;AAAA,IAChD,GAAI,cAAc,EAAE,CAAC,YAAY,IAAI,GAAG,GAAA,IAAO,CAAA;AAAA,EAAC;AAKlD,QAAM,iBAAiB,WAAW;AAAA,IAChC,CAAC,MAAA;;AAAM,eAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA;AAAA,EAAA;AAEjC,QAAM,eAAe,WAAW;AAAA,IAC9B,CAAC,MAAA;;AAAM,eAAAA,MAAA,EAAE,UAAU,MAAZ,gBAAAA,IAAe,UAAS;AAAA;AAAA,EAAA;AAEjC,QAAM,WAAW,CAAC;;AAChB,aAAAA,MAAA,OAAO,IAAI,MAAM,IAAI,MAArB,gBAAAA,IAAwB,WAAQC,MAAA,cAAc,MAAM,IAAI,MAAxB,gBAAAA,IAA2B;AAAA;AAC7D,QAAM,aACJ,kBACA,WAAW;AAAA,IACT,CAAC,UACC,iBAAiB,IAAI,MAAM,EAAE,KAC7B,MAAM,OAAO,WACb,SAAS,KAAK,MAAM;AAAA,EAAA;AAE1B,QAAM,WACJ,gBACA,WAAW;AAAA,IACT,CAAC,UACC,iBAAiB,IAAI,MAAM,EAAE,KAC7B,MAAM,OAAO,WACb,SAAS,KAAK,MAAM;AAAA,EAAA;AAE1B,QAAM,eAAe,cAAc,QAAQ,YAAY;AAEvD,aAAW,SAAS,YAAY;AAC9B,QAAI,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAG;AACrC,QAAI,UAAU,IAAI,MAAM,IAAI,EAAG;AAC/B,QACE,iBACC,MAAM,UAAS,yCAAY,SAAQ,MAAM,UAAS,qCAAU,QAC7D;AACA;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,UAAU,eAAe;AAAA,MAC/C;AAAA,MACA,MAAM;AAAA,IAAA;AAER,QAAI,YAAY,WAAY;AAC5B,UAAM,QAAQ,WACT,aAAa,MAAM,IAAI,KAAK,KAC5B,OAAO,MAAM,IAAI,KAAK;AAC3B,UAAM,QAAQ,OAAO,IAAI,MAAM,IAAI;AACnC,UAAM,SACJ,+BAAO,YAAS,mBAAc,MAAM,IAAI,MAAxB,mBAA2B,UAAS,UAAU,MAAM,IAAI;AAI1E,UAAM,cAAc,qBAAqB,KAAK;AAC9C,UAAM,kBAAkB,gBAAgB,SAAY,EAAE,YAAA,IAAgB,CAAA;AACtE,UAAM,WAAW,CAAC,SAA2B;AAC3C,UAAI,SAAU;AACd,YAAM,cACJ,OAAO,SAAS,YAAa,OAAO,SAAS,UAAW;AAC1D,gBAAU,CAAC,YAAY,OAAO,EAAE,GAAG,SAAS,CAAC,MAAM,IAAI,GAAG,YAAA,CAAa,CAAC;AAAA,IAC1E;AAEA,UAAM,SAAS,MAAM;AACrB,UAAM,eAAe,cAAc,MAAM,IAAI;AAE7C,UAAM,cAAa,+BAAO,UAAQ,6CAAc;AAEhD,QAAI,eAAe,cAAc,MAAM,OAAO,SAAS;AACrD,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,CAAC,OAAO,cAAc,eAAe,WAAW;AAAA,QACvD,eAAe,OAAO,UACpB,eAAe,oBAAoB,cAAc,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA,QAG5D,sBAAsB;AAAA,QACtB,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,QAAI,eAAe,YAAY,MAAM,OAAO,SAAS;AACnD,YAAM,eAAe,eACjB,4BAA4B,YAAY,IACxC,CAAA;AACJ,YAAM,YAAY,sBAAsB,KAAK;AAC7C,YAAM,UACJ,aAAa,KAAK,CAAC,WAAW,OAAO,MAAM,SAAS,GAAG,CAAC,KACxD,OAAO,KAAK,SAAS,EAAE,KAAK,CAAC,aAAa,SAAS,SAAS,GAAG,CAAC;AAClE,UAAI,SAAS;AACX,oBAAY,KAAK;AAAA,UACf,KAAK,MAAM;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,QAAQ,kBAAkB,YAAY;AAAA,UACtC,UAAU,CAAC,SACT;AAAA,YAAU,CAAC,YACT,OAAO;AAAA,cACL,GAAG;AAAA,cACH,CAAC,MAAM,IAAI,GAAG,0BAA0B,IAAI;AAAA,YAAA,CAC7C;AAAA,UAAA;AAAA,QACH,CACH;AAAA,MACH,OAAO;AACL,oBAAY,KAAK;AAAA,UACf,KAAK,MAAM;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,SAAS;AAAA,UACT,GAAI,eACA,YAAY,cAAc,MAAM,MAAM,QAAQ,YAAY,IAC1D,CAAA;AAAA,UACJ,UAAU,CAAC,SACT;AAAA,YAAU,CAAC,YACT,OAAO;AAAA,cACL,GAAG;AAAA,cACH,CAAC,MAAM,IAAI,GAAG,0BAA0B,IAAI;AAAA,YAAA,CAC7C;AAAA,UAAA;AAAA,QACH,CACH;AAAA,MACH;AACA;AAAA,IACF;AAMA,SACG,eAAe,gBAAgB,eAAe,gBAC/C,MAAM,OAAO,SACb;AAMA,YAAM,SAAS;AAAA,QACb,SAAS,SAAO,WAAM,WAAN,mBAAc,YAAW,EAAE;AAAA,MAAA;AAE7C,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,GAAI,OAAO,QAAQ,SAAY,EAAE,MAAM,OAAO,IAAA,IAAQ,CAAA;AAAA,QACtD,GAAI,OAAO,QAAQ,SAAY,EAAE,IAAI,OAAO,IAAA,IAAQ,CAAA;AAAA,QACpD,IAAI,6CAAc,WAAU,EAAE,SAAS,aAAa,QAAA,IAAY,CAAA;AAAA,QAChE,aACE,eAAe,cAAc,SAAS,6CAAc,gBAAe;AAAA,QACrE,IAAI,6CAAc,YAAW,EAAE,UAAU,aAAa,SAAA,IAAa,CAAA;AAAA,QACnE,IAAI,6CAAc,aACd,EAAE,WAAW,aAAa,UAAA,IAC1B,CAAA;AAAA,QACJ,SAAS,CAAC,MAAc,OAAe;AACrC,cAAI,SAAU;AACd;AAAA,YAAU,CAAC,YACT,OAAO;AAAA,cACL,GAAG;AAAA,cACH,CAAC,MAAM,IAAI,GAAG,qBAAqB,EAAE,KAAK,MAAM,KAAK,GAAA,CAAI;AAAA,YAAA,CAC1D;AAAA,UAAA;AAAA,QAEL;AAAA,MAAA,CACD;AACD;AAAA,IACF;AAKA,QAAI,eAAe,WAAW,MAAM,OAAO,SAAS;AAClD,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,QAAI,eAAe,kBAAkB,MAAM,OAAO,SAAS;AACzD,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,OAAO,sBAAsB,KAAK;AAAA,QAClC;AAAA,QACA,SAAS,eAAe,4BAA4B,YAAY,IAAI,CAAA;AAAA,QACpE,GAAI,eACA,YAAY,cAAc,MAAM,MAAM,QAAQ,YAAY,IAC1D,CAAA;AAAA,QACJ,UAAU,CAAC,SACT;AAAA,UAAU,CAAC,YACT,OAAO;AAAA,YACL,GAAG;AAAA,YACH,CAAC,MAAM,IAAI,GAAG,0BAA0B,IAAI;AAAA,UAAA,CAC7C;AAAA,QAAA;AAAA,MACH,CACH;AACD;AAAA,IACF;AAEA,QAAI,iCAAQ,MAAM;AAChB,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,OAAO,KAAK,IAAI,CAAC,UAAU;AAAA,UAClC,OAAO,OAAO,IAAI;AAAA,UAClB,OAAO,OAAO,IAAI;AAAA,QAAA,EAClB;AAAA,QACF,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,QAAI,eAAe,WAAU,iCAAQ,UAAS,WAAW;AACvD,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,OAAO,UAAU;AAAA,QACjB;AAAA,QACA,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,SAAK,SAAS,QAAQ,gBAAgB,SAAS,MAAM,OAAO,SAAS;AACnE,WAAI,+BAAO,WAAS,6CAAc,QAAO;AACvC,oBAAY,KAAK;AAAA,UACf,KAAK,MAAM;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,OAAO,iBAAiB,KAAK;AAAA,UAC7B;AAAA,UACA,SAAS,eAAe,4BAA4B,YAAY,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,UAIpE,GAAI,eAAe,gBAAgB,YAAY,IAAI,CAAA;AAAA,UACnD,GAAG;AAAA,UACH,UAAU,CAAC,SACT;AAAA,YAAU,CAAC,YACT,OAAO,EAAE,GAAG,SAAS,CAAC,MAAM,IAAI,GAAG,KAAK,KAAK,GAAG,GAAG;AAAA,UAAA;AAAA,QACrD,CACH;AACD;AAAA,MACF;AAEA,kBAAY,KAAK;AAAA,QACf,KAAK,MAAM;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,eAAe,4BAA4B,YAAY,IAAI,CAAA;AAAA,QACpE,GAAG;AAAA,QACH,WACE,eAAe,WACX,WACA,eAAe,SACb,SACA;AAAA,QACR,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,MAAA,CAClC;AACD;AAAA,IACF;AAEA,gBAAY,KAAK;AAAA,MACf,KAAK,MAAM;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH,UAAU,CAAC,SAAS,SAAS,IAAI;AAAA,IAAA,CAClC;AAAA,EACH;AAEA,QAAM,SAA8B,EAAE,SAAS,YAAA;AAC/C,MAAI,aAAa,YAAY;AAC3B,UAAM,MAAM,OAAO,UAAU,IAAI,KAAK;AACtC,UAAM,YAAY,OAAO,WAAW,IAAI,KAAK;AAC7C,QAAI,cAAc,SAAS,cAAc,QAAQ;AAC/C,YAAM,IAAI,MAAM,qCAAqC,SAAS,EAAE;AAAA,IAClE;AACA,WAAO,OAAO;AAAA,MACZ,OAAO,MAAM,EAAE,KAAK,KAAK,cAAc;AAAA,MACvC,UAAU,CAAC,SACT,UAAU,CAAC,YAAY;AACrB,cAAM,UAAU,EAAE,GAAG,QAAA;AACrB,YAAI,MAAM;AACR,kBAAQ,UAAU,IAAI,IAAI,KAAK;AAC/B,kBAAQ,WAAW,IAAI,IAAI,KAAK;AAAA,QAClC,OAAO;AACL,iBAAO,QAAQ,UAAU,IAAI;AAC7B,iBAAO,QAAQ,WAAW,IAAI;AAAA,QAChC;AACA,eAAO,OAAO,OAAO;AAAA,MACvB,CAAC;AAAA,IAAA;AAAA,EAEP;AACA,MAAI,aAAa;AACf,UAAM,iBAAiB,OAAO,UAAU,eAAe;AAAA,MACrD;AAAA,MACA,YAAY;AAAA,IAAA;AAEd,UAAM,cAAc,iBACf,aAAa,YAAY,IAAI,KAAK,KAClC,OAAO,YAAY,IAAI,KAAK;AACjC,UAAM,oBAAoB,qBAAqB,WAAW;AAC1D,WAAO,SAAS;AAAA,MACd,OAAO;AAAA,MACP,UAAU,CAAC,SAAS;AAClB,YAAI,eAAgB;AACpB;AAAA,UAAU,CAAC,YACT,OAAO,EAAE,GAAG,SAAS,CAAC,YAAY,IAAI,GAAG,KAAA,CAAM;AAAA,QAAA;AAAA,MAEnD;AAAA,MACA,GAAI,oBAAoB,EAAE,aAAa,kBAAA,IAAsB,CAAA;AAAA,MAC7D,aACE,mBAAc,YAAY,IAAI,MAA9B,mBAAiC,UAAS,UAAU,YAAY,IAAI;AAAA,IAAA;AAAA,EAE1E;AAMA,MAAI,YAAY;AACd,WAAO,aAAa;AAAA,MAClB,YAAY,WAAW;AAAA,MACvB,YAAY,OAAO,WAAW,IAAI,KAAK;AAAA,MACvC,UAAU,CAAC,SACT,UAAU,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,WAAW,IAAI,GAAG,OAAO;AAAA,MAClE,GAAI,cACA;AAAA,QACE,aAAa,YAAY;AAAA,QACzB,aAAa,OAAO,YAAY,IAAI,KAAK;AAAA,QACzC,WAAW,CAAC,SACV,UAAU,CAAC,aAAa;AAAA,UACtB,GAAG;AAAA,UACH,CAAC,YAAY,IAAI,GAAG;AAAA,QAAA,EACpB;AAAA,MAAA,IAEN,CAAA;AAAA,MACJ,GAAI,cACA;AAAA,QACE,aAAa,YAAY;AAAA,QACzB,aAAa,OAAO,YAAY,IAAI,KAAK;AAAA,QACzC,WAAW,CAAC,SACV,UAAU,CAAC,aAAa;AAAA,UACtB,GAAG;AAAA,UACH,CAAC,YAAY,IAAI,GAAG;AAAA,QAAA,EACpB;AAAA,MAAA,IAEN,CAAA;AAAA,IAAC;AAAA,EAET;AACA,MAAI,gBAAgB,cAAc,QAAQ,YAAY,MAAM;AAC1D,UAAM,iBAAiB,cAAc,WAAW,IAAI;AACpD,UAAM,eAAe,cAAc,SAAS,IAAI;AAChD,UAAM,YAAY,kBAAkB;AACpC,UAAM,uBACJ,iDAAgB,iBAAe,6CAAc;AAC/C,WAAO,YAAY;AAAA,MACjB,MAAM,OAAO,WAAW,IAAI,KAAK;AAAA,MACjC,IAAI,OAAO,SAAS,IAAI,KAAK;AAAA,MAC7B,SAAS,CAAC,MAAM,OACd;AAAA,QAAU,CAAC,YACT,OAAO,EAAE,GAAG,SAAS,CAAC,WAAW,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,IAAI;AAAA,MAAA;AAAA,MAEvE,IAAI,uCAAW,WAAU,EAAE,SAAS,UAAU,QAAA,IAAY,CAAA;AAAA,MAC1D,aACE,0BACC,gBAAW,WAAX,mBAAmB,YAAW,iBAC7B,cAAS,WAAT,mBAAiB,YAAW;AAAA,MAChC,IAAI,uCAAW,YAAW,EAAE,UAAU,UAAU,SAAA,IAAa,CAAA;AAAA,MAC7D,IAAI,uCAAW,aAAY,EAAE,WAAW,UAAU,UAAA,IAAc,CAAA;AAAA,MAChE,GAAI,WAAW,cACX,EAAE,iBAAiB,WAAW,YAAA,IAC9B,CAAA;AAAA,MACJ,GAAI,SAAS,cAAc,EAAE,eAAe,SAAS,YAAA,IAAgB,CAAA;AAAA,IAAC;AAAA,EAE1E;AAEA,SAAO;AACT;AAEO,SAAS,mBAAsB,OAAU,SAAiB;AAC/D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,YAAU,MAAM;AACd,UAAM,YAAY,OAAO,WAAW,MAAM,aAAa,KAAK,GAAG,OAAO;AACtE,WAAO,MAAM,OAAO,aAAa,SAAS;AAAA,EAC5C,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,SAAO;AACT;AAEA,SAAS,YAAY,OAA+C;AAClE,QAAM,SAAS,SAAS,SAAS,IAAI,EAAE;AACvC,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAC1D;AAEA,SAAS,eAAe,OAA+C;AACrE,QAAM,SAAS,SAAS,SAAS,IAAI,EAAE;AACvC,SAAO,OAAO,SAAS,MAAM,KAAK,UAAU,IAAI,SAAS;AAC3D;AAEO,SAAS,4BAA4B,QAA+B;AACzE,QAAM,6BAAa,IAAA;AAEnB,aAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,OAAO,WAAW,CAAA,CAAE,GAAG;AAChE,WAAO,IAAI,OAAO;AAAA,MAChB,OAAO,sBAAsB,IAAI,KAAK;AAAA,MACtC,OAAO,sBAAsB,IAAI,KAAK;AAAA,IAAA,CACvC;AAAA,EACH;AAEA,aAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,OAAO,YAAY,CAAA,CAAE,GAAG;AACjE,QAAI,CAAC,OAAO,IAAI,KAAK,GAAG;AACtB,aAAO,IAAI,OAAO;AAAA,QAChB,OAAO,sBAAsB,IAAI,KAAK;AAAA,QACtC,OAAO,sBAAsB,IAAI,KAAK;AAAA,MAAA,CACvC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,OAAO,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO;AAAA,IAC1D;AAAA,IACA,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO,KAAK,SAAS;AAAA,EAAA,EACrB;AACJ;AAEA,SAAS,oBACP,QACA,OACmD;;AACnD,QAAM,YAAY,IAAI,IAAI,KAAK;AAC/B,QAAM,SAA4D,CAAA;AAClE,aAAW,QAAQ,MAAO,QAAO,IAAI,IAAI,CAAA;AACzC,aAAW,UAAU,4BAA4B,MAAM,GAAG;AACxD,UAAM,QAAQ,OAAO,MAAM,MAAM,GAAG;AACpC,UAAM,OAAO,MAAM,GAAG,EAAE;AACxB,UAAM,gBAAe,WAAM,GAAG,EAAE,MAAX,mBAAc;AAGnC,UAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI;AACpD,QAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,IAAI,YAAY,EAAG;AAC5D,iBAAO,YAAY,MAAnB,mBAAsB,KAAK,EAAE,MAAM,GAAI,YAAY,EAAE,cAAc,CAAA;EACrE;AACA,SAAO;AACT;AAEA,SAAS,kBACP,SACA;AACA,QAAM,8BAAc,IAAA;AACpB,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAY,OAAO,MAAM,QAAQ,GAAG;AAC1C,QAAI,aAAa,EAAG;AACpB,UAAM,MAAM,OAAO,MAAM,MAAM,GAAG,SAAS;AAC3C,UAAM,QAAQ,OAAO,MAAM,MAAM,YAAY,CAAC;AAC9C,UAAM,SAAS,QAAQ,IAAI,GAAG,KAAK,CAAA;AACnC,WAAO,KAAK,EAAE,GAAG,QAAQ,OAAO,SAAS,OAAO,OAAO;AACvD,YAAQ,IAAI,KAAK,MAAM;AAAA,EACzB;AACA,SAAO,MAAM,KAAK,SAAS,CAAC,CAAC,UAAU,YAAY,OAAO;AAAA,IACxD;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,EACT;AACJ;AASA,SAAS,sBACP,MACQ;AACR,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,UAAQ,KAAK,YAAY,CAAA,GACtB,IAAI,CAAC,UAAU,sBAAsB,KAAK,CAAC,EAC3C,KAAK,EAAE;AACZ;"}
|
|
1
|
+
{"version":3,"file":"formMetadata.js","sources":["../../src/rpc/formMetadata.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type {\n WorkloadKind,\n WorkloadResource,\n} from \"../components/workload-picker-utils\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type { SortState } from \"../hooks/use-sort\";\nimport {\n parseBoundsValue,\n parseMultiFilterValue,\n serializeBoundsValue,\n serializeMultiFilterValue,\n splitCommaValues,\n} from \"../data/data-table-filter-values\";\nimport { filterShapesByName } from \"./filterShapes\";\nimport type {\n ClickyFilterShape,\n ExecutionResponse,\n OpenAPIParameter,\n OperationLookupFilter,\n OperationLookupResponse,\n OperationRequestValues,\n} from \"./types\";\nimport { isPositionalParam, parameterPlaceholder } from \"./types\";\n\nexport type ParameterValues = Record<string, string>;\nexport type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;\n\n// ParameterPagination plumbs limit/offset query parameters into the\n// DataTable's pagination footer. The UI exposes both as the\n// {pageSize, pageIndex} tuple but here we keep raw string limit/offset\n// values so the executor sees exactly what the operation declared.\nexport type ParameterPagination = {\n limitParam: string; // parameter name on the operation, e.g. \"limit\"\n limitValue: string;\n setLimit: (next: string) => void;\n\n // Offset paging, when the operation declares an offset parameter. Absent for\n // a surface that cannot name a position past its first page — a profile with\n // no total order, say. Such a surface still sizes its page and still reports\n // how many rows it is showing of how many; it just cannot step.\n offsetParam?: string;\n offsetValue?: string;\n setOffset?: (next: string) => void;\n\n // Cursor paging, when the operation declares a cursor parameter. Present\n // alongside limit/offset rather than instead of them: an operation can serve\n // both, and which one a page uses is decided per request.\n cursorParam?: string;\n cursorValue?: string;\n setCursor?: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n sort?: ParameterSort;\n};\n\nexport type ParameterSort = {\n value: SortState | null;\n onChange: (sort: SortState | null) => void;\n};\n// LookupSearch fetches the options of one filter matching `query`, server-side.\n// It is what a truncated option set is reachable through: the head the lookup\n// returned is only the first page of a larger distinct set, and everything past\n// it is found by typing rather than by scrolling.\nexport type LookupSearch = (\n filterKey: string,\n query: string,\n) => Promise<{ value: string; label: string; title?: string }[]>;\n\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\n // Wired only into filters the server marked truncated: one that fully\n // enumerated needs no round trip to search what is already in the browser.\n lookupSearch?: LookupSearch | undefined;\n // The spec's `components[\"x-clicky-filters\"]` map, which every filter\n // parameter names via its `$ref`. It is what a control's identity is read\n // from, so that identity survives a filter change: `lookup` carries the same\n // answer but is refetched per selection, and reading shape from it is what\n // used to collapse every chip into a text box for the length of that fetch.\n components?: Record<string, ClickyFilterShape> | undefined;\n};\n\n// A truncated set has to say so even where nothing can search it: the footer\n// telling the user 350 values are missing is what stops a partial list reading\n// as the whole answer.\nfunction truncationProps(filter: OperationLookupFilter) {\n if (!filter.truncated) return {};\n return {\n truncated: true,\n ...(filter.total !== undefined ? { total: filter.total } : {}),\n };\n}\n\n// Server-side search applies only when the server said it withheld options. A\n// filter whose set arrived whole is searched in the browser, which is both\n// faster and exactly as complete.\nfunction searchProps(\n filter: OperationLookupFilter,\n key: string,\n search: LookupSearch | undefined,\n) {\n if (!filter.truncated) return {};\n return {\n ...truncationProps(filter),\n ...(search ? { onSearch: (query: string) => search(key, query) } : {}),\n };\n}\n\nexport function titleCase(value: string) {\n return value\n .split(/[-_]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport function defaultValueForParameter(\n param: OpenAPIParameter,\n method: string,\n): string {\n if (\n method.toUpperCase() === \"GET\" &&\n param.in === \"query\" &&\n !param.required\n ) {\n return \"\";\n }\n const fallback = param.in === \"path\" ? \"\" : undefined;\n const value = param.schema?.default ?? fallback;\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value) || (value != null && typeof value === \"object\")) {\n return \"\";\n }\n if (value == null) {\n return \"\";\n }\n return String(value);\n}\n\nexport function buildInitialParameterValues(\n parameters: OpenAPIParameter[],\n method: string,\n lockedValues: ParameterValues = {},\n initialValues: ParameterValues = {},\n): ParameterValues {\n const values = Object.fromEntries(\n parameters.map((param) => [\n param.name,\n defaultValueForParameter(param, method),\n ]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\n\n// OFFSET_DEPTH_LIMIT is where offset paging stops being available and a cursor\n// takes over. It exists because backends refuse a deep offset outright —\n// OpenSearch's default result window is 10,000 — so this is the one place that\n// decides the changeover rather than each surface discovering the refusal for\n// itself. Below it, page-number jumps stay available; past it there is nothing\n// to jump with, because a cursor names a position rather than a page.\nexport const OFFSET_DEPTH_LIMIT = 10_000;\n\nexport function dataTablePaginationFromForm(\n pagination: ParameterPagination | undefined,\n response: Pick<ExecutionResponse, \"pagination\"> | null | undefined,\n): DataTablePagination | undefined {\n if (!pagination) return undefined;\n\n // The footer describes the rows currently rendered, not the request that is\n // replacing them. During keepPreviousData refetches the form already holds\n // the next offset while the response still holds the retained page.\n const pageSize =\n response?.pagination?.limit ?? positiveInt(pagination.limitValue) ?? 25;\n const offset =\n response?.pagination?.offset ?? nonNegativeInt(pagination.offsetValue) ?? 0;\n const page = Math.floor(offset / pageSize);\n const served = response?.pagination;\n const setCursor = pagination.setCursor;\n const setOffset = pagination.setOffset;\n\n return {\n page,\n pageSize,\n ...(served?.total !== undefined ? { total: served.total } : {}),\n ...(served?.totalRelation !== undefined\n ? { totalRelation: served.totalRelation }\n : {}),\n ...(served?.hasMore !== undefined ? { hasMore: served.hasMore } : {}),\n // Cursor mode needs both halves: a parameter to send the cursor on, and a\n // cursor to send. An operation that declares one without the server minting\n // the other pages by offset, which is correct and merely slower.\n //\n // Which mode applies is depth, not preference: a walk already under way\n // continues, and a shallow page keeps its jump controls until the next one\n // would cross OFFSET_DEPTH_LIMIT — the point past which the offset would be\n // refused anyway.\n ...(setCursor &&\n (pagination.cursorValue ||\n (served?.nextCursor &&\n (!setOffset || offset + pageSize >= OFFSET_DEPTH_LIMIT)))\n ? {\n cursor: {\n ...(pagination.cursorValue\n ? { current: pagination.cursorValue }\n : {}),\n ...(served?.nextCursor ? { next: served.nextCursor } : {}),\n onCursorChange: (next: string | undefined) => {\n // Offset and cursor are two disagreeing positions in one request,\n // so taking the cursor means dropping the offset.\n setOffset?.(\"0\");\n setCursor(next ?? \"\");\n },\n },\n }\n : {}),\n // Offered only when there is somewhere to step to. A surface with no offset\n // parameter still counts and still resizes, but naming page two would be\n // naming a page the server will refuse.\n ...(setOffset\n ? {\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n setCursor?.(\"\");\n setOffset(String(Math.max(next, 0) * pageSize));\n },\n }\n : {}),\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n // A cursor names a position in a page of the old size, so resizing the\n // page invalidates it and the walk restarts.\n setCursor?.(\"\");\n setOffset?.(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(\n Object.entries(values).filter(([, value]) => value !== \"\"),\n );\n}\n\n/**\n * Packs form/filter state into the request the operation actually describes.\n *\n * Values a parameter list does not name are dropped rather than forwarded.\n * Filter state outlives a single surface — the explorer seeds it from the URL\n * and carries it across routes — and a server asked for a filter it does not\n * have rejects the whole request rather than the one value, so a leftover\n * `filter.*` from another profile turns a working table into an error.\n */\nexport function packParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): OperationRequestValues {\n const params: OperationRequestValues = {};\n const args: string[] = [];\n\n for (const parameter of parameters) {\n const value = values[parameter.name];\n if (!value) continue;\n if (parameter.in !== \"path\" && isPositionalParam(parameter)) {\n args.push(value);\n } else {\n params[parameter.name] = value;\n }\n }\n\n if (args.length > 0) {\n params.args = args;\n }\n\n return params;\n}\n\nexport function packLookupParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): OperationRequestValues {\n return packParameterValues(\n values,\n parameters.filter(\n (parameter) =>\n parameter[\"x-clicky\"]?.role !== \"limit\" &&\n parameter[\"x-clicky\"]?.role !== \"offset\" &&\n parameter[\"x-clicky\"]?.role !== \"cursor\" &&\n parameter[\"x-clicky\"]?.role !== \"sort\" &&\n parameter[\"x-clicky\"]?.role !== \"order\",\n ),\n );\n}\n\nexport function parametersToFormConfig(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n setValues: ParameterValuesSetter,\n options: ParameterFormOptions = {},\n): ParameterFormConfig {\n const emitFilters: FilterBarFilter[] = [];\n const lookupFilters = options.lookup?.filters ?? {};\n // Shape comes from the spec, values from the lookup. The lookup answers both\n // questions, but only the values half of its answer can change, so a control\n // that reads its identity from the spec keeps that identity while the values\n // half is being refetched.\n const shapes = filterShapesByName(parameters, options.components);\n const includeLocations = new Set(\n options.includeLocations ?? [\"path\", \"query\", \"header\"],\n );\n const lockedValues = options.lockedValues ?? {};\n const hideLocked = options.hideLocked ?? false;\n\n // Pull limit/offset out of the filter loop entirely — they drive pagination,\n // not filter pills. Roles come from server-side `paramRole` (see\n // clicky/rpc/openapi.go); the older \"named limit on a GET\" heuristic is\n // intentionally not duplicated here so the server stays the single source\n // of truth for parameter classification.\n const limitParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"limit\");\n const offsetParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"offset\");\n // A cursor is an opaque server-minted token, so it is never a filter chip a\n // user could type into — it is only ever echoed back from a previous page.\n const cursorParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"cursor\");\n const sortParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"sort\");\n const orderParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"order\");\n if ((sortParam == null) !== (orderParam == null)) {\n throw new Error(\"Server sorting requires both sort and order parameters\");\n }\n const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.name);\n if (cursorParam) paginationOmitNames.add(cursorParam.name);\n if (sortParam) paginationOmitNames.add(sortParam.name);\n if (orderParam) paginationOmitNames.add(orderParam.name);\n\n // The search-role param drives the FilterBar's dedicated search input rather\n // than a filter chip; pull it out of the chip loop the same way pagination is.\n const searchParam = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"search\" && includeLocations.has(p.in),\n );\n const omitNames = new Set(paginationOmitNames);\n if (searchParam) omitNames.add(searchParam.name);\n\n // rewind returns the caller to the first page whenever the result set itself\n // changes. Both positions have to go: an offset into the old rows names\n // different rows in the new ones, and a cursor minted under the old filters\n // is rejected by the server outright rather than silently reinterpreted.\n const rewind = (next: ParameterValues): ParameterValues => ({\n ...next,\n ...(offsetParam ? { [offsetParam.name]: \"0\" } : {}),\n ...(cursorParam ? { [cursorParam.name]: \"\" } : {}),\n });\n\n // Time-range first looks for server-stamped roles, then falls back to the\n // existing lookup-driven \"from\"/\"to\" detection so older specs keep working.\n const roleRangeStart = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"time-from\",\n );\n const roleRangeEnd = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"time-to\",\n );\n const edgeType = (param: OpenAPIParameter) =>\n shapes.get(param.name)?.type ?? lookupFilters[param.name]?.type;\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n edgeType(param) === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n edgeType(param) === \"to\",\n );\n const hasTimeRange = rangeStart != null && rangeEnd != null;\n\n for (const param of parameters) {\n if (!includeLocations.has(param.in)) continue;\n if (omitNames.has(param.name)) continue;\n if (\n hasTimeRange &&\n (param.name === rangeStart?.name || param.name === rangeEnd?.name)\n ) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(\n lockedValues,\n param.name,\n );\n if (disabled && hideLocked) continue;\n const value = disabled\n ? (lockedValues[param.name] ?? \"\")\n : (values[param.name] ?? \"\");\n const shape = shapes.get(param.name);\n const label =\n shape?.label ?? lookupFilters[param.name]?.label ?? titleCase(param.name);\n // Only an explicit placeholder is rendered — never synthesize one. The\n // field already carries `label`, so a fallback placeholder is redundant\n // and generic defaults (e.g. \"value-1, value-2\") read as fake data.\n const placeholder = parameterPlaceholder(param);\n const placeholderProp = placeholder !== undefined ? { placeholder } : {};\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue =\n typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => rewind({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n // The spec's answer wins: it is the one that is still there mid-refetch.\n const filterType = shape?.type ?? lookupFilter?.type;\n\n if (filterType === \"workload\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"workload\",\n label,\n value,\n disabled,\n kinds: [\"pod\", \"deployment\", \"statefulset\", \"daemonset\"],\n loadWorkloads: async (kinds) =>\n lookupFilter ? workloadsFromLookup(lookupFilter, kinds) : {},\n // A server-generated workload filter is scoped by the operation itself,\n // so a lookup returning one workload means the scope already picked it.\n collapseSingleOption: true,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"labels\" && param.in === \"query\") {\n const fieldOptions = lookupFilter\n ? lookupOptionsToFieldOptions(lookupFilter)\n : [];\n const selection = parseMultiFilterValue(value);\n const grouped =\n fieldOptions.some((option) => option.value.includes(\"=\")) ||\n Object.keys(selection).some((selected) => selected.includes(\"=\"));\n if (grouped) {\n emitFilters.push({\n key: param.name,\n kind: \"nested-multi\",\n label,\n value: selection,\n disabled,\n groups: labelOptionGroups(fieldOptions),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n } else {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: selection,\n disabled,\n options: fieldOptions,\n ...(lookupFilter\n ? searchProps(lookupFilter, param.name, options.lookupSearch)\n : {}),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n }\n continue;\n }\n\n // Both edges of a range travel under one parameter, so the control is built\n // from that parameter alone rather than from the from/to pair below.\n // A \"day-range\" is the same control with the clock taken off it, so it\n // shares this branch and differs only in timeEnabled.\n if (\n (filterType === \"date-range\" || filterType === \"day-range\") &&\n param.in === \"query\"\n ) {\n // A server that declares a default applies it to a request that names no\n // bound, so the control shows that default rather than \"any time\" — an\n // empty range control over a bounded query states the wrong query. Only\n // the display falls back; the value is still whatever was selected, so\n // nothing is written to the URL on the strength of a default.\n const bounds = parseBoundsValue(\n value || String(param.schema?.default ?? \"\"),\n );\n emitFilters.push({\n key: param.name,\n kind: \"date-range\",\n label,\n disabled,\n ...(bounds.min !== undefined ? { from: bounds.min } : {}),\n ...(bounds.max !== undefined ? { to: bounds.max } : {}),\n ...(lookupFilter?.presets ? { presets: lookupFilter.presets } : {}),\n timeEnabled:\n filterType === \"day-range\" ? false : (lookupFilter?.timeEnabled ?? true),\n ...(lookupFilter?.timeZone ? { timeZone: lookupFilter.timeZone } : {}),\n ...(lookupFilter?.timeZones\n ? { timeZones: lookupFilter.timeZones }\n : {}),\n onApply: (from: string, to: string) => {\n if (disabled) return;\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeBoundsValue({ min: from, max: to }),\n }),\n );\n },\n });\n continue;\n }\n\n // An exact-value selection with nothing to enumerate. It shares the\n // multi-filter grammar, so the raw string is written through unchanged:\n // \"a,b\" is two values and \"!a\" excludes one, exactly as picking them would.\n if (filterType === \"value\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"multi-filter\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: parseMultiFilterValue(value),\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n ...(lookupFilter\n ? searchProps(lookupFilter, param.name, options.lookupSearch)\n : {}),\n onChange: (next) =>\n setValues((current) =>\n rewind({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n }),\n ),\n });\n continue;\n }\n\n if (schema?.enum) {\n emitFilters.push({\n key: param.name,\n kind: \"enum\",\n label,\n value,\n disabled,\n options: schema.enum.map((item) => ({\n value: String(item),\n label: String(item),\n })),\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (filterType === \"bool\" || schema?.type === \"boolean\") {\n emitFilters.push({\n key: param.name,\n kind: \"boolean\",\n label,\n value: value === \"true\",\n disabled,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if ((shape != null || lookupFilter != null) && param.in === \"query\") {\n if (shape?.multi ?? lookupFilter?.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n // Reported, not searched: this control's onSearch hands the query back\n // to the consumer to refetch and re-feed `options`, which is a\n // different contract from the one searchProps satisfies.\n ...(lookupFilter ? truncationProps(lookupFilter) : {}),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) =>\n rewind({ ...current, [param.name]: next.join(\",\") }),\n ),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupFilter ? lookupOptionsToFieldOptions(lookupFilter) : [],\n ...placeholderProp,\n inputType:\n filterType === \"number\"\n ? \"number\"\n : filterType === \"date\"\n ? \"date\"\n : \"text\",\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (sortParam && orderParam) {\n const key = values[sortParam.name] ?? \"\";\n const direction = values[orderParam.name] || \"asc\";\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new Error(`Unsupported server sort direction ${direction}`);\n }\n config.sort = {\n value: key ? { key, dir: direction } : null,\n onChange: (next) =>\n setValues((current) => {\n const updated = { ...current };\n if (next) {\n updated[sortParam.name] = next.key;\n updated[orderParam.name] = next.dir;\n } else {\n delete updated[sortParam.name];\n delete updated[orderParam.name];\n }\n return rewind(updated);\n }),\n };\n }\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(\n lockedValues,\n searchParam.name,\n );\n const searchValue = searchDisabled\n ? (lockedValues[searchParam.name] ?? \"\")\n : (values[searchParam.name] ?? \"\");\n const searchPlaceholder = parameterPlaceholder(searchParam);\n config.search = {\n value: searchValue,\n onChange: (next) => {\n if (searchDisabled) return;\n setValues((current) =>\n rewind({ ...current, [searchParam.name]: next }),\n );\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel:\n lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n // Gated on the limit alone. An operation that caps its rows can report how\n // many of how many it is showing and can resize the cap, both of which are\n // independent of being able to step to a second page — and gating the whole\n // footer on the offset is what made a surface without one report \"100 of 100\"\n // while the server was answering with a total of 12,558.\n if (limitParam) {\n config.pagination = {\n limitParam: limitParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n setLimit: (next) =>\n setValues((current) => ({ ...current, [limitParam.name]: next })),\n ...(offsetParam\n ? {\n offsetParam: offsetParam.name,\n offsetValue: values[offsetParam.name] ?? \"\",\n setOffset: (next: string) =>\n setValues((current) => ({\n ...current,\n [offsetParam.name]: next,\n })),\n }\n : {}),\n ...(cursorParam\n ? {\n cursorParam: cursorParam.name,\n cursorValue: values[cursorParam.name] ?? \"\",\n setCursor: (next: string) =>\n setValues((current) => ({\n ...current,\n [cursorParam.name]: next,\n })),\n }\n : {}),\n };\n }\n if (hasTimeRange && rangeStart != null && rangeEnd != null) {\n const rangeStartMeta = lookupFilters[rangeStart.name];\n const rangeEndMeta = lookupFilters[rangeEnd.name];\n const rangeMeta = rangeStartMeta ?? rangeEndMeta;\n const explicitTimeEnabled =\n rangeStartMeta?.timeEnabled ?? rangeEndMeta?.timeEnabled;\n config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) =>\n rewind({ ...current, [rangeStart.name]: from, [rangeEnd.name]: to }),\n ),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n timeEnabled:\n explicitTimeEnabled ??\n (rangeStart.schema?.format === \"date-time\" ||\n rangeEnd.schema?.format === \"date-time\"),\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description\n ? { fromPlaceholder: rangeStart.description }\n : {}),\n ...(rangeEnd.description ? { toPlaceholder: rangeEnd.description } : {}),\n };\n }\n\n return config;\n}\n\nexport function useDebouncedRecord<T>(value: T, delayMs: number) {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(timeoutId);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nfunction positiveInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction nonNegativeInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nexport function lookupOptionsToFieldOptions(filter: OperationLookupFilter) {\n const merged = new Map<string, { label?: string; title?: string }>();\n\n for (const [value, node] of Object.entries(filter.options ?? {})) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n\n for (const [value, node] of Object.entries(filter.selected ?? {})) {\n if (!merged.has(value)) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n }\n\n return Array.from(merged.entries()).map(([value, meta]) => ({\n value,\n label: meta.label ?? value,\n title: meta.title ?? value,\n }));\n}\n\nfunction workloadsFromLookup(\n filter: OperationLookupFilter,\n kinds: WorkloadKind[],\n): Partial<Record<WorkloadKind, WorkloadResource[]>> {\n const requested = new Set(kinds);\n const result: Partial<Record<WorkloadKind, WorkloadResource[]>> = {};\n for (const kind of kinds) result[kind] = [];\n for (const option of lookupOptionsToFieldOptions(filter)) {\n const parts = option.value.split(\"/\");\n const name = parts.at(-1);\n const providerKind = parts.at(-2)?.toLowerCase() as\n | WorkloadKind\n | undefined;\n const namespace =\n parts.length > 2 ? parts.slice(0, -2).join(\"/\") : undefined;\n if (!name || !providerKind || !requested.has(providerKind)) continue;\n result[providerKind]?.push({ name, ...(namespace ? { namespace } : {}) });\n }\n return result;\n}\n\nfunction labelOptionGroups(\n options: ReturnType<typeof lookupOptionsToFieldOptions>,\n) {\n const grouped = new Map<string, typeof options>();\n for (const option of options) {\n const separator = option.value.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = option.value.slice(0, separator);\n const value = option.value.slice(separator + 1);\n const values = grouped.get(key) ?? [];\n values.push({ ...option, label: value || option.label });\n grouped.set(key, values);\n }\n return Array.from(grouped, ([groupKey, groupOptions]) => ({\n groupKey,\n label: groupKey,\n options: groupOptions,\n }));\n}\n\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(\n node: PlainTextClickyNode | null | undefined,\n): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? [])\n .map((child) => clickyNodeToPlainText(child))\n .join(\"\");\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-story.fixtures.d.ts","sourceRoot":"","sources":["../../src/rpc/rpc-story.fixtures.ts"],"names":[],"mappings":"AASA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAYnG,eAAO,MAAM,WAAW,EAAE,WAKzB,CAAC;
|
|
1
|
+
{"version":3,"file":"rpc-story.fixtures.d.ts","sourceRoot":"","sources":["../../src/rpc/rpc-story.fixtures.ts"],"names":[],"mappings":"AASA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAYnG,eAAO,MAAM,WAAW,EAAE,WAKzB,CAAC;AAwBF,eAAO,MAAM,WAAW,EAAE,mBAkCzB,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,EAAE,iBAAiB,EAGhD,CAAC;AAEF;;kFAEkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,iBAIlC,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,iBAAgC,CAAC;AAEtE,eAAO,MAAM,iBAAiB,EAAE,gBAM/B,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,cAAc,GAAG,YAAY,CAE3F"}
|