@flanksource/clicky-ui 0.3.56 → 0.3.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ErrorWrapper.cjs +15 -4
- package/dist/components/ErrorWrapper.cjs.map +1 -1
- package/dist/components/ErrorWrapper.d.ts +7 -0
- package/dist/components/ErrorWrapper.d.ts.map +1 -1
- package/dist/components/ErrorWrapper.js +15 -4
- package/dist/components/ErrorWrapper.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs +6 -3
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.js +6 -3
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.cjs +2 -1
- package/dist/data/ai/PromptCatalog/PromptPage.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.js +2 -1
- package/dist/data/ai/PromptCatalog/PromptPage.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs +9 -6
- package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.js +9 -6
- package/dist/data/ai/PromptCatalog/PromptPageHeader.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs +3 -3
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts +2 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js +3 -3
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.cjs +4 -3
- package/dist/data/ai/PromptCatalog/prompt-page-model.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.js +4 -3
- package/dist/data/ai/PromptCatalog/prompt-page-model.js.map +1 -1
- package/dist/data/ai/PromptCatalog/types.d.ts +1 -0
- package/dist/data/ai/PromptCatalog/types.d.ts.map +1 -1
- package/dist/data/traces/index.d.ts +7 -0
- package/dist/data/traces/index.d.ts.map +1 -1
- package/dist/data/traces/otel/OperationList.cjs +64 -0
- package/dist/data/traces/otel/OperationList.cjs.map +1 -0
- package/dist/data/traces/otel/OperationList.d.ts +10 -0
- package/dist/data/traces/otel/OperationList.d.ts.map +1 -0
- package/dist/data/traces/otel/OperationList.js +64 -0
- package/dist/data/traces/otel/OperationList.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.cjs +781 -0
- package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.d.ts +7 -0
- package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.js +781 -0
- package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.cjs +145 -0
- package/dist/data/traces/otel/OtelTraceSearch.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.d.ts +16 -0
- package/dist/data/traces/otel/OtelTraceSearch.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.js +145 -0
- package/dist/data/traces/otel/OtelTraceSearch.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.cjs +47 -0
- package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.d.ts +12 -0
- package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.js +47 -0
- package/dist/data/traces/otel/OtelTraceTable.js.map +1 -0
- package/dist/data/traces/otel/QueryBar.cjs +158 -0
- package/dist/data/traces/otel/QueryBar.cjs.map +1 -0
- package/dist/data/traces/otel/QueryBar.d.ts +12 -0
- package/dist/data/traces/otel/QueryBar.d.ts.map +1 -0
- package/dist/data/traces/otel/QueryBar.js +158 -0
- package/dist/data/traces/otel/QueryBar.js.map +1 -0
- package/dist/data/traces/otel/SpanCards.cjs +264 -0
- package/dist/data/traces/otel/SpanCards.cjs.map +1 -0
- package/dist/data/traces/otel/SpanCards.d.ts +17 -0
- package/dist/data/traces/otel/SpanCards.d.ts.map +1 -0
- package/dist/data/traces/otel/SpanCards.js +261 -0
- package/dist/data/traces/otel/SpanCards.js.map +1 -0
- package/dist/data/traces/otel/SpanCategory.cjs +18 -0
- package/dist/data/traces/otel/SpanCategory.cjs.map +1 -0
- package/dist/data/traces/otel/SpanCategory.d.ts +7 -0
- package/dist/data/traces/otel/SpanCategory.d.ts.map +1 -0
- package/dist/data/traces/otel/SpanCategory.js +18 -0
- package/dist/data/traces/otel/SpanCategory.js.map +1 -0
- package/dist/data/traces/otel/TraceResults.cjs +195 -0
- package/dist/data/traces/otel/TraceResults.cjs.map +1 -0
- package/dist/data/traces/otel/TraceResults.d.ts +19 -0
- package/dist/data/traces/otel/TraceResults.d.ts.map +1 -0
- package/dist/data/traces/otel/TraceResults.js +193 -0
- package/dist/data/traces/otel/TraceResults.js.map +1 -0
- package/dist/data/traces/otel/api.cjs +36 -0
- package/dist/data/traces/otel/api.cjs.map +1 -0
- package/dist/data/traces/otel/api.d.ts +87 -0
- package/dist/data/traces/otel/api.d.ts.map +1 -0
- package/dist/data/traces/otel/api.js +33 -0
- package/dist/data/traces/otel/api.js.map +1 -0
- package/dist/data/traces/otel/fixtures.d.ts +4 -0
- package/dist/data/traces/otel/fixtures.d.ts.map +1 -0
- package/dist/data/traces/otel/metrics.cjs +7 -0
- package/dist/data/traces/otel/metrics.cjs.map +1 -0
- package/dist/data/traces/otel/metrics.d.ts +2 -0
- package/dist/data/traces/otel/metrics.d.ts.map +1 -0
- package/dist/data/traces/otel/metrics.js +7 -0
- package/dist/data/traces/otel/metrics.js.map +1 -0
- package/dist/data/traces/otel/model.cjs +167 -0
- package/dist/data/traces/otel/model.cjs.map +1 -0
- package/dist/data/traces/otel/model.d.ts +81 -0
- package/dist/data/traces/otel/model.d.ts.map +1 -0
- package/dist/data/traces/otel/model.js +154 -0
- package/dist/data/traces/otel/model.js.map +1 -0
- package/dist/data/traces/otel/query.cjs +90 -0
- package/dist/data/traces/otel/query.cjs.map +1 -0
- package/dist/data/traces/otel/query.d.ts +20 -0
- package/dist/data/traces/otel/query.d.ts.map +1 -0
- package/dist/data/traces/otel/query.js +86 -0
- package/dist/data/traces/otel/query.js.map +1 -0
- package/dist/data/traces/otel/result-model.cjs +25 -0
- package/dist/data/traces/otel/result-model.cjs.map +1 -0
- package/dist/data/traces/otel/result-model.d.ts +5 -0
- package/dist/data/traces/otel/result-model.d.ts.map +1 -0
- package/dist/data/traces/otel/result-model.js +24 -0
- package/dist/data/traces/otel/result-model.js.map +1 -0
- package/dist/data/traces/otel/source.cjs +11 -0
- package/dist/data/traces/otel/source.cjs.map +1 -0
- package/dist/data/traces/otel/source.d.ts +5 -0
- package/dist/data/traces/otel/source.d.ts.map +1 -0
- package/dist/data/traces/otel/source.js +10 -0
- package/dist/data/traces/otel/source.js.map +1 -0
- package/dist/data/traces/otel/span-traces.cjs +39 -0
- package/dist/data/traces/otel/span-traces.cjs.map +1 -0
- package/dist/data/traces/otel/span-traces.d.ts +3 -0
- package/dist/data/traces/otel/span-traces.d.ts.map +1 -0
- package/dist/data/traces/otel/span-traces.js +39 -0
- package/dist/data/traces/otel/span-traces.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +11 -0
- package/dist/data.js +6 -1
- package/dist/index.cjs +11 -0
- package/dist/index.js +6 -1
- package/dist/profiles/editor/profileEditorSections.cjs +4 -0
- package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
- package/dist/profiles/editor/profileEditorSections.d.ts.map +1 -1
- package/dist/profiles/editor/profileEditorSections.js +4 -0
- package/dist/profiles/editor/profileEditorSections.js.map +1 -1
- package/dist/styles.css +1 -1
- 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":"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"}
|
|
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,+
|
|
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"}
|
|
@@ -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":"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"}
|
|
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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"}
|