@flanksource/clicky-ui 0.3.56 → 0.3.58

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.
Files changed (145) hide show
  1. package/dist/components/ErrorWrapper.cjs +15 -4
  2. package/dist/components/ErrorWrapper.cjs.map +1 -1
  3. package/dist/components/ErrorWrapper.d.ts +7 -0
  4. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  5. package/dist/components/ErrorWrapper.js +15 -4
  6. package/dist/components/ErrorWrapper.js.map +1 -1
  7. package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs +6 -3
  8. package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs.map +1 -1
  9. package/dist/data/ai/PromptCatalog/PromptLayerStrip.js +6 -3
  10. package/dist/data/ai/PromptCatalog/PromptLayerStrip.js.map +1 -1
  11. package/dist/data/ai/PromptCatalog/PromptPage.cjs +2 -1
  12. package/dist/data/ai/PromptCatalog/PromptPage.cjs.map +1 -1
  13. package/dist/data/ai/PromptCatalog/PromptPage.d.ts.map +1 -1
  14. package/dist/data/ai/PromptCatalog/PromptPage.js +2 -1
  15. package/dist/data/ai/PromptCatalog/PromptPage.js.map +1 -1
  16. package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs +9 -6
  17. package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs.map +1 -1
  18. package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts.map +1 -1
  19. package/dist/data/ai/PromptCatalog/PromptPageHeader.js +9 -6
  20. package/dist/data/ai/PromptCatalog/PromptPageHeader.js.map +1 -1
  21. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs +3 -3
  22. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs.map +1 -1
  23. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts +2 -1
  24. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts.map +1 -1
  25. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js +3 -3
  26. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js.map +1 -1
  27. package/dist/data/ai/PromptCatalog/prompt-page-model.cjs +4 -3
  28. package/dist/data/ai/PromptCatalog/prompt-page-model.cjs.map +1 -1
  29. package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts +1 -1
  30. package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts.map +1 -1
  31. package/dist/data/ai/PromptCatalog/prompt-page-model.js +4 -3
  32. package/dist/data/ai/PromptCatalog/prompt-page-model.js.map +1 -1
  33. package/dist/data/ai/PromptCatalog/types.d.ts +1 -0
  34. package/dist/data/ai/PromptCatalog/types.d.ts.map +1 -1
  35. package/dist/data/traces/index.d.ts +7 -0
  36. package/dist/data/traces/index.d.ts.map +1 -1
  37. package/dist/data/traces/otel/OperationList.cjs +64 -0
  38. package/dist/data/traces/otel/OperationList.cjs.map +1 -0
  39. package/dist/data/traces/otel/OperationList.d.ts +10 -0
  40. package/dist/data/traces/otel/OperationList.d.ts.map +1 -0
  41. package/dist/data/traces/otel/OperationList.js +64 -0
  42. package/dist/data/traces/otel/OperationList.js.map +1 -0
  43. package/dist/data/traces/otel/OtelTraceDetail.cjs +781 -0
  44. package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -0
  45. package/dist/data/traces/otel/OtelTraceDetail.d.ts +7 -0
  46. package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -0
  47. package/dist/data/traces/otel/OtelTraceDetail.js +781 -0
  48. package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -0
  49. package/dist/data/traces/otel/OtelTraceSearch.cjs +145 -0
  50. package/dist/data/traces/otel/OtelTraceSearch.cjs.map +1 -0
  51. package/dist/data/traces/otel/OtelTraceSearch.d.ts +16 -0
  52. package/dist/data/traces/otel/OtelTraceSearch.d.ts.map +1 -0
  53. package/dist/data/traces/otel/OtelTraceSearch.js +145 -0
  54. package/dist/data/traces/otel/OtelTraceSearch.js.map +1 -0
  55. package/dist/data/traces/otel/OtelTraceTable.cjs +47 -0
  56. package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -0
  57. package/dist/data/traces/otel/OtelTraceTable.d.ts +12 -0
  58. package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -0
  59. package/dist/data/traces/otel/OtelTraceTable.js +47 -0
  60. package/dist/data/traces/otel/OtelTraceTable.js.map +1 -0
  61. package/dist/data/traces/otel/QueryBar.cjs +158 -0
  62. package/dist/data/traces/otel/QueryBar.cjs.map +1 -0
  63. package/dist/data/traces/otel/QueryBar.d.ts +12 -0
  64. package/dist/data/traces/otel/QueryBar.d.ts.map +1 -0
  65. package/dist/data/traces/otel/QueryBar.js +158 -0
  66. package/dist/data/traces/otel/QueryBar.js.map +1 -0
  67. package/dist/data/traces/otel/SpanCards.cjs +264 -0
  68. package/dist/data/traces/otel/SpanCards.cjs.map +1 -0
  69. package/dist/data/traces/otel/SpanCards.d.ts +17 -0
  70. package/dist/data/traces/otel/SpanCards.d.ts.map +1 -0
  71. package/dist/data/traces/otel/SpanCards.js +261 -0
  72. package/dist/data/traces/otel/SpanCards.js.map +1 -0
  73. package/dist/data/traces/otel/SpanCategory.cjs +18 -0
  74. package/dist/data/traces/otel/SpanCategory.cjs.map +1 -0
  75. package/dist/data/traces/otel/SpanCategory.d.ts +7 -0
  76. package/dist/data/traces/otel/SpanCategory.d.ts.map +1 -0
  77. package/dist/data/traces/otel/SpanCategory.js +18 -0
  78. package/dist/data/traces/otel/SpanCategory.js.map +1 -0
  79. package/dist/data/traces/otel/TraceResults.cjs +195 -0
  80. package/dist/data/traces/otel/TraceResults.cjs.map +1 -0
  81. package/dist/data/traces/otel/TraceResults.d.ts +19 -0
  82. package/dist/data/traces/otel/TraceResults.d.ts.map +1 -0
  83. package/dist/data/traces/otel/TraceResults.js +193 -0
  84. package/dist/data/traces/otel/TraceResults.js.map +1 -0
  85. package/dist/data/traces/otel/api.cjs +36 -0
  86. package/dist/data/traces/otel/api.cjs.map +1 -0
  87. package/dist/data/traces/otel/api.d.ts +87 -0
  88. package/dist/data/traces/otel/api.d.ts.map +1 -0
  89. package/dist/data/traces/otel/api.js +33 -0
  90. package/dist/data/traces/otel/api.js.map +1 -0
  91. package/dist/data/traces/otel/fixtures.d.ts +4 -0
  92. package/dist/data/traces/otel/fixtures.d.ts.map +1 -0
  93. package/dist/data/traces/otel/metrics.cjs +7 -0
  94. package/dist/data/traces/otel/metrics.cjs.map +1 -0
  95. package/dist/data/traces/otel/metrics.d.ts +2 -0
  96. package/dist/data/traces/otel/metrics.d.ts.map +1 -0
  97. package/dist/data/traces/otel/metrics.js +7 -0
  98. package/dist/data/traces/otel/metrics.js.map +1 -0
  99. package/dist/data/traces/otel/model.cjs +167 -0
  100. package/dist/data/traces/otel/model.cjs.map +1 -0
  101. package/dist/data/traces/otel/model.d.ts +81 -0
  102. package/dist/data/traces/otel/model.d.ts.map +1 -0
  103. package/dist/data/traces/otel/model.js +154 -0
  104. package/dist/data/traces/otel/model.js.map +1 -0
  105. package/dist/data/traces/otel/query.cjs +90 -0
  106. package/dist/data/traces/otel/query.cjs.map +1 -0
  107. package/dist/data/traces/otel/query.d.ts +20 -0
  108. package/dist/data/traces/otel/query.d.ts.map +1 -0
  109. package/dist/data/traces/otel/query.js +86 -0
  110. package/dist/data/traces/otel/query.js.map +1 -0
  111. package/dist/data/traces/otel/result-model.cjs +25 -0
  112. package/dist/data/traces/otel/result-model.cjs.map +1 -0
  113. package/dist/data/traces/otel/result-model.d.ts +5 -0
  114. package/dist/data/traces/otel/result-model.d.ts.map +1 -0
  115. package/dist/data/traces/otel/result-model.js +24 -0
  116. package/dist/data/traces/otel/result-model.js.map +1 -0
  117. package/dist/data/traces/otel/source.cjs +11 -0
  118. package/dist/data/traces/otel/source.cjs.map +1 -0
  119. package/dist/data/traces/otel/source.d.ts +5 -0
  120. package/dist/data/traces/otel/source.d.ts.map +1 -0
  121. package/dist/data/traces/otel/source.js +10 -0
  122. package/dist/data/traces/otel/source.js.map +1 -0
  123. package/dist/data/traces/otel/span-traces.cjs +39 -0
  124. package/dist/data/traces/otel/span-traces.cjs.map +1 -0
  125. package/dist/data/traces/otel/span-traces.d.ts +3 -0
  126. package/dist/data/traces/otel/span-traces.d.ts.map +1 -0
  127. package/dist/data/traces/otel/span-traces.js +39 -0
  128. package/dist/data/traces/otel/span-traces.js.map +1 -0
  129. package/dist/data/version-info.cjs +3 -3
  130. package/dist/data/version-info.js +3 -3
  131. package/dist/data.cjs +11 -0
  132. package/dist/data.js +6 -1
  133. package/dist/index.cjs +11 -0
  134. package/dist/index.js +6 -1
  135. package/dist/profiles/editor/profileEditorSections.cjs +4 -0
  136. package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
  137. package/dist/profiles/editor/profileEditorSections.d.ts.map +1 -1
  138. package/dist/profiles/editor/profileEditorSections.js +4 -0
  139. package/dist/profiles/editor/profileEditorSections.js.map +1 -1
  140. package/dist/rpc/CommandForm.cjs +1 -1
  141. package/dist/rpc/CommandForm.cjs.map +1 -1
  142. package/dist/rpc/CommandForm.js +1 -1
  143. package/dist/rpc/CommandForm.js.map +1 -1
  144. package/dist/styles.css +1 -1
  145. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"profileEditorSections.cjs","names":["Icon","profileConnectionID","providerTypes","JsonSchemaForm","providerConnectionSchema","ProfileWizardQueryStep","providerOptionsSchema","profileFormExtensions","profileSchemaProjection","mergeProfileProjection"],"sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"sourcesContent":["import { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport type {\n FormLayout,\n LookupFetcher,\n PostExtension,\n PreExtension,\n} from \"../../components/json-schema-form-types\";\nimport { Icon } from \"../../data/Icon\";\nimport type { ReactNode } from \"react\";\nimport {\n mergeProfileProjection,\n providerConnectionSchema,\n profileSchemaProjection,\n providerOptionsSchema,\n providerTypes,\n} from \"./profileEditorModel\";\nimport { profileFormExtensions } from \"../profileApi\";\nimport {\n ProfileWizardQueryStep,\n type ProfileSample,\n} from \"../wizard/profileWizardQueryStep\";\nimport {\n profileConnectionID,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\n\nconst inputClassName =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\";\n\nexport function ProfileGeneralSection({ draft, onChange }: EditorSectionProps) {\n return (\n <SectionCard\n title=\"Profile identity\"\n description=\"Name the profile and choose its default presentation. Renaming updates dependent imports when you save.\"\n >\n <div className=\"grid gap-5 @xl:grid-cols-2\">\n <EditorField label=\"Profile name\" required>\n <input\n value={draft.profile ?? \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, profile: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Namespace\">\n <input\n value={draft.namespace ?? \"\"}\n className={inputClassName}\n placeholder=\"Default namespace\"\n onChange={(event) =>\n onChange({ ...draft, namespace: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Render mode\">\n <select\n value={typeof draft.render === \"string\" ? draft.render : \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, render: event.target.value || undefined })\n }\n >\n <option value=\"\">Table (default)</option>\n <option value=\"table\">Table</option>\n <option value=\"logs\">Logs</option>\n </select>\n </EditorField>\n <EditorField label=\"Icon\">\n <div className=\"flex items-center gap-2\">\n <input\n value={typeof draft.icon === \"string\" ? draft.icon : \"\"}\n className={inputClassName}\n // Empty is the norm: the provider type already supplies a mark.\n // This is for the profile whose subject is not its backend.\n placeholder=\"Provider default\"\n onChange={(event) =>\n onChange({ ...draft, icon: event.target.value || undefined })\n }\n />\n {typeof draft.icon === \"string\" && draft.icon !== \"\" ? (\n // Shows what the name actually resolves to — an unresolvable name\n // renders nothing anywhere, which is invisible without a preview.\n <Icon name={draft.icon} className=\"size-5 shrink-0\" />\n ) : null}\n </div>\n </EditorField>\n </div>\n </SectionCard>\n );\n}\n\nexport function ProfileSourceSection({\n draft,\n discovered,\n sampleStale,\n lookupFetcher,\n onChange,\n onSample,\n}: EditorSectionProps & {\n discovered: ProfileColumn[];\n sampleStale: boolean;\n lookupFetcher?: LookupFetcher;\n onSample: (sample: ProfileSample) => void;\n}) {\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const providerType = draft.provider?.type ?? \"\";\n return (\n <div className=\"grid h-full min-h-0 gap-4\">\n <SectionCard\n title=\"Source\"\n description=\"Select the provider and saved connection. Connection credentials remain server-side.\"\n >\n <div className=\"grid gap-4 @xl:grid-cols-2\">\n <EditorField label=\"Provider type\" required>\n <select\n value={providerType}\n className={inputClassName}\n onChange={(event) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, type: event.target.value },\n })\n }\n >\n <option value=\"\">Choose a provider</option>\n {providerTypes().map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </EditorField>\n <JsonSchemaForm\n idPrefix=\"profile-source-connection\"\n schema={providerConnectionSchema()}\n value={{\n connection: draft.provider?.connection ?? \"\",\n provider: draft.provider ?? {},\n }}\n onChange={(next) => {\n if (typeof next.connection !== \"string\") {\n throw new Error(\"provider.connection must be a string\");\n }\n onChange({\n ...draft,\n provider: { ...draft.provider, connection: next.connection },\n });\n }}\n showPreferencesMenu={false}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n {sampleStale ? (\n <p className=\"mt-4 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3 text-sm text-warning-foreground\">\n Source or query settings changed after the latest sample. You can\n save, but sampling again will verify the current field shape.\n </p>\n ) : null}\n </SectionCard>\n {connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={onChange}\n onSample={onSample}\n />\n ) : (\n <SectionCard\n title=\"Query and provider options\"\n description=\"Inline sources use the provider schema for options while keeping the query workspace explicit.\"\n >\n <EditorField label=\"Query\">\n <textarea\n rows={10}\n value={draft.query ?? \"\"}\n className={`${inputClassName} resize-y font-mono text-xs`}\n onChange={(event) =>\n onChange({ ...draft, query: event.target.value })\n }\n />\n </EditorField>\n <div className=\"mt-5\">\n {/* The provider option schemas carry host widgets of their own —\n secret and workload-url selectors, the structured search builder —\n so this form needs the host's extensions as much as the sections\n built from the profile schema do. */}\n <JsonSchemaForm\n idPrefix=\"profile-provider-options\"\n schema={providerOptionsSchema(providerType)}\n value={draft.provider?.options ?? {}}\n onChange={(options) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, options },\n })\n }\n showPreferencesMenu={false}\n pre={profileFormExtensions().pre}\n post={profileFormExtensions().post}\n />\n </div>\n </SectionCard>\n )}\n </div>\n );\n}\n\nexport function ProfileSchemaSection({\n draft,\n keys,\n title,\n description,\n idPrefix,\n layout,\n lookupFetcher,\n pre,\n post,\n onChange,\n}: EditorSectionProps & {\n keys: string[];\n title: string;\n description: string;\n idPrefix: string;\n // Presentation is the call site's, not this component's — profile schema\n // sections can choose a dense layout or keep the plain stacked defaults.\n layout?: FormLayout;\n // JsonSchemaForm always installs its own lookup provider, so an outer one is\n // shadowed rather than inherited: without this, x-clicky-lookup fields (the\n // imports and reconcile.dest profile pickers) render with no options at all.\n lookupFetcher?: LookupFetcher;\n // Overrides the host's configured extensions for this section only. Passing an\n // empty array is meaningful — it renders the built-in controls — so these are\n // distinguished by being undefined, not by being empty.\n pre?: PreExtension[];\n post?: PostExtension[];\n}) {\n const configured = profileFormExtensions();\n const fullRootPre = (pre ?? configured.pre).map<PreExtension>(\n (extension) => (field, context) =>\n extension(field, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n const fullRootPost = (post ?? configured.post).map<PostExtension>(\n (extension) => (field, nodes, context) =>\n extension(field, nodes, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n return (\n <SectionCard title={title} description={description}>\n <JsonSchemaForm\n idPrefix={idPrefix}\n schema={profileSchemaProjection(keys)}\n value={Object.fromEntries(\n keys.flatMap((key) =>\n Object.prototype.hasOwnProperty.call(draft, key)\n ? [[key, draft[key]]]\n : [],\n ),\n )}\n onChange={(next) => onChange(mergeProfileProjection(draft, keys, next))}\n showPreferencesMenu={false}\n pre={fullRootPre}\n post={fullRootPost}\n {...(layout ? { layout } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </SectionCard>\n );\n}\n\ntype EditorSectionProps = {\n draft: ProfileWizardDraft;\n onChange: (draft: ProfileWizardDraft) => void;\n};\n\nfunction SectionCard({\n title,\n description,\n children,\n}: {\n title: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-xl border bg-card p-5\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"mb-5 mt-1 text-sm text-muted-foreground\">{description}</p>\n {children}\n </section>\n );\n}\n\nfunction EditorField({\n label,\n required,\n children,\n}: {\n label: string;\n required?: boolean;\n children: ReactNode;\n}) {\n return (\n <label className=\"grid gap-1.5 text-sm font-medium\">\n <span>\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </span>\n {children}\n </label>\n );\n}\n"],"mappings":";;;;;;;;AA2BA,IAAM,iBACJ;AAEF,SAAgB,sBAAsB,EAAE,OAAO,YAAgC;CAC7E,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;EACE,OAAM;EACN,aAAY;EAEZ,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,OAAM;KAAe,UAAA;KAChC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MACE,OAAO,MAAM,WAAW;MACxB,WAAW;MACX,WAAW,UACT,SAAS;OAAE,GAAG;OAAO,SAAS,MAAM,OAAO;MAAM,CAAC;KAErD,CAAA;IACU,CAAA;IACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,OAAM;KACjB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MACE,OAAO,MAAM,aAAa;MAC1B,WAAW;MACX,aAAY;MACZ,WAAW,UACT,SAAS;OAAE,GAAG;OAAO,WAAW,MAAM,OAAO;MAAM,CAAC;KAEvD,CAAA;IACU,CAAA;IACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,OAAM;KACjB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MACE,OAAO,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;MACzD,WAAW;MACX,WAAW,UACT,SAAS;OAAE,GAAG;OAAO,QAAQ,MAAM,OAAO,SAAS,KAAA;MAAU,CAAC;MAJlE,UAAA;OAOE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAM;QAAG,UAAA;OAAuB,CAAA;OACxC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAM;QAAQ,UAAA;OAAa,CAAA;OACnC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAM;QAAO,UAAA;OAAY,CAAA;MAC3B;;IACG,CAAA;IACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,OAAM;KACjB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OACE,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;OACrD,WAAW;OAGX,aAAY;OACZ,WAAW,UACT,SAAS;QAAE,GAAG;QAAO,MAAM,MAAM,OAAO,SAAS,KAAA;OAAU,CAAC;MAE/D,CAAA,GACA,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,KAGhD,iBAAA,GAAA,kBAAA,IAAA,CAACA,aAAAA,MAAD;OAAM,MAAM,MAAM;OAAM,WAAU;MAAmB,CAAA,IACnD,IACD;;IACM,CAAA;GACV;;CACM,CAAA;AAEjB;AAEA,SAAgB,qBAAqB,EACnC,OACA,YACA,aACA,eACA,UACA,YAMC;CACD,MAAM,eAAeC,2BAAAA,oBAAoB,MAAM,UAAU,cAAc,EAAE;CACzE,MAAM,eAAe,MAAM,UAAU,QAAQ;CAC7C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,aAAD;GACE,OAAM;GACN,aAAY;GAFd,UAAA,CAIE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,OAAM;KAAgB,UAAA;KACjC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MACE,OAAO;MACP,WAAW;MACX,WAAW,UACT,SAAS;OACP,GAAG;OACH,UAAU;QAAE,GAAG,MAAM;QAAU,MAAM,MAAM,OAAO;OAAM;MAC1D,CAAC;MAPL,UAAA,CAUE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,OAAM;OAAG,UAAA;MAAyB,CAAA,GACzCC,2BAAAA,cAAc,CAAC,CAAC,KAAK,SACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAmB,OAAO;OACvB,UAAA;MACK,GAFK,IAEL,CACT,CACK;;IACG,CAAA,GACb,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,gBAAD;KACE,UAAS;KACT,QAAQC,2BAAAA,yBAAyB;KACjC,OAAO;MACL,YAAY,MAAM,UAAU,cAAc;MAC1C,UAAU,MAAM,YAAY,CAAC;KAC/B;KACA,WAAW,SAAS;MAClB,IAAI,OAAO,KAAK,eAAe,UAC7B,MAAM,IAAI,MAAM,sCAAsC;MAExD,SAAS;OACP,GAAG;OACH,UAAU;QAAE,GAAG,MAAM;QAAU,YAAY,KAAK;OAAW;MAC7D,CAAC;KACH;KACA,qBAAqB;KACrB,GAAK,gBAAgB,EAAE,cAAc,IAAI,CAAC;IAC3C,CAAA,CACE;GACJ,CAAA,GAAA,cACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,WAAU;IAAmG,UAAA;GAG7G,CAAA,IACD,IACO;EACZ,CAAA,GAAA,eACC,iBAAA,GAAA,kBAAA,IAAA,CAACC,+BAAAA,wBAAD;GAEgB;GACP;GACK;GACZ,eAAe;GACL;EACX,GANM,YAMN,IAED,iBAAA,GAAA,kBAAA,KAAA,CAAC,aAAD;GACE,OAAM;GACN,aAAY;GAFd,UAAA,CAIE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAa,OAAM;IACjB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KACE,MAAM;KACN,OAAO,MAAM,SAAS;KACtB,WAAW,GAAG,eAAe;KAC7B,WAAW,UACT,SAAS;MAAE,GAAG;MAAO,OAAO,MAAM,OAAO;KAAM,CAAC;IAEnD,CAAA;GACU,CAAA,GACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAU;IAKb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,uBAAAA,gBAAD;KACE,UAAS;KACT,QAAQG,2BAAAA,sBAAsB,YAAY;KAC1C,OAAO,MAAM,UAAU,WAAW,CAAC;KACnC,WAAW,YACT,SAAS;MACP,GAAG;MACH,UAAU;OAAE,GAAG,MAAM;OAAU;MAAQ;KACzC,CAAC;KAEH,qBAAqB;KACrB,KAAKC,mBAAAA,sBAAsB,CAAC,CAAC;KAC7B,MAAMA,mBAAAA,sBAAsB,CAAC,CAAC;IAC/B,CAAA;GACE,CAAA,CACM;EAEZ,CAAA,CAAA;;AAET;AAEA,SAAgB,qBAAqB,EACnC,OACA,MACA,OACA,aACA,UACA,QACA,eACA,KACA,MACA,YAkBC;CACD,MAAM,aAAaA,mBAAAA,sBAAsB;CACzC,MAAM,eAAe,OAAO,WAAW,IAAA,CAAK,KACzC,eAAe,OAAO,YACrB,UAAU,OAAO;EACf,GAAG;EACH,WAAW;EACX,cAAc;CAChB,CAAC,CACL;CACA,MAAM,gBAAgB,QAAQ,WAAW,KAAA,CAAM,KAC5C,eAAe,OAAO,OAAO,YAC5B,UAAU,OAAO,OAAO;EACtB,GAAG;EACH,WAAW;EACX,cAAc;CAChB,CAAC,CACL;CACA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;EAAoB;EAAoB;EACtC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACJ,uBAAAA,gBAAD;GACY;GACV,QAAQK,2BAAAA,wBAAwB,IAAI;GACpC,OAAO,OAAO,YACZ,KAAK,SAAS,QACZ,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,IAC3C,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,IAClB,CAAC,CACP,CACF;GACA,WAAW,SAAS,SAASC,2BAAAA,uBAAuB,OAAO,MAAM,IAAI,CAAC;GACtE,qBAAqB;GACrB,KAAK;GACL,MAAM;GACN,GAAK,SAAS,EAAE,OAAO,IAAI,CAAC;GAC5B,GAAK,gBAAgB,EAAE,cAAc,IAAI,CAAC;EAC3C,CAAA;CACU,CAAA;AAEjB;AAOA,SAAS,YAAY,EACnB,OACA,aACA,YAKC;CACD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;EAAS,WAAU;EAAnB,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;IAAI,WAAU;IAAyB,UAAA;GAAU,CAAA;GACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,WAAU;IAA2C,UAAA;GAAe,CAAA;GACtE;EACM;;AAEb;AAEA,SAAS,YAAY,EACnB,OACA,UACA,YAKC;CACD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;EAAO,WAAU;EAAjB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CACG,OACA,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GAAmB,UAAA;EAAQ,CAAA,IAAI,IACvD,EAAA,CAAA,GACL,QACI;;AAEX"}
