@flanksource/clicky-ui 0.2.15 → 0.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Combobox.cjs +15 -7
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +8 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +15 -7
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/DateTimePicker.cjs +3 -0
- package/dist/components/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker.d.ts +6 -2
- package/dist/components/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker.js +3 -0
- package/dist/components/DateTimePicker.js.map +1 -1
- package/dist/components/Field.cjs +33 -0
- package/dist/components/Field.cjs.map +1 -0
- package/dist/components/Field.d.ts +27 -0
- package/dist/components/Field.d.ts.map +1 -0
- package/dist/components/Field.js +33 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/FilterBar.cjs +41 -14
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +2 -0
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +43 -16
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/MultiSelect.cjs +2 -1
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts +5 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +2 -1
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +15 -8
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +15 -8
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +1 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/loading.cjs +4 -4
- package/dist/components/loading.cjs.map +1 -1
- package/dist/components/loading.d.ts +6 -4
- package/dist/components/loading.d.ts.map +1 -1
- package/dist/components/loading.js +4 -4
- package/dist/components/loading.js.map +1 -1
- package/dist/components/use-form.cjs +27 -0
- package/dist/components/use-form.cjs.map +1 -0
- package/dist/components/use-form.d.ts +30 -0
- package/dist/components/use-form.d.ts.map +1 -0
- package/dist/components/use-form.js +27 -0
- package/dist/components/use-form.js.map +1 -0
- package/dist/components.cjs +7 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +4 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +8 -1
- package/dist/components.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/index.cjs +7 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/overlay/Modal.cjs +27 -23
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +7 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +27 -23
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +4 -4
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.js +4 -4
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +17 -21
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -3
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +18 -22
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +5 -3
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +5 -3
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -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 FilterBarMultiFilterMode,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\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 offsetParam: string;\n limitValue: string;\n offsetValue: string;\n setLimit: (next: string) => void;\n setOffset: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n};\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\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(param: OpenAPIParameter, method: string): string {\n if (method.toUpperCase() === \"GET\" && param.in === \"query\" && !param.required) {\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) => [param.name, defaultValueForParameter(param, method)]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\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 const pageSize = positiveInt(pagination.limitValue) ?? response?.pagination?.limit ?? 25;\n const offset = nonNegativeInt(pagination.offsetValue) ?? response?.pagination?.offset ?? 0;\n const page = Math.floor(offset / pageSize);\n\n return {\n page,\n pageSize,\n ...(response?.pagination?.total !== undefined ? { total: response.pagination.total } : {}),\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n pagination.setOffset(String(Math.max(next, 0) * pageSize));\n },\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n pagination.setOffset(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== \"\"));\n}\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 params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) 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 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 const includeLocations = new Set(options.includeLocations ?? [\"path\", \"query\", \"header\"]);\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 const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.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 // 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((p) => p[\"x-clicky\"]?.role === \"time-from\");\n const roleRangeEnd = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-to\");\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"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 (hasTimeRange && (param.name === rangeStart?.name || param.name === rangeEnd?.name)) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(lockedValues, param.name);\n if (disabled && hideLocked) continue;\n const value = disabled ? (lockedValues[param.name] ?? \"\") : (values[param.name] ?? \"\");\n const label = lookupFilters[param.name]?.label ?? titleCase(param.name);\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue = typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => ({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n\n if (lookupFilter?.type === \"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: lookupOptionsToFieldOptions(lookupFilter),\n onChange: (next) =>\n setValues((current) => ({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\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 (lookupFilter?.type === \"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 (lookupFilter != null && param.in === \"query\") {\n if (lookupFilter.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n placeholder: parameterPlaceholder(param) ?? \"value-1, value-2\",\n onChange: (next) =>\n setValues((current) => ({ ...current, [param.name]: next.join(\",\") })),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n placeholder: parameterPlaceholder(param) ?? label,\n inputType:\n lookupFilter.type === \"number\"\n ? \"number\"\n : lookupFilter.type === \"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 placeholder: parameterPlaceholder(param) ?? label,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(lockedValues, searchParam.name);\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) => ({ ...current, [searchParam.name]: next }));\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel: lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n if (limitParam && offsetParam) {\n config.pagination = {\n limitParam: limitParam.name,\n offsetParam: offsetParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n offsetValue: values[offsetParam.name] ?? \"\",\n setLimit: (next) => setValues((current) => ({ ...current, [limitParam.name]: next })),\n setOffset: (next) => setValues((current) => ({ ...current, [offsetParam.name]: next })),\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 config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) => ({\n ...current,\n [rangeStart.name]: from,\n [rangeEnd.name]: to,\n })),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n ...(rangeMeta?.timeEnabled !== undefined ? { timeEnabled: rangeMeta.timeEnabled } : {}),\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description ? { fromPlaceholder: rangeStart.description } : {}),\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\nexport function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode> {\n const parsed: Record<string, FilterBarMultiFilterMode> = {};\n for (const item of splitCommaValues(value)) {\n if (item.startsWith(\"!\") && item.length > 1) {\n parsed[item.slice(1)] = \"exclude\";\n } else {\n parsed[item] = \"include\";\n }\n }\n return parsed;\n}\n\nexport function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string {\n return Object.entries(value)\n .flatMap(([key, mode]) => {\n if (mode === \"include\") return [key];\n if (mode === \"exclude\") return [`!${key}`];\n return [];\n })\n .join(\",\");\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\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\nfunction 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\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(node: PlainTextClickyNode | null | undefined): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join(\"\");\n}\n"],"names":["isPositionalParam","_a","parameterPlaceholder","useState","useEffect"],"mappings":"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"}
|
|
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 FilterBarMultiFilterMode,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\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 offsetParam: string;\n limitValue: string;\n offsetValue: string;\n setLimit: (next: string) => void;\n setOffset: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n};\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\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(param: OpenAPIParameter, method: string): string {\n if (method.toUpperCase() === \"GET\" && param.in === \"query\" && !param.required) {\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) => [param.name, defaultValueForParameter(param, method)]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\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 const pageSize = positiveInt(pagination.limitValue) ?? response?.pagination?.limit ?? 25;\n const offset = nonNegativeInt(pagination.offsetValue) ?? response?.pagination?.offset ?? 0;\n const page = Math.floor(offset / pageSize);\n\n return {\n page,\n pageSize,\n ...(response?.pagination?.total !== undefined ? { total: response.pagination.total } : {}),\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n pagination.setOffset(String(Math.max(next, 0) * pageSize));\n },\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n pagination.setOffset(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== \"\"));\n}\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 params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) 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 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 const includeLocations = new Set(options.includeLocations ?? [\"path\", \"query\", \"header\"]);\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 const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.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 // 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((p) => p[\"x-clicky\"]?.role === \"time-from\");\n const roleRangeEnd = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-to\");\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"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 (hasTimeRange && (param.name === rangeStart?.name || param.name === rangeEnd?.name)) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(lockedValues, param.name);\n if (disabled && hideLocked) continue;\n const value = disabled ? (lockedValues[param.name] ?? \"\") : (values[param.name] ?? \"\");\n const 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 = typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => ({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n\n if (lookupFilter?.type === \"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: lookupOptionsToFieldOptions(lookupFilter),\n onChange: (next) =>\n setValues((current) => ({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\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 (lookupFilter?.type === \"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 (lookupFilter != null && param.in === \"query\") {\n if (lookupFilter.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) => ({ ...current, [param.name]: next.join(\",\") })),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n inputType:\n lookupFilter.type === \"number\"\n ? \"number\"\n : lookupFilter.type === \"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 (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(lockedValues, searchParam.name);\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) => ({ ...current, [searchParam.name]: next }));\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel: lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n if (limitParam && offsetParam) {\n config.pagination = {\n limitParam: limitParam.name,\n offsetParam: offsetParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n offsetValue: values[offsetParam.name] ?? \"\",\n setLimit: (next) => setValues((current) => ({ ...current, [limitParam.name]: next })),\n setOffset: (next) => setValues((current) => ({ ...current, [offsetParam.name]: next })),\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 config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) => ({\n ...current,\n [rangeStart.name]: from,\n [rangeEnd.name]: to,\n })),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n ...(rangeMeta?.timeEnabled !== undefined ? { timeEnabled: rangeMeta.timeEnabled } : {}),\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description ? { fromPlaceholder: rangeStart.description } : {}),\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\nexport function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode> {\n const parsed: Record<string, FilterBarMultiFilterMode> = {};\n for (const item of splitCommaValues(value)) {\n if (item.startsWith(\"!\") && item.length > 1) {\n parsed[item.slice(1)] = \"exclude\";\n } else {\n parsed[item] = \"include\";\n }\n }\n return parsed;\n}\n\nexport function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string {\n return Object.entries(value)\n .flatMap(([key, mode]) => {\n if (mode === \"include\") return [key];\n if (mode === \"exclude\") return [`!${key}`];\n return [];\n })\n .join(\",\");\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\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\nfunction 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\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(node: PlainTextClickyNode | null | undefined): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join(\"\");\n}\n"],"names":["isPositionalParam","_a","parameterPlaceholder","useState","useEffect"],"mappings":"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"}
|
|
@@ -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,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEhB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAGjB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACrD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;AAM9E,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAMtC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBxF;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,eAAoB,EAClC,aAAa,GAAE,eAAoB,GAClC,eAAe,CAKjB;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,GACjE,mBAAmB,GAAG,SAAS,CAsBjC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe;;EAE3D;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,gBAAgB,EAAE,GAC7B,eAAe,CAuBjB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,qBAAqB,EAChC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,
|
|
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,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEhB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAGjB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACrD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;AAM9E,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAMtC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBxF;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,eAAoB,EAClC,aAAa,GAAE,eAAoB,GAClC,eAAe,CAKjB;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,GACjE,mBAAmB,GAAG,SAAS,CAsBjC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe;;EAE3D;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,gBAAgB,EAAE,GAC7B,eAAe,CAuBjB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,qBAAqB,EAChC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAsNrB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAS9D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAU7F;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,GAAG,MAAM,CAQjG"}
|
package/dist/rpc/formMetadata.js
CHANGED
|
@@ -128,6 +128,8 @@ function parametersToFormConfig(parameters, values, setValues, options = {}) {
|
|
|
128
128
|
if (disabled && hideLocked) continue;
|
|
129
129
|
const value = disabled ? lockedValues[param.name] ?? "" : values[param.name] ?? "";
|
|
130
130
|
const label = ((_b = lookupFilters[param.name]) == null ? void 0 : _b.label) ?? titleCase(param.name);
|
|
131
|
+
const placeholder = parameterPlaceholder(param);
|
|
132
|
+
const placeholderProp = placeholder !== void 0 ? { placeholder } : {};
|
|
131
133
|
const onChange = (next) => {
|
|
132
134
|
if (disabled) return;
|
|
133
135
|
const stringValue = typeof next === "boolean" ? next ? "true" : "false" : next;
|
|
@@ -185,7 +187,7 @@ function parametersToFormConfig(parameters, values, setValues, options = {}) {
|
|
|
185
187
|
value: splitCommaValues(value),
|
|
186
188
|
disabled,
|
|
187
189
|
options: lookupOptionsToFieldOptions(lookupFilter),
|
|
188
|
-
|
|
190
|
+
...placeholderProp,
|
|
189
191
|
onChange: (next) => setValues((current) => ({ ...current, [param.name]: next.join(",") }))
|
|
190
192
|
});
|
|
191
193
|
continue;
|
|
@@ -197,7 +199,7 @@ function parametersToFormConfig(parameters, values, setValues, options = {}) {
|
|
|
197
199
|
value,
|
|
198
200
|
disabled,
|
|
199
201
|
options: lookupOptionsToFieldOptions(lookupFilter),
|
|
200
|
-
|
|
202
|
+
...placeholderProp,
|
|
201
203
|
inputType: lookupFilter.type === "number" ? "number" : lookupFilter.type === "date" ? "date" : "text",
|
|
202
204
|
onChange: (next) => onChange(next)
|
|
203
205
|
});
|
|
@@ -209,7 +211,7 @@ function parametersToFormConfig(parameters, values, setValues, options = {}) {
|
|
|
209
211
|
label,
|
|
210
212
|
value,
|
|
211
213
|
disabled,
|
|
212
|
-
|
|
214
|
+
...placeholderProp,
|
|
213
215
|
onChange: (next) => onChange(next)
|
|
214
216
|
});
|
|
215
217
|
}
|
|
@@ -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 FilterBarMultiFilterMode,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\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 offsetParam: string;\n limitValue: string;\n offsetValue: string;\n setLimit: (next: string) => void;\n setOffset: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n};\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\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(param: OpenAPIParameter, method: string): string {\n if (method.toUpperCase() === \"GET\" && param.in === \"query\" && !param.required) {\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) => [param.name, defaultValueForParameter(param, method)]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\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 const pageSize = positiveInt(pagination.limitValue) ?? response?.pagination?.limit ?? 25;\n const offset = nonNegativeInt(pagination.offsetValue) ?? response?.pagination?.offset ?? 0;\n const page = Math.floor(offset / pageSize);\n\n return {\n page,\n pageSize,\n ...(response?.pagination?.total !== undefined ? { total: response.pagination.total } : {}),\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n pagination.setOffset(String(Math.max(next, 0) * pageSize));\n },\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n pagination.setOffset(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== \"\"));\n}\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 params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) 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 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 const includeLocations = new Set(options.includeLocations ?? [\"path\", \"query\", \"header\"]);\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 const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.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 // 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((p) => p[\"x-clicky\"]?.role === \"time-from\");\n const roleRangeEnd = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-to\");\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"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 (hasTimeRange && (param.name === rangeStart?.name || param.name === rangeEnd?.name)) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(lockedValues, param.name);\n if (disabled && hideLocked) continue;\n const value = disabled ? (lockedValues[param.name] ?? \"\") : (values[param.name] ?? \"\");\n const label = lookupFilters[param.name]?.label ?? titleCase(param.name);\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue = typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => ({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n\n if (lookupFilter?.type === \"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: lookupOptionsToFieldOptions(lookupFilter),\n onChange: (next) =>\n setValues((current) => ({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\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 (lookupFilter?.type === \"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 (lookupFilter != null && param.in === \"query\") {\n if (lookupFilter.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n placeholder: parameterPlaceholder(param) ?? \"value-1, value-2\",\n onChange: (next) =>\n setValues((current) => ({ ...current, [param.name]: next.join(\",\") })),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n placeholder: parameterPlaceholder(param) ?? label,\n inputType:\n lookupFilter.type === \"number\"\n ? \"number\"\n : lookupFilter.type === \"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 placeholder: parameterPlaceholder(param) ?? label,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(lockedValues, searchParam.name);\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) => ({ ...current, [searchParam.name]: next }));\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel: lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n if (limitParam && offsetParam) {\n config.pagination = {\n limitParam: limitParam.name,\n offsetParam: offsetParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n offsetValue: values[offsetParam.name] ?? \"\",\n setLimit: (next) => setValues((current) => ({ ...current, [limitParam.name]: next })),\n setOffset: (next) => setValues((current) => ({ ...current, [offsetParam.name]: next })),\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 config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) => ({\n ...current,\n [rangeStart.name]: from,\n [rangeEnd.name]: to,\n })),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n ...(rangeMeta?.timeEnabled !== undefined ? { timeEnabled: rangeMeta.timeEnabled } : {}),\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description ? { fromPlaceholder: rangeStart.description } : {}),\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\nexport function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode> {\n const parsed: Record<string, FilterBarMultiFilterMode> = {};\n for (const item of splitCommaValues(value)) {\n if (item.startsWith(\"!\") && item.length > 1) {\n parsed[item.slice(1)] = \"exclude\";\n } else {\n parsed[item] = \"include\";\n }\n }\n return parsed;\n}\n\nexport function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string {\n return Object.entries(value)\n .flatMap(([key, mode]) => {\n if (mode === \"include\") return [key];\n if (mode === \"exclude\") return [`!${key}`];\n return [];\n })\n .join(\",\");\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\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\nfunction 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\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(node: PlainTextClickyNode | null | undefined): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join(\"\");\n}\n"],"names":["_a"],"mappings":"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"}
|
|
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 FilterBarMultiFilterMode,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\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 offsetParam: string;\n limitValue: string;\n offsetValue: string;\n setLimit: (next: string) => void;\n setOffset: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n};\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\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(param: OpenAPIParameter, method: string): string {\n if (method.toUpperCase() === \"GET\" && param.in === \"query\" && !param.required) {\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) => [param.name, defaultValueForParameter(param, method)]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\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 const pageSize = positiveInt(pagination.limitValue) ?? response?.pagination?.limit ?? 25;\n const offset = nonNegativeInt(pagination.offsetValue) ?? response?.pagination?.offset ?? 0;\n const page = Math.floor(offset / pageSize);\n\n return {\n page,\n pageSize,\n ...(response?.pagination?.total !== undefined ? { total: response.pagination.total } : {}),\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n pagination.setOffset(String(Math.max(next, 0) * pageSize));\n },\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n pagination.setOffset(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== \"\"));\n}\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 params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) 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 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 const includeLocations = new Set(options.includeLocations ?? [\"path\", \"query\", \"header\"]);\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 const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.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 // 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((p) => p[\"x-clicky\"]?.role === \"time-from\");\n const roleRangeEnd = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-to\");\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"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 (hasTimeRange && (param.name === rangeStart?.name || param.name === rangeEnd?.name)) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(lockedValues, param.name);\n if (disabled && hideLocked) continue;\n const value = disabled ? (lockedValues[param.name] ?? \"\") : (values[param.name] ?? \"\");\n const 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 = typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => ({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n\n if (lookupFilter?.type === \"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: lookupOptionsToFieldOptions(lookupFilter),\n onChange: (next) =>\n setValues((current) => ({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\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 (lookupFilter?.type === \"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 (lookupFilter != null && param.in === \"query\") {\n if (lookupFilter.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) => ({ ...current, [param.name]: next.join(\",\") })),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n inputType:\n lookupFilter.type === \"number\"\n ? \"number\"\n : lookupFilter.type === \"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 (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(lockedValues, searchParam.name);\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) => ({ ...current, [searchParam.name]: next }));\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel: lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n if (limitParam && offsetParam) {\n config.pagination = {\n limitParam: limitParam.name,\n offsetParam: offsetParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n offsetValue: values[offsetParam.name] ?? \"\",\n setLimit: (next) => setValues((current) => ({ ...current, [limitParam.name]: next })),\n setOffset: (next) => setValues((current) => ({ ...current, [offsetParam.name]: next })),\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 config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) => ({\n ...current,\n [rangeStart.name]: from,\n [rangeEnd.name]: to,\n })),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n ...(rangeMeta?.timeEnabled !== undefined ? { timeEnabled: rangeMeta.timeEnabled } : {}),\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description ? { fromPlaceholder: rangeStart.description } : {}),\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\nexport function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode> {\n const parsed: Record<string, FilterBarMultiFilterMode> = {};\n for (const item of splitCommaValues(value)) {\n if (item.startsWith(\"!\") && item.length > 1) {\n parsed[item.slice(1)] = \"exclude\";\n } else {\n parsed[item] = \"include\";\n }\n }\n return parsed;\n}\n\nexport function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string {\n return Object.entries(value)\n .flatMap(([key, mode]) => {\n if (mode === \"include\") return [key];\n if (mode === \"exclude\") return [`!${key}`];\n return [];\n })\n .join(\",\");\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\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\nfunction 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\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(node: PlainTextClickyNode | null | undefined): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join(\"\");\n}\n"],"names":["_a"],"mappings":"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"}
|