1
+ {"version":3,"file":"profileEditorSections.cjs","names":["Icon","profileConnectionID","providerTypes","JsonSchemaForm","providerConnectionSchema","ProfileWizardQueryStep","providerOptionsSchema","profileFormExtensions","profileSchemaProjection","mergeProfileProjection"],"sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"sourcesContent":["import { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport type {\n FormLayout,\n LookupFetcher,\n PostExtension,\n PreExtension,\n} from \"../../components/json-schema-form-types\";\nimport { Icon } from \"../../data/Icon\";\nimport type { ReactNode } from \"react\";\nimport {\n mergeProfileProjection,\n providerConnectionSchema,\n profileSchemaProjection,\n providerOptionsSchema,\n providerTypes,\n} from \"./profileEditorModel\";\nimport { profileFormExtensions } from \"../profileApi\";\nimport {\n ProfileWizardQueryStep,\n type ProfileSample,\n} from \"../wizard/profileWizardQueryStep\";\nimport {\n profileConnectionID,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\n\nconst inputClassName =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\";\n\nexport function ProfileGeneralSection({ draft, onChange }: EditorSectionProps) {\n return (\n <SectionCard\n title=\"Profile identity\"\n description=\"Name the profile and choose its default presentation. Renaming updates dependent imports when you save.\"\n >\n <div className=\"grid gap-5 @xl:grid-cols-2\">\n <EditorField label=\"Profile name\" required>\n <input\n value={draft.profile ?? \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, profile: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Namespace\">\n <input\n value={draft.namespace ?? \"\"}\n className={inputClassName}\n placeholder=\"Default namespace\"\n onChange={(event) =>\n onChange({ ...draft, namespace: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Render mode\">\n <select\n value={typeof draft.render === \"string\" ? draft.render : \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, render: event.target.value || undefined })\n }\n >\n <option value=\"\">Table (default)</option>\n <option value=\"table\">Table</option>\n <option value=\"logs\">Logs</option>\n <option value=\"traces\">Traces</option>\n </select>\n </EditorField>\n <EditorField label=\"Icon\">\n <div className=\"flex items-center gap-2\">\n <input\n value={typeof draft.icon === \"string\" ? draft.icon : \"\"}\n className={inputClassName}\n // Empty is the norm: the provider type already supplies a mark.\n // This is for the profile whose subject is not its backend.\n placeholder=\"Provider default\"\n onChange={(event) =>\n onChange({ ...draft, icon: event.target.value || undefined })\n }\n />\n {typeof draft.icon === \"string\" && draft.icon !== \"\" ? (\n // Shows what the name actually resolves to — an unresolvable name\n // renders nothing anywhere, which is invisible without a preview.\n <Icon name={draft.icon} className=\"size-5 shrink-0\" />\n ) : null}\n </div>\n </EditorField>\n </div>\n </SectionCard>\n );\n}\n\nexport function ProfileSourceSection({\n draft,\n discovered,\n sampleStale,\n lookupFetcher,\n onChange,\n onSample,\n}: EditorSectionProps & {\n discovered: ProfileColumn[];\n sampleStale: boolean;\n lookupFetcher?: LookupFetcher;\n onSample: (sample: ProfileSample) => void;\n}) {\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const providerType = draft.provider?.type ?? \"\";\n return (\n <div className=\"grid h-full min-h-0 gap-4\">\n <SectionCard\n title=\"Source\"\n description=\"Select the provider and saved connection. Connection credentials remain server-side.\"\n >\n <div className=\"grid gap-4 @xl:grid-cols-2\">\n <EditorField label=\"Provider type\" required>\n <select\n value={providerType}\n className={inputClassName}\n onChange={(event) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, type: event.target.value },\n })\n }\n >\n <option value=\"\">Choose a provider</option>\n {providerTypes().map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </EditorField>\n <JsonSchemaForm\n idPrefix=\"profile-source-connection\"\n schema={providerConnectionSchema()}\n value={{\n connection: draft.provider?.connection ?? \"\",\n provider: draft.provider ?? {},\n }}\n onChange={(next) => {\n if (typeof next.connection !== \"string\") {\n throw new Error(\"provider.connection must be a string\");\n }\n onChange({\n ...draft,\n provider: { ...draft.provider, connection: next.connection },\n });\n }}\n showPreferencesMenu={false}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n {sampleStale ? (\n <p className=\"mt-4 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3 text-sm text-warning-foreground\">\n Source or query settings changed after the latest sample. You can\n save, but sampling again will verify the current field shape.\n </p>\n ) : null}\n </SectionCard>\n {connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={onChange}\n onSample={onSample}\n />\n ) : (\n <SectionCard\n title=\"Query and provider options\"\n description=\"Inline sources use the provider schema for options while keeping the query workspace explicit.\"\n >\n <EditorField label=\"Query\">\n <textarea\n rows={10}\n value={draft.query ?? \"\"}\n className={`${inputClassName} resize-y font-mono text-xs`}\n onChange={(event) =>\n onChange({ ...draft, query: event.target.value })\n }\n />\n </EditorField>\n <div className=\"mt-5\">\n {/* The provider option schemas carry host widgets of their own —\n secret and workload-url selectors, the structured search builder —\n so this form needs the host's extensions as much as the sections\n built from the profile schema do. */}\n <JsonSchemaForm\n idPrefix=\"profile-provider-options\"\n schema={providerOptionsSchema(providerType)}\n value={draft.provider?.options ?? {}}\n onChange={(options) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, options },\n })\n }\n showPreferencesMenu={false}\n pre={profileFormExtensions().pre}\n post={profileFormExtensions().post}\n />\n </div>\n </SectionCard>\n )}\n </div>\n );\n}\n\nexport function ProfileSchemaSection({\n draft,\n keys,\n title,\n description,\n idPrefix,\n layout,\n lookupFetcher,\n pre,\n post,\n onChange,\n}: EditorSectionProps & {\n keys: string[];\n title: string;\n description: string;\n idPrefix: string;\n // Presentation is the call site's, not this component's — profile schema\n // sections can choose a dense layout or keep the plain stacked defaults.\n layout?: FormLayout;\n // JsonSchemaForm always installs its own lookup provider, so an outer one is\n // shadowed rather than inherited: without this, x-clicky-lookup fields (the\n // imports and reconcile.dest profile pickers) render with no options at all.\n lookupFetcher?: LookupFetcher;\n // Overrides the host's configured extensions for this section only. Passing an\n // empty array is meaningful — it renders the built-in controls — so these are\n // distinguished by being undefined, not by being empty.\n pre?: PreExtension[];\n post?: PostExtension[];\n}) {\n const configured = profileFormExtensions();\n const fullRootPre = (pre ?? configured.pre).map<PreExtension>(\n (extension) => (field, context) =>\n extension(field, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n const fullRootPost = (post ?? configured.post).map<PostExtension>(\n (extension) => (field, nodes, context) =>\n extension(field, nodes, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n return (\n <SectionCard title={title} description={description}>\n <JsonSchemaForm\n idPrefix={idPrefix}\n schema={profileSchemaProjection(keys)}\n value={Object.fromEntries(\n keys.flatMap((key) =>\n Object.prototype.hasOwnProperty.call(draft, key)\n ? [[key, draft[key]]]\n : [],\n ),\n )}\n onChange={(next) => onChange(mergeProfileProjection(draft, keys, next))}\n showPreferencesMenu={false}\n pre={fullRootPre}\n post={fullRootPost}\n {...(layout ? { layout } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </SectionCard>\n );\n}\n\ntype EditorSectionProps = {\n draft: ProfileWizardDraft;\n onChange: (draft: ProfileWizardDraft) => void;\n};\n\nfunction SectionCard({\n title,\n description,\n children,\n}: {\n title: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-xl border bg-card p-5\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"mb-5 mt-1 text-sm text-muted-foreground\">{description}</p>\n {children}\n </section>\n );\n}\n\nfunction EditorField({\n label,\n required,\n children,\n}: {\n label: string;\n required?: boolean;\n children: ReactNode;\n}) {\n return (\n <label className=\"grid gap-1.5 text-sm font-medium\">\n <span>\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </span>\n {children}\n </label>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"profileEditorSections.d.ts","sourceRoot":"","sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACb,MAAM,yCAAyC,CAAC;AAWjD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAC;AAKtC,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BA6D5E;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,GAAG;IACtB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C,+BAwGA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,IAAI,EACJ,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,aAAa,EACb,GAAG,EACH,IAAI,EACJ,QAAQ,GACT,EAAE,kBAAkB,GAAG;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IAGjB,MAAM,CAAC,EAAE,UAAU,CAAC;IAIpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAI9B,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;CACxB,+BAuCA;AAED,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC/C,CAAC"}
1
+ {"version":3,"file":"profileEditorSections.d.ts","sourceRoot":"","sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACb,MAAM,yCAAyC,CAAC;AAWjD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAC;AAKtC,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BA8D5E;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,GAAG;IACtB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C,+BAwGA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,IAAI,EACJ,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,aAAa,EACb,GAAG,EACH,IAAI,EACJ,QAAQ,GACT,EAAE,kBAAkB,GAAG;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IAGjB,MAAM,CAAC,EAAE,UAAU,CAAC;IAIpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAI9B,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;CACxB,+BAuCA;AAED,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC/C,CAAC"}
@@ -59,6 +59,10 @@ function ProfileGeneralSection({ draft, onChange }) {
59
59
  /* @__PURE__ */ jsx("option", {
60
60
  value: "logs",
61
61
  children: "Logs"
62
+ }),
63
+ /* @__PURE__ */ jsx("option", {
64
+ value: "traces",
65
+ children: "Traces"
62
66
  })
63
67
  ]
64
68
  })
@@ -1 +1 @@
1
- {"version":3,"file":"profileEditorSections.js","names":[],"sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"sourcesContent":["import { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport type {\n FormLayout,\n LookupFetcher,\n PostExtension,\n PreExtension,\n} from \"../../components/json-schema-form-types\";\nimport { Icon } from \"../../data/Icon\";\nimport type { ReactNode } from \"react\";\nimport {\n mergeProfileProjection,\n providerConnectionSchema,\n profileSchemaProjection,\n providerOptionsSchema,\n providerTypes,\n} from \"./profileEditorModel\";\nimport { profileFormExtensions } from \"../profileApi\";\nimport {\n ProfileWizardQueryStep,\n type ProfileSample,\n} from \"../wizard/profileWizardQueryStep\";\nimport {\n profileConnectionID,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\n\nconst inputClassName =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\";\n\nexport function ProfileGeneralSection({ draft, onChange }: EditorSectionProps) {\n return (\n <SectionCard\n title=\"Profile identity\"\n description=\"Name the profile and choose its default presentation. Renaming updates dependent imports when you save.\"\n >\n <div className=\"grid gap-5 @xl:grid-cols-2\">\n <EditorField label=\"Profile name\" required>\n <input\n value={draft.profile ?? \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, profile: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Namespace\">\n <input\n value={draft.namespace ?? \"\"}\n className={inputClassName}\n placeholder=\"Default namespace\"\n onChange={(event) =>\n onChange({ ...draft, namespace: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Render mode\">\n <select\n value={typeof draft.render === \"string\" ? draft.render : \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, render: event.target.value || undefined })\n }\n >\n <option value=\"\">Table (default)</option>\n <option value=\"table\">Table</option>\n <option value=\"logs\">Logs</option>\n </select>\n </EditorField>\n <EditorField label=\"Icon\">\n <div className=\"flex items-center gap-2\">\n <input\n value={typeof draft.icon === \"string\" ? draft.icon : \"\"}\n className={inputClassName}\n // Empty is the norm: the provider type already supplies a mark.\n // This is for the profile whose subject is not its backend.\n placeholder=\"Provider default\"\n onChange={(event) =>\n onChange({ ...draft, icon: event.target.value || undefined })\n }\n />\n {typeof draft.icon === \"string\" && draft.icon !== \"\" ? (\n // Shows what the name actually resolves to — an unresolvable name\n // renders nothing anywhere, which is invisible without a preview.\n <Icon name={draft.icon} className=\"size-5 shrink-0\" />\n ) : null}\n </div>\n </EditorField>\n </div>\n </SectionCard>\n );\n}\n\nexport function ProfileSourceSection({\n draft,\n discovered,\n sampleStale,\n lookupFetcher,\n onChange,\n onSample,\n}: EditorSectionProps & {\n discovered: ProfileColumn[];\n sampleStale: boolean;\n lookupFetcher?: LookupFetcher;\n onSample: (sample: ProfileSample) => void;\n}) {\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const providerType = draft.provider?.type ?? \"\";\n return (\n <div className=\"grid h-full min-h-0 gap-4\">\n <SectionCard\n title=\"Source\"\n description=\"Select the provider and saved connection. Connection credentials remain server-side.\"\n >\n <div className=\"grid gap-4 @xl:grid-cols-2\">\n <EditorField label=\"Provider type\" required>\n <select\n value={providerType}\n className={inputClassName}\n onChange={(event) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, type: event.target.value },\n })\n }\n >\n <option value=\"\">Choose a provider</option>\n {providerTypes().map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </EditorField>\n <JsonSchemaForm\n idPrefix=\"profile-source-connection\"\n schema={providerConnectionSchema()}\n value={{\n connection: draft.provider?.connection ?? \"\",\n provider: draft.provider ?? {},\n }}\n onChange={(next) => {\n if (typeof next.connection !== \"string\") {\n throw new Error(\"provider.connection must be a string\");\n }\n onChange({\n ...draft,\n provider: { ...draft.provider, connection: next.connection },\n });\n }}\n showPreferencesMenu={false}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n {sampleStale ? (\n <p className=\"mt-4 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3 text-sm text-warning-foreground\">\n Source or query settings changed after the latest sample. You can\n save, but sampling again will verify the current field shape.\n </p>\n ) : null}\n </SectionCard>\n {connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={onChange}\n onSample={onSample}\n />\n ) : (\n <SectionCard\n title=\"Query and provider options\"\n description=\"Inline sources use the provider schema for options while keeping the query workspace explicit.\"\n >\n <EditorField label=\"Query\">\n <textarea\n rows={10}\n value={draft.query ?? \"\"}\n className={`${inputClassName} resize-y font-mono text-xs`}\n onChange={(event) =>\n onChange({ ...draft, query: event.target.value })\n }\n />\n </EditorField>\n <div className=\"mt-5\">\n {/* The provider option schemas carry host widgets of their own —\n secret and workload-url selectors, the structured search builder —\n so this form needs the host's extensions as much as the sections\n built from the profile schema do. */}\n <JsonSchemaForm\n idPrefix=\"profile-provider-options\"\n schema={providerOptionsSchema(providerType)}\n value={draft.provider?.options ?? {}}\n onChange={(options) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, options },\n })\n }\n showPreferencesMenu={false}\n pre={profileFormExtensions().pre}\n post={profileFormExtensions().post}\n />\n </div>\n </SectionCard>\n )}\n </div>\n );\n}\n\nexport function ProfileSchemaSection({\n draft,\n keys,\n title,\n description,\n idPrefix,\n layout,\n lookupFetcher,\n pre,\n post,\n onChange,\n}: EditorSectionProps & {\n keys: string[];\n title: string;\n description: string;\n idPrefix: string;\n // Presentation is the call site's, not this component's — profile schema\n // sections can choose a dense layout or keep the plain stacked defaults.\n layout?: FormLayout;\n // JsonSchemaForm always installs its own lookup provider, so an outer one is\n // shadowed rather than inherited: without this, x-clicky-lookup fields (the\n // imports and reconcile.dest profile pickers) render with no options at all.\n lookupFetcher?: LookupFetcher;\n // Overrides the host's configured extensions for this section only. Passing an\n // empty array is meaningful — it renders the built-in controls — so these are\n // distinguished by being undefined, not by being empty.\n pre?: PreExtension[];\n post?: PostExtension[];\n}) {\n const configured = profileFormExtensions();\n const fullRootPre = (pre ?? configured.pre).map<PreExtension>(\n (extension) => (field, context) =>\n extension(field, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n const fullRootPost = (post ?? configured.post).map<PostExtension>(\n (extension) => (field, nodes, context) =>\n extension(field, nodes, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n return (\n <SectionCard title={title} description={description}>\n <JsonSchemaForm\n idPrefix={idPrefix}\n schema={profileSchemaProjection(keys)}\n value={Object.fromEntries(\n keys.flatMap((key) =>\n Object.prototype.hasOwnProperty.call(draft, key)\n ? [[key, draft[key]]]\n : [],\n ),\n )}\n onChange={(next) => onChange(mergeProfileProjection(draft, keys, next))}\n showPreferencesMenu={false}\n pre={fullRootPre}\n post={fullRootPost}\n {...(layout ? { layout } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </SectionCard>\n );\n}\n\ntype EditorSectionProps = {\n draft: ProfileWizardDraft;\n onChange: (draft: ProfileWizardDraft) => void;\n};\n\nfunction SectionCard({\n title,\n description,\n children,\n}: {\n title: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-xl border bg-card p-5\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"mb-5 mt-1 text-sm text-muted-foreground\">{description}</p>\n {children}\n </section>\n );\n}\n\nfunction EditorField({\n label,\n required,\n children,\n}: {\n label: string;\n required?: boolean;\n children: ReactNode;\n}) {\n return (\n <label className=\"grid gap-1.5 text-sm font-medium\">\n <span>\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </span>\n {children}\n </label>\n );\n}\n"],"mappings":";;;;;;;;AA2BA,IAAM,iBACJ;AAEF,SAAgB,sBAAsB,EAAE,OAAO,YAAgC;CAC7E,OACE,oBAAC,aAAD;EACE,OAAM;EACN,aAAY;EAEZ,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,aAAD;KAAa,OAAM;KAAe,UAAA;KAChC,UAAA,oBAAC,SAAD;MACE,OAAO,MAAM,WAAW;MACxB,WAAW;MACX,WAAW,UACT,SAAS;OAAE,GAAG;OAAO,SAAS,MAAM,OAAO;MAAM,CAAC;KAErD,CAAA;IACU,CAAA;IACb,oBAAC,aAAD;KAAa,OAAM;KACjB,UAAA,oBAAC,SAAD;MACE,OAAO,MAAM,aAAa;MAC1B,WAAW;MACX,aAAY;MACZ,WAAW,UACT,SAAS;OAAE,GAAG;OAAO,WAAW,MAAM,OAAO;MAAM,CAAC;KAEvD,CAAA;IACU,CAAA;IACb,oBAAC,aAAD;KAAa,OAAM;KACjB,UAAA,qBAAC,UAAD;MACE,OAAO,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;MACzD,WAAW;MACX,WAAW,UACT,SAAS;OAAE,GAAG;OAAO,QAAQ,MAAM,OAAO,SAAS,KAAA;MAAU,CAAC;MAJlE,UAAA;OAOE,oBAAC,UAAD;QAAQ,OAAM;QAAG,UAAA;OAAuB,CAAA;OACxC,oBAAC,UAAD;QAAQ,OAAM;QAAQ,UAAA;OAAa,CAAA;OACnC,oBAAC,UAAD;QAAQ,OAAM;QAAO,UAAA;OAAY,CAAA;MAC3B;;IACG,CAAA;IACb,oBAAC,aAAD;KAAa,OAAM;KACjB,UAAA,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,SAAD;OACE,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;OACrD,WAAW;OAGX,aAAY;OACZ,WAAW,UACT,SAAS;QAAE,GAAG;QAAO,MAAM,MAAM,OAAO,SAAS,KAAA;OAAU,CAAC;MAE/D,CAAA,GACA,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,KAGhD,oBAAC,MAAD;OAAM,MAAM,MAAM;OAAM,WAAU;MAAmB,CAAA,IACnD,IACD;;IACM,CAAA;GACV;;CACM,CAAA;AAEjB;AAEA,SAAgB,qBAAqB,EACnC,OACA,YACA,aACA,eACA,UACA,YAMC;CACD,MAAM,eAAe,oBAAoB,MAAM,UAAU,cAAc,EAAE;CACzE,MAAM,eAAe,MAAM,UAAU,QAAQ;CAC7C,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,qBAAC,aAAD;GACE,OAAM;GACN,aAAY;GAFd,UAAA,CAIE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,aAAD;KAAa,OAAM;KAAgB,UAAA;KACjC,UAAA,qBAAC,UAAD;MACE,OAAO;MACP,WAAW;MACX,WAAW,UACT,SAAS;OACP,GAAG;OACH,UAAU;QAAE,GAAG,MAAM;QAAU,MAAM,MAAM,OAAO;OAAM;MAC1D,CAAC;MAPL,UAAA,CAUE,oBAAC,UAAD;OAAQ,OAAM;OAAG,UAAA;MAAyB,CAAA,GACzC,cAAc,CAAC,CAAC,KAAK,SACpB,oBAAC,UAAD;OAAmB,OAAO;OACvB,UAAA;MACK,GAFK,IAEL,CACT,CACK;;IACG,CAAA,GACb,oBAAC,gBAAD;KACE,UAAS;KACT,QAAQ,yBAAyB;KACjC,OAAO;MACL,YAAY,MAAM,UAAU,cAAc;MAC1C,UAAU,MAAM,YAAY,CAAC;KAC/B;KACA,WAAW,SAAS;MAClB,IAAI,OAAO,KAAK,eAAe,UAC7B,MAAM,IAAI,MAAM,sCAAsC;MAExD,SAAS;OACP,GAAG;OACH,UAAU;QAAE,GAAG,MAAM;QAAU,YAAY,KAAK;OAAW;MAC7D,CAAC;KACH;KACA,qBAAqB;KACrB,GAAK,gBAAgB,EAAE,cAAc,IAAI,CAAC;IAC3C,CAAA,CACE;GACJ,CAAA,GAAA,cACC,oBAAC,KAAD;IAAG,WAAU;IAAmG,UAAA;GAG7G,CAAA,IACD,IACO;EACZ,CAAA,GAAA,eACC,oBAAC,wBAAD;GAEgB;GACP;GACK;GACZ,eAAe;GACL;EACX,GANM,YAMN,IAED,qBAAC,aAAD;GACE,OAAM;GACN,aAAY;GAFd,UAAA,CAIE,oBAAC,aAAD;IAAa,OAAM;IACjB,UAAA,oBAAC,YAAD;KACE,MAAM;KACN,OAAO,MAAM,SAAS;KACtB,WAAW,GAAG,eAAe;KAC7B,WAAW,UACT,SAAS;MAAE,GAAG;MAAO,OAAO,MAAM,OAAO;KAAM,CAAC;IAEnD,CAAA;GACU,CAAA,GACb,oBAAC,OAAD;IAAK,WAAU;IAKb,UAAA,oBAAC,gBAAD;KACE,UAAS;KACT,QAAQ,sBAAsB,YAAY;KAC1C,OAAO,MAAM,UAAU,WAAW,CAAC;KACnC,WAAW,YACT,SAAS;MACP,GAAG;MACH,UAAU;OAAE,GAAG,MAAM;OAAU;MAAQ;KACzC,CAAC;KAEH,qBAAqB;KACrB,KAAK,sBAAsB,CAAC,CAAC;KAC7B,MAAM,sBAAsB,CAAC,CAAC;IAC/B,CAAA;GACE,CAAA,CACM;EAEZ,CAAA,CAAA;;AAET;AAEA,SAAgB,qBAAqB,EACnC,OACA,MACA,OACA,aACA,UACA,QACA,eACA,KACA,MACA,YAkBC;CACD,MAAM,aAAa,sBAAsB;CACzC,MAAM,eAAe,OAAO,WAAW,IAAA,CAAK,KACzC,eAAe,OAAO,YACrB,UAAU,OAAO;EACf,GAAG;EACH,WAAW;EACX,cAAc;CAChB,CAAC,CACL;CACA,MAAM,gBAAgB,QAAQ,WAAW,KAAA,CAAM,KAC5C,eAAe,OAAO,OAAO,YAC5B,UAAU,OAAO,OAAO;EACtB,GAAG;EACH,WAAW;EACX,cAAc;CAChB,CAAC,CACL;CACA,OACE,oBAAC,aAAD;EAAoB;EAAoB;EACtC,UAAA,oBAAC,gBAAD;GACY;GACV,QAAQ,wBAAwB,IAAI;GACpC,OAAO,OAAO,YACZ,KAAK,SAAS,QACZ,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,IAC3C,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,IAClB,CAAC,CACP,CACF;GACA,WAAW,SAAS,SAAS,uBAAuB,OAAO,MAAM,IAAI,CAAC;GACtE,qBAAqB;GACrB,KAAK;GACL,MAAM;GACN,GAAK,SAAS,EAAE,OAAO,IAAI,CAAC;GAC5B,GAAK,gBAAgB,EAAE,cAAc,IAAI,CAAC;EAC3C,CAAA;CACU,CAAA;AAEjB;AAOA,SAAS,YAAY,EACnB,OACA,aACA,YAKC;CACD,OACE,qBAAC,WAAD;EAAS,WAAU;EAAnB,UAAA;GACE,oBAAC,MAAD;IAAI,WAAU;IAAyB,UAAA;GAAU,CAAA;GACjD,oBAAC,KAAD;IAAG,WAAU;IAA2C,UAAA;GAAe,CAAA;GACtE;EACM;;AAEb;AAEA,SAAS,YAAY,EACnB,OACA,UACA,YAKC;CACD,OACE,qBAAC,SAAD;EAAO,WAAU;EAAjB,UAAA,CACE,qBAAC,QAAD,EAAA,UAAA,CACG,OACA,WAAW,oBAAC,QAAD;GAAM,WAAU;GAAmB,UAAA;EAAQ,CAAA,IAAI,IACvD,EAAA,CAAA,GACL,QACI;;AAEX"}
1
+ {"version":3,"file":"profileEditorSections.js","names":[],"sources":["../../../src/profiles/editor/profileEditorSections.tsx"],"sourcesContent":["import { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport type {\n FormLayout,\n LookupFetcher,\n PostExtension,\n PreExtension,\n} from \"../../components/json-schema-form-types\";\nimport { Icon } from \"../../data/Icon\";\nimport type { ReactNode } from \"react\";\nimport {\n mergeProfileProjection,\n providerConnectionSchema,\n profileSchemaProjection,\n providerOptionsSchema,\n providerTypes,\n} from \"./profileEditorModel\";\nimport { profileFormExtensions } from \"../profileApi\";\nimport {\n ProfileWizardQueryStep,\n type ProfileSample,\n} from \"../wizard/profileWizardQueryStep\";\nimport {\n profileConnectionID,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\n\nconst inputClassName =\n \"w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\";\n\nexport function ProfileGeneralSection({ draft, onChange }: EditorSectionProps) {\n return (\n <SectionCard\n title=\"Profile identity\"\n description=\"Name the profile and choose its default presentation. Renaming updates dependent imports when you save.\"\n >\n <div className=\"grid gap-5 @xl:grid-cols-2\">\n <EditorField label=\"Profile name\" required>\n <input\n value={draft.profile ?? \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, profile: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Namespace\">\n <input\n value={draft.namespace ?? \"\"}\n className={inputClassName}\n placeholder=\"Default namespace\"\n onChange={(event) =>\n onChange({ ...draft, namespace: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Render mode\">\n <select\n value={typeof draft.render === \"string\" ? draft.render : \"\"}\n className={inputClassName}\n onChange={(event) =>\n onChange({ ...draft, render: event.target.value || undefined })\n }\n >\n <option value=\"\">Table (default)</option>\n <option value=\"table\">Table</option>\n <option value=\"logs\">Logs</option>\n <option value=\"traces\">Traces</option>\n </select>\n </EditorField>\n <EditorField label=\"Icon\">\n <div className=\"flex items-center gap-2\">\n <input\n value={typeof draft.icon === \"string\" ? draft.icon : \"\"}\n className={inputClassName}\n // Empty is the norm: the provider type already supplies a mark.\n // This is for the profile whose subject is not its backend.\n placeholder=\"Provider default\"\n onChange={(event) =>\n onChange({ ...draft, icon: event.target.value || undefined })\n }\n />\n {typeof draft.icon === \"string\" && draft.icon !== \"\" ? (\n // Shows what the name actually resolves to — an unresolvable name\n // renders nothing anywhere, which is invisible without a preview.\n <Icon name={draft.icon} className=\"size-5 shrink-0\" />\n ) : null}\n </div>\n </EditorField>\n </div>\n </SectionCard>\n );\n}\n\nexport function ProfileSourceSection({\n draft,\n discovered,\n sampleStale,\n lookupFetcher,\n onChange,\n onSample,\n}: EditorSectionProps & {\n discovered: ProfileColumn[];\n sampleStale: boolean;\n lookupFetcher?: LookupFetcher;\n onSample: (sample: ProfileSample) => void;\n}) {\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const providerType = draft.provider?.type ?? \"\";\n return (\n <div className=\"grid h-full min-h-0 gap-4\">\n <SectionCard\n title=\"Source\"\n description=\"Select the provider and saved connection. Connection credentials remain server-side.\"\n >\n <div className=\"grid gap-4 @xl:grid-cols-2\">\n <EditorField label=\"Provider type\" required>\n <select\n value={providerType}\n className={inputClassName}\n onChange={(event) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, type: event.target.value },\n })\n }\n >\n <option value=\"\">Choose a provider</option>\n {providerTypes().map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n </EditorField>\n <JsonSchemaForm\n idPrefix=\"profile-source-connection\"\n schema={providerConnectionSchema()}\n value={{\n connection: draft.provider?.connection ?? \"\",\n provider: draft.provider ?? {},\n }}\n onChange={(next) => {\n if (typeof next.connection !== \"string\") {\n throw new Error(\"provider.connection must be a string\");\n }\n onChange({\n ...draft,\n provider: { ...draft.provider, connection: next.connection },\n });\n }}\n showPreferencesMenu={false}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n {sampleStale ? (\n <p className=\"mt-4 rounded-lg border border-warning/40 bg-warning/10 px-4 py-3 text-sm text-warning-foreground\">\n Source or query settings changed after the latest sample. You can\n save, but sampling again will verify the current field shape.\n </p>\n ) : null}\n </SectionCard>\n {connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={onChange}\n onSample={onSample}\n />\n ) : (\n <SectionCard\n title=\"Query and provider options\"\n description=\"Inline sources use the provider schema for options while keeping the query workspace explicit.\"\n >\n <EditorField label=\"Query\">\n <textarea\n rows={10}\n value={draft.query ?? \"\"}\n className={`${inputClassName} resize-y font-mono text-xs`}\n onChange={(event) =>\n onChange({ ...draft, query: event.target.value })\n }\n />\n </EditorField>\n <div className=\"mt-5\">\n {/* The provider option schemas carry host widgets of their own —\n secret and workload-url selectors, the structured search builder —\n so this form needs the host's extensions as much as the sections\n built from the profile schema do. */}\n <JsonSchemaForm\n idPrefix=\"profile-provider-options\"\n schema={providerOptionsSchema(providerType)}\n value={draft.provider?.options ?? {}}\n onChange={(options) =>\n onChange({\n ...draft,\n provider: { ...draft.provider, options },\n })\n }\n showPreferencesMenu={false}\n pre={profileFormExtensions().pre}\n post={profileFormExtensions().post}\n />\n </div>\n </SectionCard>\n )}\n </div>\n );\n}\n\nexport function ProfileSchemaSection({\n draft,\n keys,\n title,\n description,\n idPrefix,\n layout,\n lookupFetcher,\n pre,\n post,\n onChange,\n}: EditorSectionProps & {\n keys: string[];\n title: string;\n description: string;\n idPrefix: string;\n // Presentation is the call site's, not this component's — profile schema\n // sections can choose a dense layout or keep the plain stacked defaults.\n layout?: FormLayout;\n // JsonSchemaForm always installs its own lookup provider, so an outer one is\n // shadowed rather than inherited: without this, x-clicky-lookup fields (the\n // imports and reconcile.dest profile pickers) render with no options at all.\n lookupFetcher?: LookupFetcher;\n // Overrides the host's configured extensions for this section only. Passing an\n // empty array is meaningful — it renders the built-in controls — so these are\n // distinguished by being undefined, not by being empty.\n pre?: PreExtension[];\n post?: PostExtension[];\n}) {\n const configured = profileFormExtensions();\n const fullRootPre = (pre ?? configured.pre).map<PreExtension>(\n (extension) => (field, context) =>\n extension(field, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n const fullRootPost = (post ?? configured.post).map<PostExtension>(\n (extension) => (field, nodes, context) =>\n extension(field, nodes, {\n ...context,\n rootValue: draft,\n onRootChange: onChange,\n }),\n );\n return (\n <SectionCard title={title} description={description}>\n <JsonSchemaForm\n idPrefix={idPrefix}\n schema={profileSchemaProjection(keys)}\n value={Object.fromEntries(\n keys.flatMap((key) =>\n Object.prototype.hasOwnProperty.call(draft, key)\n ? [[key, draft[key]]]\n : [],\n ),\n )}\n onChange={(next) => onChange(mergeProfileProjection(draft, keys, next))}\n showPreferencesMenu={false}\n pre={fullRootPre}\n post={fullRootPost}\n {...(layout ? { layout } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </SectionCard>\n );\n}\n\ntype EditorSectionProps = {\n draft: ProfileWizardDraft;\n onChange: (draft: ProfileWizardDraft) => void;\n};\n\nfunction SectionCard({\n title,\n description,\n children,\n}: {\n title: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-xl border bg-card p-5\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"mb-5 mt-1 text-sm text-muted-foreground\">{description}</p>\n {children}\n </section>\n );\n}\n\nfunction EditorField({\n label,\n required,\n children,\n}: {\n label: string;\n required?: boolean;\n children: ReactNode;\n}) {\n return (\n <label className=\"grid gap-1.5 text-sm font-medium\">\n <span>\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </span>\n {children}\n </label>\n );\n}\n"],"mappings":"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"}
@@ -51,7 +51,7 @@ function CommandForm({ parameters, onExecute, isPending, method: _method, path,
51
51
  })
52
52
  }, param.name))
53
53
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
54
- className: inlineLayout ? "sticky bottom-0 z-10 -mx-2 flex justify-end border-t border-border bg-background/95 px-2 py-3 backdrop-blur-sm" : "flex justify-end",
54
+ className: inlineLayout ? "sticky bottom-0 z-10 flex justify-end border-t border-border bg-background/95 py-3 backdrop-blur-sm" : "flex justify-end",
55
55
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
56
56
  type: "submit",
57
57
  disabled: isPending,
@@ -1 +1 @@
1
- {"version":3,"file":"CommandForm.cjs","names":["useReducer","normalizeParameters","submitValue","packParameterValues","Button","parameterPlaceholder","Icon","UiClose","pathParamNames"],"sources":["../../src/rpc/CommandForm.tsx"],"sourcesContent":["import { useReducer, type FormEvent, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiClose } from \"../icons\";\nimport { parameterPlaceholder, type OpenAPIParameter, type OperationRequestValues } from \"./types\";\nimport { normalizeParameters, pathParamNames, submitValue } from \"./command-form-utils\";\nimport { packParameterValues, type ParameterValues } from \"./formMetadata\";\n\nexport type CommandFormSubmission = {\n values: ParameterValues;\n request: OperationRequestValues;\n headers: Record<string, string>;\n};\n\nexport type CommandFormProps = {\n parameters: OpenAPIParameter[];\n onExecute: (submission: CommandFormSubmission) => void;\n isPending: boolean;\n method: string;\n path: string;\n accept: string;\n initialValues?: Record<string, string>;\n};\n\ntype FormState = Record<string, string>;\ntype FormAction = { name: string; value: string };\n\nfunction formReducer(state: FormState, action: FormAction): FormState {\n return { ...state, [action.name]: action.value };\n}\n\nexport function CommandForm({\n parameters,\n onExecute,\n isPending,\n method: _method,\n path,\n accept,\n initialValues,\n}: CommandFormProps) {\n const [values, dispatch] = useReducer(\n formReducer,\n { parameters, path, initialValues },\n ({ parameters: params, path: formPath, initialValues: overrides }) =>\n buildInitialState(normalizeParameters(params, formPath), formPath, overrides),\n );\n\n const formParameters = normalizeParameters(parameters, path);\n const visibleParams = formParameters.filter((p) => !(p.in === \"path\" && initialValues?.[p.name]));\n const inlineLayout = visibleParams.length >= INLINE_LAYOUT_THRESHOLD;\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n const submittedValues: ParameterValues = {};\n for (const param of formParameters) {\n const value = submitValue(param, values[param.name]);\n if (value == null) continue;\n submittedValues[param.name] = value;\n }\n onExecute({\n values: submittedValues,\n request: packParameterValues(submittedValues, formParameters),\n headers: { Accept: accept },\n });\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {visibleParams.length > 0 && (\n <div className={inlineLayout ? \"grid gap-2\" : \"grid gap-4\"}>\n {visibleParams.map((param) => (\n <ParameterField\n key={param.name}\n param={param}\n value={values[param.name] || \"\"}\n inline={inlineLayout}\n onChange={(value) => dispatch({ name: param.name, value })}\n />\n ))}\n </div>\n )}\n\n <div\n className={\n inlineLayout\n ? \"sticky bottom-0 z-10 -mx-2 flex justify-end border-t border-border bg-background/95 px-2 py-3 backdrop-blur-sm\"\n : \"flex justify-end\"\n }\n >\n <Button type=\"submit\" disabled={isPending}>\n {isPending ? \"Executing...\" : \"Execute\"}\n </Button>\n </div>\n </form>\n );\n}\n\nconst INLINE_LAYOUT_THRESHOLD = 6;\n\nfunction ParameterField({\n param,\n value,\n inline,\n onChange,\n}: {\n param: OpenAPIParameter;\n value: string;\n inline: boolean;\n onChange: (value: string) => void;\n}) {\n const schema = param.schema;\n const fieldId = `param-${param.name}`;\n\n if (isMultiValueParam(param)) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <TagInput\n id={fieldId}\n value={value}\n placeholder={parameterPlaceholder(param) || param.name}\n onChange={onChange}\n />\n </FieldWrapper>\n );\n }\n\n if (schema?.enum) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <select\n id={fieldId}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select {param.name}</option>\n {schema.enum.map((v) => (\n <option key={String(v)} value={String(v)}>\n {String(v)}\n </option>\n ))}\n </select>\n </FieldWrapper>\n );\n }\n\n if (schema?.type === \"boolean\") {\n const checkbox = (\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n checked={value === \"true\"}\n onChange={(event) => onChange(event.target.checked ? \"true\" : \"false\")}\n />\n );\n if (inline) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline>\n <div className=\"flex h-9 items-center\">{checkbox}</div>\n </FieldWrapper>\n );\n }\n return (\n <div className=\"flex items-center gap-2\">\n {checkbox}\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n {param.description && (\n <span className=\"text-xs text-muted-foreground\">{param.description}</span>\n )}\n </div>\n );\n }\n\n if (isDateParam(param)) {\n const dateTime = schema?.format === \"date-time\";\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <div className=\"flex gap-2\">\n <input\n id={fieldId}\n type={dateTime ? \"datetime-local\" : \"date\"}\n value={dateInputValue(value, dateTime)}\n className={inputClassName}\n onChange={(event) => onChange(dateOutputValue(event.target.value, dateTime))}\n />\n {value && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Clear ${param.name}`}\n onClick={() => onChange(\"\")}\n >\n <Icon icon={UiClose} />\n </Button>\n )}\n </div>\n </FieldWrapper>\n );\n }\n\n const inputType = schema?.type === \"integer\" || schema?.type === \"number\" ? \"number\" : \"text\";\n\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <input\n id={fieldId}\n type={inputType}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n placeholder={\n schema?.default != null\n ? String(schema.default)\n : parameterPlaceholder(param) || param.name\n }\n />\n </FieldWrapper>\n );\n}\n\nfunction TagInput({\n id,\n value,\n placeholder,\n onChange,\n}: {\n id: string;\n value: string;\n placeholder: string;\n onChange: (value: string) => void;\n}) {\n const tags = parseTags(value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n onChange(serializeTags([...tags, ...next]));\n input.value = \"\";\n }\n\n function remove(index: number) {\n onChange(serializeTags(tags.filter((_, i) => i !== index)));\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n const input = event.currentTarget;\n if (event.key === \"Enter\" || event.key === \",\") {\n event.preventDefault();\n commit(input.value, input);\n return;\n }\n if (event.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n remove(tags.length - 1);\n }\n }\n\n return (\n <div className=\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\">\n {tags.map((tag, index) => (\n <span\n key={`${tag}-${index}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => remove(index)}\n >\n <Icon icon={UiClose} />\n </button>\n </span>\n ))}\n <input\n id={id}\n className=\"min-w-0 flex-1 basis-32 bg-transparent px-1 py-1 text-sm outline-none\"\n placeholder={tags.length === 0 ? placeholder : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(event) => commit(event.currentTarget.value, event.currentTarget)}\n />\n </div>\n );\n}\n\nfunction FieldWrapper({\n param,\n fieldId,\n inline,\n children,\n}: {\n param: OpenAPIParameter;\n fieldId: string;\n inline?: boolean;\n children: ReactNode;\n}) {\n const label = (\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n );\n\n if (inline) {\n return (\n <div className=\"grid grid-cols-[10rem_1fr] items-start gap-x-3 gap-y-0.5\">\n <div className=\"flex h-9 items-center\">{label}</div>\n <div className=\"min-w-0\">{children}</div>\n {param.description && (\n <p className=\"col-start-2 text-xs text-muted-foreground\">{param.description}</p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-1.5\">\n {label}\n {children}\n {param.description && <p className=\"text-xs text-muted-foreground\">{param.description}</p>}\n </div>\n );\n}\n\nfunction buildInitialState(\n parameters: OpenAPIParameter[],\n path: string,\n overrides?: Record<string, string>,\n): FormState {\n const state: FormState = {};\n for (const p of parameters) {\n state[p.name] = initialParamValue(p, overrides?.[p.name]);\n }\n for (const name of pathParamNames(path)) {\n if (state[name] == null) {\n state[name] = overrides?.[name] ?? \"\";\n }\n }\n return state;\n}\n\nfunction initialParamValue(param: OpenAPIParameter, override: string | undefined): string {\n if (override != null) return sanitizeInitialValue(param, override);\n const value = param.schema?.default;\n if (value == null) return \"\";\n return sanitizeInitialValue(param, String(value));\n}\n\nfunction sanitizeInitialValue(param: OpenAPIParameter, value: string): string {\n const trimmed = value.trim();\n if (trimmed === \"[]\" || trimmed === \"null\") return \"\";\n if (isDateParam(param) && isZeroDate(trimmed)) return \"\";\n return value;\n}\n\nfunction isMultiValueParam(param: OpenAPIParameter): boolean {\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return (\n param.schema?.type === \"array\" ||\n String(param.schema?.default ?? \"\") === \"[]\" ||\n text.includes(\"repeatable\")\n );\n}\n\nfunction parseTags(value: string): string[] {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited tags below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction serializeTags(tags: string[]): string {\n return tags.join(\",\");\n}\n\nfunction isDateParam(param: OpenAPIParameter): boolean {\n const format = param.schema?.format?.toLowerCase();\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return format === \"date\" || format === \"date-time\" || text.includes(\"date\");\n}\n\nfunction isZeroDate(value: string): boolean {\n return value.startsWith(\"0001-01-01\") || value === \"0001-01-01\";\n}\n\nfunction dateInputValue(value: string, dateTime: boolean): string {\n if (!value || value.startsWith(\"0001-01-01\")) return \"\";\n if (!dateTime) return value.slice(0, 10);\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value.slice(0, 16);\n const offset = parsed.getTimezoneOffset() * 60_000;\n return new Date(parsed.getTime() - offset).toISOString().slice(0, 16);\n}\n\nfunction dateOutputValue(value: string, dateTime: boolean): string {\n if (!value) return \"\";\n if (!dateTime) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value;\n return parsed.toISOString();\n}\n\nconst inputClassName =\n \"h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-placeholder disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"CommandForm.cjs","names":["useReducer","normalizeParameters","submitValue","packParameterValues","Button","parameterPlaceholder","Icon","UiClose","pathParamNames"],"sources":["../../src/rpc/CommandForm.tsx"],"sourcesContent":["import { useReducer, type FormEvent, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiClose } from \"../icons\";\nimport { parameterPlaceholder, type OpenAPIParameter, type OperationRequestValues } from \"./types\";\nimport { normalizeParameters, pathParamNames, submitValue } from \"./command-form-utils\";\nimport { packParameterValues, type ParameterValues } from \"./formMetadata\";\n\nexport type CommandFormSubmission = {\n values: ParameterValues;\n request: OperationRequestValues;\n headers: Record<string, string>;\n};\n\nexport type CommandFormProps = {\n parameters: OpenAPIParameter[];\n onExecute: (submission: CommandFormSubmission) => void;\n isPending: boolean;\n method: string;\n path: string;\n accept: string;\n initialValues?: Record<string, string>;\n};\n\ntype FormState = Record<string, string>;\ntype FormAction = { name: string; value: string };\n\nfunction formReducer(state: FormState, action: FormAction): FormState {\n return { ...state, [action.name]: action.value };\n}\n\nexport function CommandForm({\n parameters,\n onExecute,\n isPending,\n method: _method,\n path,\n accept,\n initialValues,\n}: CommandFormProps) {\n const [values, dispatch] = useReducer(\n formReducer,\n { parameters, path, initialValues },\n ({ parameters: params, path: formPath, initialValues: overrides }) =>\n buildInitialState(normalizeParameters(params, formPath), formPath, overrides),\n );\n\n const formParameters = normalizeParameters(parameters, path);\n const visibleParams = formParameters.filter((p) => !(p.in === \"path\" && initialValues?.[p.name]));\n const inlineLayout = visibleParams.length >= INLINE_LAYOUT_THRESHOLD;\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n const submittedValues: ParameterValues = {};\n for (const param of formParameters) {\n const value = submitValue(param, values[param.name]);\n if (value == null) continue;\n submittedValues[param.name] = value;\n }\n onExecute({\n values: submittedValues,\n request: packParameterValues(submittedValues, formParameters),\n headers: { Accept: accept },\n });\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {visibleParams.length > 0 && (\n <div className={inlineLayout ? \"grid gap-2\" : \"grid gap-4\"}>\n {visibleParams.map((param) => (\n <ParameterField\n key={param.name}\n param={param}\n value={values[param.name] || \"\"}\n inline={inlineLayout}\n onChange={(value) => dispatch({ name: param.name, value })}\n />\n ))}\n </div>\n )}\n\n <div\n className={\n inlineLayout\n ? \"sticky bottom-0 z-10 flex justify-end border-t border-border bg-background/95 py-3 backdrop-blur-sm\"\n : \"flex justify-end\"\n }\n >\n <Button type=\"submit\" disabled={isPending}>\n {isPending ? \"Executing...\" : \"Execute\"}\n </Button>\n </div>\n </form>\n );\n}\n\nconst INLINE_LAYOUT_THRESHOLD = 6;\n\nfunction ParameterField({\n param,\n value,\n inline,\n onChange,\n}: {\n param: OpenAPIParameter;\n value: string;\n inline: boolean;\n onChange: (value: string) => void;\n}) {\n const schema = param.schema;\n const fieldId = `param-${param.name}`;\n\n if (isMultiValueParam(param)) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <TagInput\n id={fieldId}\n value={value}\n placeholder={parameterPlaceholder(param) || param.name}\n onChange={onChange}\n />\n </FieldWrapper>\n );\n }\n\n if (schema?.enum) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <select\n id={fieldId}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select {param.name}</option>\n {schema.enum.map((v) => (\n <option key={String(v)} value={String(v)}>\n {String(v)}\n </option>\n ))}\n </select>\n </FieldWrapper>\n );\n }\n\n if (schema?.type === \"boolean\") {\n const checkbox = (\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n checked={value === \"true\"}\n onChange={(event) => onChange(event.target.checked ? \"true\" : \"false\")}\n />\n );\n if (inline) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline>\n <div className=\"flex h-9 items-center\">{checkbox}</div>\n </FieldWrapper>\n );\n }\n return (\n <div className=\"flex items-center gap-2\">\n {checkbox}\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n {param.description && (\n <span className=\"text-xs text-muted-foreground\">{param.description}</span>\n )}\n </div>\n );\n }\n\n if (isDateParam(param)) {\n const dateTime = schema?.format === \"date-time\";\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <div className=\"flex gap-2\">\n <input\n id={fieldId}\n type={dateTime ? \"datetime-local\" : \"date\"}\n value={dateInputValue(value, dateTime)}\n className={inputClassName}\n onChange={(event) => onChange(dateOutputValue(event.target.value, dateTime))}\n />\n {value && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Clear ${param.name}`}\n onClick={() => onChange(\"\")}\n >\n <Icon icon={UiClose} />\n </Button>\n )}\n </div>\n </FieldWrapper>\n );\n }\n\n const inputType = schema?.type === \"integer\" || schema?.type === \"number\" ? \"number\" : \"text\";\n\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <input\n id={fieldId}\n type={inputType}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n placeholder={\n schema?.default != null\n ? String(schema.default)\n : parameterPlaceholder(param) || param.name\n }\n />\n </FieldWrapper>\n );\n}\n\nfunction TagInput({\n id,\n value,\n placeholder,\n onChange,\n}: {\n id: string;\n value: string;\n placeholder: string;\n onChange: (value: string) => void;\n}) {\n const tags = parseTags(value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n onChange(serializeTags([...tags, ...next]));\n input.value = \"\";\n }\n\n function remove(index: number) {\n onChange(serializeTags(tags.filter((_, i) => i !== index)));\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n const input = event.currentTarget;\n if (event.key === \"Enter\" || event.key === \",\") {\n event.preventDefault();\n commit(input.value, input);\n return;\n }\n if (event.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n remove(tags.length - 1);\n }\n }\n\n return (\n <div className=\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\">\n {tags.map((tag, index) => (\n <span\n key={`${tag}-${index}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => remove(index)}\n >\n <Icon icon={UiClose} />\n </button>\n </span>\n ))}\n <input\n id={id}\n className=\"min-w-0 flex-1 basis-32 bg-transparent px-1 py-1 text-sm outline-none\"\n placeholder={tags.length === 0 ? placeholder : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(event) => commit(event.currentTarget.value, event.currentTarget)}\n />\n </div>\n );\n}\n\nfunction FieldWrapper({\n param,\n fieldId,\n inline,\n children,\n}: {\n param: OpenAPIParameter;\n fieldId: string;\n inline?: boolean;\n children: ReactNode;\n}) {\n const label = (\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n );\n\n if (inline) {\n return (\n <div className=\"grid grid-cols-[10rem_1fr] items-start gap-x-3 gap-y-0.5\">\n <div className=\"flex h-9 items-center\">{label}</div>\n <div className=\"min-w-0\">{children}</div>\n {param.description && (\n <p className=\"col-start-2 text-xs text-muted-foreground\">{param.description}</p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-1.5\">\n {label}\n {children}\n {param.description && <p className=\"text-xs text-muted-foreground\">{param.description}</p>}\n </div>\n );\n}\n\nfunction buildInitialState(\n parameters: OpenAPIParameter[],\n path: string,\n overrides?: Record<string, string>,\n): FormState {\n const state: FormState = {};\n for (const p of parameters) {\n state[p.name] = initialParamValue(p, overrides?.[p.name]);\n }\n for (const name of pathParamNames(path)) {\n if (state[name] == null) {\n state[name] = overrides?.[name] ?? \"\";\n }\n }\n return state;\n}\n\nfunction initialParamValue(param: OpenAPIParameter, override: string | undefined): string {\n if (override != null) return sanitizeInitialValue(param, override);\n const value = param.schema?.default;\n if (value == null) return \"\";\n return sanitizeInitialValue(param, String(value));\n}\n\nfunction sanitizeInitialValue(param: OpenAPIParameter, value: string): string {\n const trimmed = value.trim();\n if (trimmed === \"[]\" || trimmed === \"null\") return \"\";\n if (isDateParam(param) && isZeroDate(trimmed)) return \"\";\n return value;\n}\n\nfunction isMultiValueParam(param: OpenAPIParameter): boolean {\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return (\n param.schema?.type === \"array\" ||\n String(param.schema?.default ?? \"\") === \"[]\" ||\n text.includes(\"repeatable\")\n );\n}\n\nfunction parseTags(value: string): string[] {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited tags below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction serializeTags(tags: string[]): string {\n return tags.join(\",\");\n}\n\nfunction isDateParam(param: OpenAPIParameter): boolean {\n const format = param.schema?.format?.toLowerCase();\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return format === \"date\" || format === \"date-time\" || text.includes(\"date\");\n}\n\nfunction isZeroDate(value: string): boolean {\n return value.startsWith(\"0001-01-01\") || value === \"0001-01-01\";\n}\n\nfunction dateInputValue(value: string, dateTime: boolean): string {\n if (!value || value.startsWith(\"0001-01-01\")) return \"\";\n if (!dateTime) return value.slice(0, 10);\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value.slice(0, 16);\n const offset = parsed.getTimezoneOffset() * 60_000;\n return new Date(parsed.getTime() - offset).toISOString().slice(0, 16);\n}\n\nfunction dateOutputValue(value: string, dateTime: boolean): string {\n if (!value) return \"\";\n if (!dateTime) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value;\n return parsed.toISOString();\n}\n\nconst inputClassName =\n \"h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-placeholder disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"mappings":"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"}
@@ -51,7 +51,7 @@ function CommandForm({ parameters, onExecute, isPending, method: _method, path,
51
51
  })
52
52
  }, param.name))
53
53
  }), /* @__PURE__ */ jsx("div", {
54
- className: inlineLayout ? "sticky bottom-0 z-10 -mx-2 flex justify-end border-t border-border bg-background/95 px-2 py-3 backdrop-blur-sm" : "flex justify-end",
54
+ className: inlineLayout ? "sticky bottom-0 z-10 flex justify-end border-t border-border bg-background/95 py-3 backdrop-blur-sm" : "flex justify-end",
55
55
  children: /* @__PURE__ */ jsx(Button, {
56
56
  type: "submit",
57
57
  disabled: isPending,
@@ -1 +1 @@
1
- {"version":3,"file":"CommandForm.js","names":[],"sources":["../../src/rpc/CommandForm.tsx"],"sourcesContent":["import { useReducer, type FormEvent, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiClose } from \"../icons\";\nimport { parameterPlaceholder, type OpenAPIParameter, type OperationRequestValues } from \"./types\";\nimport { normalizeParameters, pathParamNames, submitValue } from \"./command-form-utils\";\nimport { packParameterValues, type ParameterValues } from \"./formMetadata\";\n\nexport type CommandFormSubmission = {\n values: ParameterValues;\n request: OperationRequestValues;\n headers: Record<string, string>;\n};\n\nexport type CommandFormProps = {\n parameters: OpenAPIParameter[];\n onExecute: (submission: CommandFormSubmission) => void;\n isPending: boolean;\n method: string;\n path: string;\n accept: string;\n initialValues?: Record<string, string>;\n};\n\ntype FormState = Record<string, string>;\ntype FormAction = { name: string; value: string };\n\nfunction formReducer(state: FormState, action: FormAction): FormState {\n return { ...state, [action.name]: action.value };\n}\n\nexport function CommandForm({\n parameters,\n onExecute,\n isPending,\n method: _method,\n path,\n accept,\n initialValues,\n}: CommandFormProps) {\n const [values, dispatch] = useReducer(\n formReducer,\n { parameters, path, initialValues },\n ({ parameters: params, path: formPath, initialValues: overrides }) =>\n buildInitialState(normalizeParameters(params, formPath), formPath, overrides),\n );\n\n const formParameters = normalizeParameters(parameters, path);\n const visibleParams = formParameters.filter((p) => !(p.in === \"path\" && initialValues?.[p.name]));\n const inlineLayout = visibleParams.length >= INLINE_LAYOUT_THRESHOLD;\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n const submittedValues: ParameterValues = {};\n for (const param of formParameters) {\n const value = submitValue(param, values[param.name]);\n if (value == null) continue;\n submittedValues[param.name] = value;\n }\n onExecute({\n values: submittedValues,\n request: packParameterValues(submittedValues, formParameters),\n headers: { Accept: accept },\n });\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {visibleParams.length > 0 && (\n <div className={inlineLayout ? \"grid gap-2\" : \"grid gap-4\"}>\n {visibleParams.map((param) => (\n <ParameterField\n key={param.name}\n param={param}\n value={values[param.name] || \"\"}\n inline={inlineLayout}\n onChange={(value) => dispatch({ name: param.name, value })}\n />\n ))}\n </div>\n )}\n\n <div\n className={\n inlineLayout\n ? \"sticky bottom-0 z-10 -mx-2 flex justify-end border-t border-border bg-background/95 px-2 py-3 backdrop-blur-sm\"\n : \"flex justify-end\"\n }\n >\n <Button type=\"submit\" disabled={isPending}>\n {isPending ? \"Executing...\" : \"Execute\"}\n </Button>\n </div>\n </form>\n );\n}\n\nconst INLINE_LAYOUT_THRESHOLD = 6;\n\nfunction ParameterField({\n param,\n value,\n inline,\n onChange,\n}: {\n param: OpenAPIParameter;\n value: string;\n inline: boolean;\n onChange: (value: string) => void;\n}) {\n const schema = param.schema;\n const fieldId = `param-${param.name}`;\n\n if (isMultiValueParam(param)) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <TagInput\n id={fieldId}\n value={value}\n placeholder={parameterPlaceholder(param) || param.name}\n onChange={onChange}\n />\n </FieldWrapper>\n );\n }\n\n if (schema?.enum) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <select\n id={fieldId}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select {param.name}</option>\n {schema.enum.map((v) => (\n <option key={String(v)} value={String(v)}>\n {String(v)}\n </option>\n ))}\n </select>\n </FieldWrapper>\n );\n }\n\n if (schema?.type === \"boolean\") {\n const checkbox = (\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n checked={value === \"true\"}\n onChange={(event) => onChange(event.target.checked ? \"true\" : \"false\")}\n />\n );\n if (inline) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline>\n <div className=\"flex h-9 items-center\">{checkbox}</div>\n </FieldWrapper>\n );\n }\n return (\n <div className=\"flex items-center gap-2\">\n {checkbox}\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n {param.description && (\n <span className=\"text-xs text-muted-foreground\">{param.description}</span>\n )}\n </div>\n );\n }\n\n if (isDateParam(param)) {\n const dateTime = schema?.format === \"date-time\";\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <div className=\"flex gap-2\">\n <input\n id={fieldId}\n type={dateTime ? \"datetime-local\" : \"date\"}\n value={dateInputValue(value, dateTime)}\n className={inputClassName}\n onChange={(event) => onChange(dateOutputValue(event.target.value, dateTime))}\n />\n {value && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Clear ${param.name}`}\n onClick={() => onChange(\"\")}\n >\n <Icon icon={UiClose} />\n </Button>\n )}\n </div>\n </FieldWrapper>\n );\n }\n\n const inputType = schema?.type === \"integer\" || schema?.type === \"number\" ? \"number\" : \"text\";\n\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <input\n id={fieldId}\n type={inputType}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n placeholder={\n schema?.default != null\n ? String(schema.default)\n : parameterPlaceholder(param) || param.name\n }\n />\n </FieldWrapper>\n );\n}\n\nfunction TagInput({\n id,\n value,\n placeholder,\n onChange,\n}: {\n id: string;\n value: string;\n placeholder: string;\n onChange: (value: string) => void;\n}) {\n const tags = parseTags(value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n onChange(serializeTags([...tags, ...next]));\n input.value = \"\";\n }\n\n function remove(index: number) {\n onChange(serializeTags(tags.filter((_, i) => i !== index)));\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n const input = event.currentTarget;\n if (event.key === \"Enter\" || event.key === \",\") {\n event.preventDefault();\n commit(input.value, input);\n return;\n }\n if (event.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n remove(tags.length - 1);\n }\n }\n\n return (\n <div className=\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\">\n {tags.map((tag, index) => (\n <span\n key={`${tag}-${index}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => remove(index)}\n >\n <Icon icon={UiClose} />\n </button>\n </span>\n ))}\n <input\n id={id}\n className=\"min-w-0 flex-1 basis-32 bg-transparent px-1 py-1 text-sm outline-none\"\n placeholder={tags.length === 0 ? placeholder : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(event) => commit(event.currentTarget.value, event.currentTarget)}\n />\n </div>\n );\n}\n\nfunction FieldWrapper({\n param,\n fieldId,\n inline,\n children,\n}: {\n param: OpenAPIParameter;\n fieldId: string;\n inline?: boolean;\n children: ReactNode;\n}) {\n const label = (\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n );\n\n if (inline) {\n return (\n <div className=\"grid grid-cols-[10rem_1fr] items-start gap-x-3 gap-y-0.5\">\n <div className=\"flex h-9 items-center\">{label}</div>\n <div className=\"min-w-0\">{children}</div>\n {param.description && (\n <p className=\"col-start-2 text-xs text-muted-foreground\">{param.description}</p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-1.5\">\n {label}\n {children}\n {param.description && <p className=\"text-xs text-muted-foreground\">{param.description}</p>}\n </div>\n );\n}\n\nfunction buildInitialState(\n parameters: OpenAPIParameter[],\n path: string,\n overrides?: Record<string, string>,\n): FormState {\n const state: FormState = {};\n for (const p of parameters) {\n state[p.name] = initialParamValue(p, overrides?.[p.name]);\n }\n for (const name of pathParamNames(path)) {\n if (state[name] == null) {\n state[name] = overrides?.[name] ?? \"\";\n }\n }\n return state;\n}\n\nfunction initialParamValue(param: OpenAPIParameter, override: string | undefined): string {\n if (override != null) return sanitizeInitialValue(param, override);\n const value = param.schema?.default;\n if (value == null) return \"\";\n return sanitizeInitialValue(param, String(value));\n}\n\nfunction sanitizeInitialValue(param: OpenAPIParameter, value: string): string {\n const trimmed = value.trim();\n if (trimmed === \"[]\" || trimmed === \"null\") return \"\";\n if (isDateParam(param) && isZeroDate(trimmed)) return \"\";\n return value;\n}\n\nfunction isMultiValueParam(param: OpenAPIParameter): boolean {\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return (\n param.schema?.type === \"array\" ||\n String(param.schema?.default ?? \"\") === \"[]\" ||\n text.includes(\"repeatable\")\n );\n}\n\nfunction parseTags(value: string): string[] {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited tags below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction serializeTags(tags: string[]): string {\n return tags.join(\",\");\n}\n\nfunction isDateParam(param: OpenAPIParameter): boolean {\n const format = param.schema?.format?.toLowerCase();\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return format === \"date\" || format === \"date-time\" || text.includes(\"date\");\n}\n\nfunction isZeroDate(value: string): boolean {\n return value.startsWith(\"0001-01-01\") || value === \"0001-01-01\";\n}\n\nfunction dateInputValue(value: string, dateTime: boolean): string {\n if (!value || value.startsWith(\"0001-01-01\")) return \"\";\n if (!dateTime) return value.slice(0, 10);\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value.slice(0, 16);\n const offset = parsed.getTimezoneOffset() * 60_000;\n return new Date(parsed.getTime() - offset).toISOString().slice(0, 16);\n}\n\nfunction dateOutputValue(value: string, dateTime: boolean): string {\n if (!value) return \"\";\n if (!dateTime) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value;\n return parsed.toISOString();\n}\n\nconst inputClassName =\n \"h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-placeholder disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"CommandForm.js","names":[],"sources":["../../src/rpc/CommandForm.tsx"],"sourcesContent":["import { useReducer, type FormEvent, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiClose } from \"../icons\";\nimport { parameterPlaceholder, type OpenAPIParameter, type OperationRequestValues } from \"./types\";\nimport { normalizeParameters, pathParamNames, submitValue } from \"./command-form-utils\";\nimport { packParameterValues, type ParameterValues } from \"./formMetadata\";\n\nexport type CommandFormSubmission = {\n values: ParameterValues;\n request: OperationRequestValues;\n headers: Record<string, string>;\n};\n\nexport type CommandFormProps = {\n parameters: OpenAPIParameter[];\n onExecute: (submission: CommandFormSubmission) => void;\n isPending: boolean;\n method: string;\n path: string;\n accept: string;\n initialValues?: Record<string, string>;\n};\n\ntype FormState = Record<string, string>;\ntype FormAction = { name: string; value: string };\n\nfunction formReducer(state: FormState, action: FormAction): FormState {\n return { ...state, [action.name]: action.value };\n}\n\nexport function CommandForm({\n parameters,\n onExecute,\n isPending,\n method: _method,\n path,\n accept,\n initialValues,\n}: CommandFormProps) {\n const [values, dispatch] = useReducer(\n formReducer,\n { parameters, path, initialValues },\n ({ parameters: params, path: formPath, initialValues: overrides }) =>\n buildInitialState(normalizeParameters(params, formPath), formPath, overrides),\n );\n\n const formParameters = normalizeParameters(parameters, path);\n const visibleParams = formParameters.filter((p) => !(p.in === \"path\" && initialValues?.[p.name]));\n const inlineLayout = visibleParams.length >= INLINE_LAYOUT_THRESHOLD;\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n const submittedValues: ParameterValues = {};\n for (const param of formParameters) {\n const value = submitValue(param, values[param.name]);\n if (value == null) continue;\n submittedValues[param.name] = value;\n }\n onExecute({\n values: submittedValues,\n request: packParameterValues(submittedValues, formParameters),\n headers: { Accept: accept },\n });\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {visibleParams.length > 0 && (\n <div className={inlineLayout ? \"grid gap-2\" : \"grid gap-4\"}>\n {visibleParams.map((param) => (\n <ParameterField\n key={param.name}\n param={param}\n value={values[param.name] || \"\"}\n inline={inlineLayout}\n onChange={(value) => dispatch({ name: param.name, value })}\n />\n ))}\n </div>\n )}\n\n <div\n className={\n inlineLayout\n ? \"sticky bottom-0 z-10 flex justify-end border-t border-border bg-background/95 py-3 backdrop-blur-sm\"\n : \"flex justify-end\"\n }\n >\n <Button type=\"submit\" disabled={isPending}>\n {isPending ? \"Executing...\" : \"Execute\"}\n </Button>\n </div>\n </form>\n );\n}\n\nconst INLINE_LAYOUT_THRESHOLD = 6;\n\nfunction ParameterField({\n param,\n value,\n inline,\n onChange,\n}: {\n param: OpenAPIParameter;\n value: string;\n inline: boolean;\n onChange: (value: string) => void;\n}) {\n const schema = param.schema;\n const fieldId = `param-${param.name}`;\n\n if (isMultiValueParam(param)) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <TagInput\n id={fieldId}\n value={value}\n placeholder={parameterPlaceholder(param) || param.name}\n onChange={onChange}\n />\n </FieldWrapper>\n );\n }\n\n if (schema?.enum) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <select\n id={fieldId}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select {param.name}</option>\n {schema.enum.map((v) => (\n <option key={String(v)} value={String(v)}>\n {String(v)}\n </option>\n ))}\n </select>\n </FieldWrapper>\n );\n }\n\n if (schema?.type === \"boolean\") {\n const checkbox = (\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n checked={value === \"true\"}\n onChange={(event) => onChange(event.target.checked ? \"true\" : \"false\")}\n />\n );\n if (inline) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline>\n <div className=\"flex h-9 items-center\">{checkbox}</div>\n </FieldWrapper>\n );\n }\n return (\n <div className=\"flex items-center gap-2\">\n {checkbox}\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n {param.description && (\n <span className=\"text-xs text-muted-foreground\">{param.description}</span>\n )}\n </div>\n );\n }\n\n if (isDateParam(param)) {\n const dateTime = schema?.format === \"date-time\";\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <div className=\"flex gap-2\">\n <input\n id={fieldId}\n type={dateTime ? \"datetime-local\" : \"date\"}\n value={dateInputValue(value, dateTime)}\n className={inputClassName}\n onChange={(event) => onChange(dateOutputValue(event.target.value, dateTime))}\n />\n {value && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Clear ${param.name}`}\n onClick={() => onChange(\"\")}\n >\n <Icon icon={UiClose} />\n </Button>\n )}\n </div>\n </FieldWrapper>\n );\n }\n\n const inputType = schema?.type === \"integer\" || schema?.type === \"number\" ? \"number\" : \"text\";\n\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <input\n id={fieldId}\n type={inputType}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n placeholder={\n schema?.default != null\n ? String(schema.default)\n : parameterPlaceholder(param) || param.name\n }\n />\n </FieldWrapper>\n );\n}\n\nfunction TagInput({\n id,\n value,\n placeholder,\n onChange,\n}: {\n id: string;\n value: string;\n placeholder: string;\n onChange: (value: string) => void;\n}) {\n const tags = parseTags(value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n onChange(serializeTags([...tags, ...next]));\n input.value = \"\";\n }\n\n function remove(index: number) {\n onChange(serializeTags(tags.filter((_, i) => i !== index)));\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n const input = event.currentTarget;\n if (event.key === \"Enter\" || event.key === \",\") {\n event.preventDefault();\n commit(input.value, input);\n return;\n }\n if (event.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n remove(tags.length - 1);\n }\n }\n\n return (\n <div className=\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\">\n {tags.map((tag, index) => (\n <span\n key={`${tag}-${index}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => remove(index)}\n >\n <Icon icon={UiClose} />\n </button>\n </span>\n ))}\n <input\n id={id}\n className=\"min-w-0 flex-1 basis-32 bg-transparent px-1 py-1 text-sm outline-none\"\n placeholder={tags.length === 0 ? placeholder : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(event) => commit(event.currentTarget.value, event.currentTarget)}\n />\n </div>\n );\n}\n\nfunction FieldWrapper({\n param,\n fieldId,\n inline,\n children,\n}: {\n param: OpenAPIParameter;\n fieldId: string;\n inline?: boolean;\n children: ReactNode;\n}) {\n const label = (\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n );\n\n if (inline) {\n return (\n <div className=\"grid grid-cols-[10rem_1fr] items-start gap-x-3 gap-y-0.5\">\n <div className=\"flex h-9 items-center\">{label}</div>\n <div className=\"min-w-0\">{children}</div>\n {param.description && (\n <p className=\"col-start-2 text-xs text-muted-foreground\">{param.description}</p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-1.5\">\n {label}\n {children}\n {param.description && <p className=\"text-xs text-muted-foreground\">{param.description}</p>}\n </div>\n );\n}\n\nfunction buildInitialState(\n parameters: OpenAPIParameter[],\n path: string,\n overrides?: Record<string, string>,\n): FormState {\n const state: FormState = {};\n for (const p of parameters) {\n state[p.name] = initialParamValue(p, overrides?.[p.name]);\n }\n for (const name of pathParamNames(path)) {\n if (state[name] == null) {\n state[name] = overrides?.[name] ?? \"\";\n }\n }\n return state;\n}\n\nfunction initialParamValue(param: OpenAPIParameter, override: string | undefined): string {\n if (override != null) return sanitizeInitialValue(param, override);\n const value = param.schema?.default;\n if (value == null) return \"\";\n return sanitizeInitialValue(param, String(value));\n}\n\nfunction sanitizeInitialValue(param: OpenAPIParameter, value: string): string {\n const trimmed = value.trim();\n if (trimmed === \"[]\" || trimmed === \"null\") return \"\";\n if (isDateParam(param) && isZeroDate(trimmed)) return \"\";\n return value;\n}\n\nfunction isMultiValueParam(param: OpenAPIParameter): boolean {\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return (\n param.schema?.type === \"array\" ||\n String(param.schema?.default ?? \"\") === \"[]\" ||\n text.includes(\"repeatable\")\n );\n}\n\nfunction parseTags(value: string): string[] {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited tags below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction serializeTags(tags: string[]): string {\n return tags.join(\",\");\n}\n\nfunction isDateParam(param: OpenAPIParameter): boolean {\n const format = param.schema?.format?.toLowerCase();\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return format === \"date\" || format === \"date-time\" || text.includes(\"date\");\n}\n\nfunction isZeroDate(value: string): boolean {\n return value.startsWith(\"0001-01-01\") || value === \"0001-01-01\";\n}\n\nfunction dateInputValue(value: string, dateTime: boolean): string {\n if (!value || value.startsWith(\"0001-01-01\")) return \"\";\n if (!dateTime) return value.slice(0, 10);\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value.slice(0, 16);\n const offset = parsed.getTimezoneOffset() * 60_000;\n return new Date(parsed.getTime() - offset).toISOString().slice(0, 16);\n}\n\nfunction dateOutputValue(value: string, dateTime: boolean): string {\n if (!value) return \"\";\n if (!dateTime) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value;\n return parsed.toISOString();\n}\n\nconst inputClassName =\n \"h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-placeholder disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"mappings":"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"}