@grafana/plugin-ui 0.17.1 → 0.17.3

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.
@@ -1521,6 +1521,14 @@ declare function useHealthChecks(): {
1521
1521
 
1522
1522
  declare function resolvePluginName(pluginType: string): string;
1523
1523
 
1524
+ type UseDatasourceSchemaResult = {
1525
+ schema: DatasourceConfigSchema | null;
1526
+ loading: boolean;
1527
+ error: string | null;
1528
+ };
1529
+ declare function useDatasourceSchema(pluginType: string): UseDatasourceSchemaResult;
1530
+ declare function fetchConfigSchema(pluginType: string): Promise<DatasourceConfigSchema | null>;
1531
+
1524
1532
  /**
1525
1533
  * CEL (Common Expression Language) expression evaluator for schema conditions.
1526
1534
  *
@@ -2008,5 +2016,5 @@ interface RequestLoopOptions<TQuery extends DataQuery$1 = DataQuery$1> {
2008
2016
  */
2009
2017
  declare function getRequestLooper<T extends DataQuery$1 = DataQuery$1>(req: DataQueryRequest<T>, options: RequestLoopOptions<T>): Observable<DataQueryResponse>;
2010
2018
 
2011
- export { AUTH_GROUP_IDS, AccessoryButton, AdvancedHttpSettings, Auth, AuthMethod, BINARY_OPERATIONS_KEY, CatalogSelector, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, DataLink, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, DatasourceConfigWizard, DatasourceErrorBoundary, DatasourceWithAsyncBackend, DatePicker, DatePickerWithInput, DebounceInput, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, InlineSelect, InputGroup, LabelFilters, LinkedToken, MacroType, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, QUERY_FORMAT_OPTIONS, QueryBuilderHints, QueryEditorMode, QueryEditorModeToggle, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, ROOT_CONFIG_FIELDS, RawQuery, RunQueryButton, RunQueryButtons, SQLEditor, SQLEditorMode, SQLEditorTestUtils, SecureSocksProxyToggle, Segment, Space, SqlDatasource, SqlQueryEditor, StatementPosition, SuggestionKind, TLSSettings, TableSelector, TokenType, buildCelContext, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload, clearExpressionCache, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateCelDirect, evaluateCelExpression, evaluateComputedRead, evaluateDependsOn, extractFieldRefs, formKey, formatDate, formatYamlDiff, generateLLMHint, generateProvisioningTemplate, generateTroubleshootingFields, getConfigSchema, getRequestLooper, getStandardSQLCompletionProvider, getWatchedValue, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, isAuthGroupId, isValidCelExpression, parseDependsOn, resolveActiveOverride, resolveGroups, resolvePluginName, resolveRequiredFieldsGroup, toOption, useHealthChecks };
2019
+ export { AUTH_GROUP_IDS, AccessoryButton, AdvancedHttpSettings, Auth, AuthMethod, BINARY_OPERATIONS_KEY, CatalogSelector, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, DataLink, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, DatasourceConfigWizard, DatasourceErrorBoundary, DatasourceWithAsyncBackend, DatePicker, DatePickerWithInput, DebounceInput, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, InlineSelect, InputGroup, LabelFilters, LinkedToken, MacroType, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, QUERY_FORMAT_OPTIONS, QueryBuilderHints, QueryEditorMode, QueryEditorModeToggle, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, ROOT_CONFIG_FIELDS, RawQuery, RunQueryButton, RunQueryButtons, SQLEditor, SQLEditorMode, SQLEditorTestUtils, SecureSocksProxyToggle, Segment, Space, SqlDatasource, SqlQueryEditor, StatementPosition, SuggestionKind, TLSSettings, TableSelector, TokenType, buildCelContext, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload, clearExpressionCache, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateCelDirect, evaluateCelExpression, evaluateComputedRead, evaluateDependsOn, extractFieldRefs, fetchConfigSchema, formKey, formatDate, formatYamlDiff, generateLLMHint, generateProvisioningTemplate, generateTroubleshootingFields, getConfigSchema, getRequestLooper, getStandardSQLCompletionProvider, getWatchedValue, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, isAuthGroupId, isValidCelExpression, parseDependsOn, resolveActiveOverride, resolveGroups, resolvePluginName, resolveRequiredFieldsGroup, toOption, useDatasourceSchema, useHealthChecks };
2012
2020
  export type { Aggregate, AllowedValuesValidationRule, Props$c as AuthProps, BaseFieldRef, BaseValidationRule, ColumnDefinition, ComputedMapping, ConfigField, ConfigGroup, CustomMeta, CustomValidationRule, DB, DataLinkConfig, DatasourceConfigSchema, DatasourceConfigWizardProps, DatasourceHealth, DatePickerProps, DatePickerWithInputProps, DebounceInputProps, DirectMapping, Expression, FieldEffect, FieldItemSchema, FieldKind, FieldOption, FieldOverride, FieldPack, FieldPackID, FieldPatch, FieldRelationship, FieldUI, FieldValidationRule, FormState, HealthState, IndexedPairMapping, Instruction, ItemCountValidationRule, LanguageCompletionProvider, LanguageDefinition, LengthValidationRule, MappingField, MetaDefinition, NameValue, PatternValidationRule, PositionContext, Props$s as Props, QueryBuilderLabelFilter, QueryBuilderOperation, QueryBuilderOperationDefinition, QueryBuilderOperationParamDef, QueryBuilderOperationParamEditorProps, QueryBuilderOperationParamValue, QueryEditorProps, QueryRowFilter, QueryStats, QueryWithDefaults, RAQBFieldTypes, RangeValidationRule, RelationshipType, RequestLoopOptions, ResolvedGroup, ResourceSelectorProps, ResponseParser, Role, RunQueryButtonsProps, RunningQueryInfo, SQLConnectionLimits, SQLExpression, SQLFilters, SQLMonarchLanguage, SQLOptions, SQLQuery, SQLSelectableValue, SchemaDefinition, SecureFieldState, SegmentProps, SqlQueryForInterpolation, SqlQueryModel, State$1 as State, StatementPlacementProvider, StorageMapping, SuggestionKindProvider, Props$f as TLSSettingsProps, TableDefinition, TableFieldSchema, TableIdentifier, TableSchema, TargetLocation, TestQueryModel, UIComponent, UIWidth, ValidationResults, ValueType, VisualQuery, VisualQueryBinary, VisualQueryModeller };
@@ -5,6 +5,7 @@ import { FetchErrorState, GroupFields, FormFooter } from './layoutParts.js';
5
5
  import { getWizardStyles } from './styles.js';
6
6
  import '@grafana/runtime';
7
7
  import '@marcbachmann/cel-js';
8
+ import { trackConfigWizardSectionChange } from './tracking.js';
8
9
 
9
10
  function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderActions }) {
10
11
  var _a, _b, _c;
@@ -44,6 +45,7 @@ function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, rend
44
45
  value: currentStep,
45
46
  onChange: (v) => {
46
47
  if ((v == null ? void 0 : v.value) != null) {
48
+ trackConfigWizardSectionChange(v.label || v.title);
47
49
  setCurrentStep(v.value);
48
50
  }
49
51
  },
@@ -1 +1 @@
1
- {"version":3,"file":"WizardLayout.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/WizardLayout.tsx"],"sourcesContent":["import React, { type ReactNode, useMemo, useState } from 'react';\nimport { useStyles2, Button, Select, Icon, Tooltip, Spinner } from '@grafana/ui';\nimport { isAuthGroupId } from './config';\nimport { GroupFields, FormFooter, FetchErrorState } from './layoutParts';\nimport { getWizardStyles } from './styles';\nimport { type DatasourceConfigSchema } from '../../../schema/schema';\nimport { type useDatasourceConfigForm } from './hooks/useDatasourceConfigForm';\n\ntype WizardLayoutProps = {\n form: ReturnType<typeof useDatasourceConfigForm>;\n schema: DatasourceConfigSchema;\n dsUid: string;\n dsName: string;\n onRetest?: () => void;\n healthError?: string;\n renderActions?: (props: { dsUid: string; dsName: string; dsType: string; healthError?: string }) => ReactNode;\n};\n\nexport function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderActions }: WizardLayoutProps) {\n const styles = useStyles2(getWizardStyles);\n const [currentStep, setCurrentStep] = useState(0);\n const { resolvedGroups, handleSubmit, initializing, fetchError, submitting, readOnly, isGroupValid, onSubmit } = form;\n const canSave = useMemo(() => resolvedGroups.every(isGroupValid), [resolvedGroups, isGroupValid]);\n\n if (initializing) {\n return (\n <div className={styles.container}>\n <Spinner size=\"sm\" inline /> Loading configuration...\n </div>\n );\n }\n\n if (fetchError) {\n return (\n <div className={styles.container}>\n <FetchErrorState error={fetchError} dsUid={dsUid} buttonClassName={styles.buttons} />\n </div>\n );\n }\n\n if (resolvedGroups.length === 0) {\n return <></>;\n }\n\n const currentResolved = resolvedGroups[currentStep];\n const currentGroup = currentResolved?.group;\n const isFirstStep = currentStep === 0;\n const isLastStep = currentStep === resolvedGroups.length - 1;\n\n return (\n <div className={styles.container}>\n {submitting && (\n <div className={styles.overlay}>\n <Spinner size=\"sm\" />\n <span>Saving & testing…</span>\n </div>\n )}\n {readOnly && (\n <div className={styles.readOnlyBanner}>\n <Icon name=\"lock\" size=\"xs\" />\n <span>Read-only — managed externally</span>\n </div>\n )}\n <div className={styles.navBar}>\n {currentGroup && (\n <Tooltip content={currentGroup.description ?? currentGroup.title}>\n <span className={styles.navTitle}>\n {currentGroup.title}\n <span className={styles.stepCount}>\n {currentStep + 1}/{resolvedGroups.length}\n </span>\n </span>\n </Tooltip>\n )}\n <div className={styles.navActions}>\n <Tooltip content={isFirstStep ? 'First step' : `Previous: ${resolvedGroups[currentStep - 1]?.group.title}`}>\n <Button\n variant=\"secondary\"\n fill=\"text\"\n size=\"sm\"\n icon=\"angle-left\"\n aria-label=\"Previous\"\n onClick={() => setCurrentStep(currentStep - 1)}\n disabled={isFirstStep || submitting}\n type=\"button\"\n />\n </Tooltip>\n <Select\n options={resolvedGroups.map((g, i) => ({ label: g.group.title, value: i }))}\n value={currentStep}\n onChange={(v) => {\n if (v?.value != null) {\n setCurrentStep(v.value);\n }\n }}\n disabled={submitting}\n width={18}\n />\n <Tooltip content={isLastStep ? 'Last step' : `Next: ${resolvedGroups[currentStep + 1]?.group.title}`}>\n <Button\n variant={isLastStep ? 'secondary' : 'primary'}\n size=\"sm\"\n icon=\"angle-right\"\n aria-label=\"Next\"\n onClick={() => setCurrentStep(currentStep + 1)}\n disabled={isLastStep || submitting}\n type=\"button\"\n />\n </Tooltip>\n </div>\n </div>\n\n {currentResolved && (\n <form onSubmit={handleSubmit(onSubmit)} className={styles.form}>\n <GroupFields\n group={currentResolved}\n form={form}\n dsUid={dsUid}\n showAuthHeaders={currentResolved.group.id === '_required' || isAuthGroupId(currentResolved.group.id)}\n />\n <FormFooter\n form={form}\n schema={schema}\n dsUid={dsUid}\n dsName={dsName}\n onRetest={onRetest}\n healthError={healthError}\n renderActions={renderActions}\n saveDisabled={submitting || !canSave}\n className={styles.buttons}\n />\n </form>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WizardLayout.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/WizardLayout.tsx"],"sourcesContent":["import React, { type ReactNode, useMemo, useState } from 'react';\nimport { useStyles2, Button, Select, Icon, Tooltip, Spinner } from '@grafana/ui';\nimport { isAuthGroupId } from './config';\nimport { GroupFields, FormFooter, FetchErrorState } from './layoutParts';\nimport { getWizardStyles } from './styles';\nimport { type DatasourceConfigSchema } from '../../../schema/schema';\nimport { type useDatasourceConfigForm } from './hooks/useDatasourceConfigForm';\nimport { trackConfigWizardSectionChange } from './tracking';\n\ntype WizardLayoutProps = {\n form: ReturnType<typeof useDatasourceConfigForm>;\n schema: DatasourceConfigSchema;\n dsUid: string;\n dsName: string;\n onRetest?: () => void;\n healthError?: string;\n renderActions?: (props: { dsUid: string; dsName: string; dsType: string; healthError?: string }) => ReactNode;\n};\n\nexport function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderActions }: WizardLayoutProps) {\n const styles = useStyles2(getWizardStyles);\n const [currentStep, setCurrentStep] = useState(0);\n const { resolvedGroups, handleSubmit, initializing, fetchError, submitting, readOnly, isGroupValid, onSubmit } = form;\n const canSave = useMemo(() => resolvedGroups.every(isGroupValid), [resolvedGroups, isGroupValid]);\n\n if (initializing) {\n return (\n <div className={styles.container}>\n <Spinner size=\"sm\" inline /> Loading configuration...\n </div>\n );\n }\n\n if (fetchError) {\n return (\n <div className={styles.container}>\n <FetchErrorState error={fetchError} dsUid={dsUid} buttonClassName={styles.buttons} />\n </div>\n );\n }\n\n if (resolvedGroups.length === 0) {\n return <></>;\n }\n\n const currentResolved = resolvedGroups[currentStep];\n const currentGroup = currentResolved?.group;\n const isFirstStep = currentStep === 0;\n const isLastStep = currentStep === resolvedGroups.length - 1;\n\n return (\n <div className={styles.container}>\n {submitting && (\n <div className={styles.overlay}>\n <Spinner size=\"sm\" />\n <span>Saving & testing…</span>\n </div>\n )}\n {readOnly && (\n <div className={styles.readOnlyBanner}>\n <Icon name=\"lock\" size=\"xs\" />\n <span>Read-only — managed externally</span>\n </div>\n )}\n <div className={styles.navBar}>\n {currentGroup && (\n <Tooltip content={currentGroup.description ?? currentGroup.title}>\n <span className={styles.navTitle}>\n {currentGroup.title}\n <span className={styles.stepCount}>\n {currentStep + 1}/{resolvedGroups.length}\n </span>\n </span>\n </Tooltip>\n )}\n <div className={styles.navActions}>\n <Tooltip content={isFirstStep ? 'First step' : `Previous: ${resolvedGroups[currentStep - 1]?.group.title}`}>\n <Button\n variant=\"secondary\"\n fill=\"text\"\n size=\"sm\"\n icon=\"angle-left\"\n aria-label=\"Previous\"\n onClick={() => setCurrentStep(currentStep - 1)}\n disabled={isFirstStep || submitting}\n type=\"button\"\n />\n </Tooltip>\n <Select\n options={resolvedGroups.map((g, i) => ({ label: g.group.title, value: i }))}\n value={currentStep}\n onChange={(v) => {\n if (v?.value != null) {\n trackConfigWizardSectionChange(v.label || v.title);\n setCurrentStep(v.value);\n }\n }}\n disabled={submitting}\n width={18}\n />\n <Tooltip content={isLastStep ? 'Last step' : `Next: ${resolvedGroups[currentStep + 1]?.group.title}`}>\n <Button\n variant={isLastStep ? 'secondary' : 'primary'}\n size=\"sm\"\n icon=\"angle-right\"\n aria-label=\"Next\"\n onClick={() => setCurrentStep(currentStep + 1)}\n disabled={isLastStep || submitting}\n type=\"button\"\n />\n </Tooltip>\n </div>\n </div>\n\n {currentResolved && (\n <form onSubmit={handleSubmit(onSubmit)} className={styles.form}>\n <GroupFields\n group={currentResolved}\n form={form}\n dsUid={dsUid}\n showAuthHeaders={currentResolved.group.id === '_required' || isAuthGroupId(currentResolved.group.id)}\n />\n <FormFooter\n form={form}\n schema={schema}\n dsUid={dsUid}\n dsName={dsName}\n onRetest={onRetest}\n healthError={healthError}\n renderActions={renderActions}\n saveDisabled={submitting || !canSave}\n className={styles.buttons}\n />\n </form>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { resolveGroups, resolveRequiredFieldsGroup, formKey, computeVirtualField
4
4
  import { fetchExistingValues, submitDatasourceConfig } from '../datasource.js';
5
5
  import { evaluateEffectCondition } from '../inputs/fieldUtils.js';
6
6
  import { buildFieldCelContext, isFieldVisible, isGroupValid, isFieldDisabled, groupHasData } from './formInterpreter.js';
7
+ import { trackConfigWizardSubmitEvent } from '../tracking.js';
7
8
 
8
9
  function useDatasourceConfigForm(props) {
9
10
  const { schema, dsUid, onSuccess, onSaving } = props;
@@ -193,8 +194,10 @@ function useDatasourceConfigForm(props) {
193
194
  const merged = { ...defaults, ...refreshed.values };
194
195
  const virtualValues = computeVirtualFieldValues(schema, merged);
195
196
  reset({ ...merged, ...virtualValues });
197
+ trackConfigWizardSubmitEvent({ success: true });
196
198
  onSuccess("UPDATED", "Configuration saved.");
197
199
  } catch (err) {
200
+ trackConfigWizardSubmitEvent({ success: false });
198
201
  await minDelay;
199
202
  setSubmitError(err instanceof Error ? err.message : "Failed to update datasource");
200
203
  } finally {
@@ -1 +1 @@
1
- {"version":3,"file":"useDatasourceConfigForm.js","sources":["../../../../../../src/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport type { ConfigField, DatasourceConfigSchema } from '../../../../schema/schema';\nimport {\n resolveGroups,\n resolveRequiredFieldsGroup,\n parseDependsOn,\n evaluateDependsOn,\n computeVirtualFieldValues,\n formKey,\n getWatchedValue,\n type ResolvedGroup,\n} from '../config';\nimport { fetchExistingValues, submitDatasourceConfig, type FormValues } from '../datasource';\nimport { evaluateEffectCondition } from '../inputs/fieldUtils';\nimport {\n buildFieldCelContext,\n isFieldVisible as isFieldVisibleImpl,\n isFieldDisabled as isFieldDisabledImpl,\n isGroupValid as isGroupValidImpl,\n groupHasData as groupHasDataImpl,\n} from './formInterpreter';\n\nexport type DatasourceConfigFormOptions = {\n schema: DatasourceConfigSchema;\n dsUid: string;\n onSuccess: (status: string, message?: string) => void;\n onSaving?: (saving: boolean) => void;\n};\n\nexport function useDatasourceConfigForm(props: DatasourceConfigFormOptions) {\n const { schema, dsUid, onSuccess, onSaving } = props;\n const [submitting, setSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [initializing, setInitializing] = useState(true);\n const [fetchError, setFetchError] = useState<string | null>(null);\n const [detectedReadOnly, setDetectedReadOnly] = useState(false);\n const readOnly = detectedReadOnly;\n\n const resolvedGroups: ResolvedGroup[] = useMemo(() => {\n const groups = resolveGroups(schema);\n const requiredGroup = resolveRequiredFieldsGroup(schema);\n if (!requiredGroup) {\n return groups;\n }\n return [requiredGroup, ...groups];\n }, [schema]);\n\n const fieldById = useMemo(() => {\n const m = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n m.set(f.id, f);\n }\n return m;\n }, [schema.fields]);\n\n const httpHeadersField = useMemo(\n () => schema.fields.find((f) => f.key === 'httpHeaders' && f.storage?.type === 'indexedPair') ?? null,\n [schema.fields]\n );\n\n const allStorageFields = useMemo(\n () => schema.fields.filter((f) => f.kind !== 'virtual' && !f.isItemField && f.target),\n [schema.fields]\n );\n\n const {\n control,\n handleSubmit,\n watch,\n reset,\n trigger,\n setValue,\n formState: { errors },\n } = useForm<FormValues>({ mode: 'onChange' });\n\n const fieldsWithEffects = useMemo(() => {\n const result: Array<{\n sourceKey: string;\n effects: Array<{ when: string; targets: Array<{ key: string; value: unknown }> }>;\n }> = [];\n for (const field of schema.fields) {\n if (!field.effects || field.effects.length === 0) {\n continue;\n }\n const mapped = field.effects.map((eff) => ({\n when: eff.when,\n targets: Object.entries(eff.set).map(([targetId, val]) => {\n const targetField = fieldById.get(targetId);\n return { key: targetField ? formKey(targetField) : targetId, value: val };\n }),\n }));\n result.push({ sourceKey: formKey(field), effects: mapped });\n }\n return result;\n }, [schema.fields, fieldById]);\n\n // Load existing values on mount\n useEffect(() => {\n let cancelled = false;\n fetchExistingValues(dsUid, allStorageFields).then((result) => {\n if (cancelled) {\n return;\n }\n if (result.error) {\n setFetchError(result.error);\n setInitializing(false);\n return;\n }\n if (result.readOnly) {\n setDetectedReadOnly(true);\n }\n const defaults: FormValues = {};\n for (const field of allStorageFields) {\n if (field.defaultValue !== undefined) {\n defaults[formKey(field)] = field.defaultValue;\n }\n }\n const merged = { ...defaults, ...result.values };\n const virtualValues = computeVirtualFieldValues(schema, merged);\n reset({ ...merged, ...virtualValues });\n setInitializing(false);\n });\n return () => {\n cancelled = true;\n };\n }, [dsUid, allStorageFields, schema, reset]);\n\n const watchedValues = watch();\n\n // Apply field effects\n const prevEffectValuesRef = useRef<Record<string, unknown>>({});\n useEffect(() => {\n if (initializing) {\n return;\n }\n for (const { sourceKey, effects } of fieldsWithEffects) {\n const currentVal = getWatchedValue(watchedValues, sourceKey);\n const prevVal = prevEffectValuesRef.current[sourceKey];\n if (currentVal === prevVal) {\n continue;\n }\n prevEffectValuesRef.current[sourceKey] = currentVal;\n for (const eff of effects) {\n if (evaluateEffectCondition(eff.when, currentVal)) {\n for (const { key, value } of eff.targets) {\n setValue(key, value);\n }\n break;\n }\n }\n }\n }, [watchedValues, fieldsWithEffects, initializing, setValue]);\n\n // Override defaults\n const fieldsWithOverrideDefaults = useMemo(() => {\n const result: Array<{\n targetKey: string;\n fieldDefault: unknown;\n overrides: Array<{ depKey: string; depValue: string; negate: boolean; defaultValue: unknown }>;\n }> = [];\n for (const field of schema.fields) {\n if (!field.overrides || field.overrides.length === 0) {\n continue;\n }\n const ovs = field.overrides\n .filter((ov) => ov.defaultValue !== undefined)\n .map((ov) => {\n const parsed = parseDependsOn(ov.when);\n if (!parsed) {\n return null;\n }\n const depField = fieldById.get(parsed.field);\n return {\n depKey: depField ? formKey(depField) : parsed.field,\n depValue: parsed.value,\n negate: parsed.negate,\n defaultValue: ov.defaultValue,\n };\n })\n .filter(Boolean) as Array<{ depKey: string; depValue: string; negate: boolean; defaultValue: unknown }>;\n if (ovs.length > 0) {\n result.push({ targetKey: formKey(field), fieldDefault: field.defaultValue, overrides: ovs });\n }\n }\n return result;\n }, [schema.fields, fieldById]);\n\n const prevOverrideDepRef = useRef<Record<string, string>>({});\n useEffect(() => {\n if (initializing) {\n return;\n }\n for (const { targetKey, fieldDefault, overrides } of fieldsWithOverrideDefaults) {\n for (const ov of overrides) {\n const currentDepVal = String(getWatchedValue(watchedValues, ov.depKey) ?? '');\n const trackKey = `${targetKey}::${ov.depKey}`;\n const prevDepVal = prevOverrideDepRef.current[trackKey];\n if (currentDepVal === prevDepVal) {\n continue;\n }\n prevOverrideDepRef.current[trackKey] = currentDepVal;\n const active = evaluateDependsOn({ value: ov.depValue, negate: ov.negate }, currentDepVal);\n const wasActive =\n prevDepVal !== undefined && evaluateDependsOn({ value: ov.depValue, negate: ov.negate }, prevDepVal);\n if (active) {\n setValue(targetKey, ov.defaultValue);\n } else if (wasActive && fieldDefault !== undefined) {\n setValue(targetKey, fieldDefault);\n }\n }\n }\n }, [watchedValues, fieldsWithOverrideDefaults, initializing, setValue]);\n\n // Build a CEL-compatible nested context from flat watched values + field ID mappings.\n const celContext = useMemo(() => buildFieldCelContext(fieldById, watchedValues), [watchedValues, fieldById]);\n\n const isFieldVisible = useCallback(\n (field: ConfigField): boolean => isFieldVisibleImpl(field, fieldById, celContext),\n [celContext, fieldById]\n );\n\n const onSubmit = useCallback(\n async (data: FormValues) => {\n setSubmitting(true);\n setSubmitError(null);\n onSaving?.(true);\n // just introduced 2 second delay to add a visual hue. Can be removed if nor required.\n const minDelay = new Promise((r) => setTimeout(r, 2000));\n try {\n await submitDatasourceConfig(dsUid, data, allStorageFields, isFieldVisible);\n const [refreshed] = await Promise.all([fetchExistingValues(dsUid, allStorageFields), minDelay]);\n const defaults: FormValues = {};\n for (const field of allStorageFields) {\n if (field.defaultValue !== undefined) {\n defaults[formKey(field)] = field.defaultValue;\n }\n }\n const merged = { ...defaults, ...refreshed.values };\n const virtualValues = computeVirtualFieldValues(schema, merged);\n reset({ ...merged, ...virtualValues });\n onSuccess('UPDATED', 'Configuration saved.');\n } catch (err: unknown) {\n await minDelay;\n setSubmitError(err instanceof Error ? err.message : 'Failed to update datasource');\n } finally {\n setSubmitting(false);\n onSaving?.(false);\n }\n },\n [dsUid, allStorageFields, isFieldVisible, schema, reset, onSuccess, onSaving]\n );\n\n const isGroupValid = useCallback(\n (group: ResolvedGroup): boolean =>\n isGroupValidImpl(group, {\n watchedValues,\n fieldById,\n celContext,\n errors: errors as Record<string, unknown>,\n isVisible: isFieldVisible,\n }),\n [errors, watchedValues, fieldById, celContext, isFieldVisible]\n );\n\n const isFieldDisabled = useCallback(\n (field: ConfigField): boolean => isFieldDisabledImpl(field, celContext),\n [celContext]\n );\n\n const groupHasData = useCallback(\n (group: ResolvedGroup): boolean => groupHasDataImpl(group, watchedValues),\n [watchedValues]\n );\n\n return {\n // Schema\n resolvedGroups,\n fieldById,\n httpHeadersField,\n // Form\n control,\n handleSubmit,\n trigger,\n errors,\n watchedValues,\n celContext,\n // State\n initializing,\n fetchError,\n submitting,\n submitError,\n readOnly,\n // Callbacks\n isFieldVisible,\n isFieldDisabled,\n isGroupValid,\n groupHasData,\n onSubmit,\n setValue,\n };\n}\n"],"names":["_a","isFieldVisible","isFieldVisibleImpl","isGroupValid","isGroupValidImpl","isFieldDisabled","isFieldDisabledImpl","groupHasData","groupHasDataImpl"],"mappings":"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"}
1
+ {"version":3,"file":"useDatasourceConfigForm.js","sources":["../../../../../../src/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport type { ConfigField, DatasourceConfigSchema } from '../../../../schema/schema';\nimport {\n resolveGroups,\n resolveRequiredFieldsGroup,\n parseDependsOn,\n evaluateDependsOn,\n computeVirtualFieldValues,\n formKey,\n getWatchedValue,\n type ResolvedGroup,\n} from '../config';\nimport { fetchExistingValues, submitDatasourceConfig, type FormValues } from '../datasource';\nimport { evaluateEffectCondition } from '../inputs/fieldUtils';\nimport {\n buildFieldCelContext,\n isFieldVisible as isFieldVisibleImpl,\n isFieldDisabled as isFieldDisabledImpl,\n isGroupValid as isGroupValidImpl,\n groupHasData as groupHasDataImpl,\n} from './formInterpreter';\nimport { trackConfigWizardSubmitEvent } from '../tracking';\n\nexport type DatasourceConfigFormOptions = {\n schema: DatasourceConfigSchema;\n dsUid: string;\n onSuccess: (status: string, message?: string) => void;\n onSaving?: (saving: boolean) => void;\n};\n\nexport function useDatasourceConfigForm(props: DatasourceConfigFormOptions) {\n const { schema, dsUid, onSuccess, onSaving } = props;\n const [submitting, setSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [initializing, setInitializing] = useState(true);\n const [fetchError, setFetchError] = useState<string | null>(null);\n const [detectedReadOnly, setDetectedReadOnly] = useState(false);\n const readOnly = detectedReadOnly;\n\n const resolvedGroups: ResolvedGroup[] = useMemo(() => {\n const groups = resolveGroups(schema);\n const requiredGroup = resolveRequiredFieldsGroup(schema);\n if (!requiredGroup) {\n return groups;\n }\n return [requiredGroup, ...groups];\n }, [schema]);\n\n const fieldById = useMemo(() => {\n const m = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n m.set(f.id, f);\n }\n return m;\n }, [schema.fields]);\n\n const httpHeadersField = useMemo(\n () => schema.fields.find((f) => f.key === 'httpHeaders' && f.storage?.type === 'indexedPair') ?? null,\n [schema.fields]\n );\n\n const allStorageFields = useMemo(\n () => schema.fields.filter((f) => f.kind !== 'virtual' && !f.isItemField && f.target),\n [schema.fields]\n );\n\n const {\n control,\n handleSubmit,\n watch,\n reset,\n trigger,\n setValue,\n formState: { errors },\n } = useForm<FormValues>({ mode: 'onChange' });\n\n const fieldsWithEffects = useMemo(() => {\n const result: Array<{\n sourceKey: string;\n effects: Array<{ when: string; targets: Array<{ key: string; value: unknown }> }>;\n }> = [];\n for (const field of schema.fields) {\n if (!field.effects || field.effects.length === 0) {\n continue;\n }\n const mapped = field.effects.map((eff) => ({\n when: eff.when,\n targets: Object.entries(eff.set).map(([targetId, val]) => {\n const targetField = fieldById.get(targetId);\n return { key: targetField ? formKey(targetField) : targetId, value: val };\n }),\n }));\n result.push({ sourceKey: formKey(field), effects: mapped });\n }\n return result;\n }, [schema.fields, fieldById]);\n\n // Load existing values on mount\n useEffect(() => {\n let cancelled = false;\n fetchExistingValues(dsUid, allStorageFields).then((result) => {\n if (cancelled) {\n return;\n }\n if (result.error) {\n setFetchError(result.error);\n setInitializing(false);\n return;\n }\n if (result.readOnly) {\n setDetectedReadOnly(true);\n }\n const defaults: FormValues = {};\n for (const field of allStorageFields) {\n if (field.defaultValue !== undefined) {\n defaults[formKey(field)] = field.defaultValue;\n }\n }\n const merged = { ...defaults, ...result.values };\n const virtualValues = computeVirtualFieldValues(schema, merged);\n reset({ ...merged, ...virtualValues });\n setInitializing(false);\n });\n return () => {\n cancelled = true;\n };\n }, [dsUid, allStorageFields, schema, reset]);\n\n const watchedValues = watch();\n\n // Apply field effects\n const prevEffectValuesRef = useRef<Record<string, unknown>>({});\n useEffect(() => {\n if (initializing) {\n return;\n }\n for (const { sourceKey, effects } of fieldsWithEffects) {\n const currentVal = getWatchedValue(watchedValues, sourceKey);\n const prevVal = prevEffectValuesRef.current[sourceKey];\n if (currentVal === prevVal) {\n continue;\n }\n prevEffectValuesRef.current[sourceKey] = currentVal;\n for (const eff of effects) {\n if (evaluateEffectCondition(eff.when, currentVal)) {\n for (const { key, value } of eff.targets) {\n setValue(key, value);\n }\n break;\n }\n }\n }\n }, [watchedValues, fieldsWithEffects, initializing, setValue]);\n\n // Override defaults\n const fieldsWithOverrideDefaults = useMemo(() => {\n const result: Array<{\n targetKey: string;\n fieldDefault: unknown;\n overrides: Array<{ depKey: string; depValue: string; negate: boolean; defaultValue: unknown }>;\n }> = [];\n for (const field of schema.fields) {\n if (!field.overrides || field.overrides.length === 0) {\n continue;\n }\n const ovs = field.overrides\n .filter((ov) => ov.defaultValue !== undefined)\n .map((ov) => {\n const parsed = parseDependsOn(ov.when);\n if (!parsed) {\n return null;\n }\n const depField = fieldById.get(parsed.field);\n return {\n depKey: depField ? formKey(depField) : parsed.field,\n depValue: parsed.value,\n negate: parsed.negate,\n defaultValue: ov.defaultValue,\n };\n })\n .filter(Boolean) as Array<{ depKey: string; depValue: string; negate: boolean; defaultValue: unknown }>;\n if (ovs.length > 0) {\n result.push({ targetKey: formKey(field), fieldDefault: field.defaultValue, overrides: ovs });\n }\n }\n return result;\n }, [schema.fields, fieldById]);\n\n const prevOverrideDepRef = useRef<Record<string, string>>({});\n useEffect(() => {\n if (initializing) {\n return;\n }\n for (const { targetKey, fieldDefault, overrides } of fieldsWithOverrideDefaults) {\n for (const ov of overrides) {\n const currentDepVal = String(getWatchedValue(watchedValues, ov.depKey) ?? '');\n const trackKey = `${targetKey}::${ov.depKey}`;\n const prevDepVal = prevOverrideDepRef.current[trackKey];\n if (currentDepVal === prevDepVal) {\n continue;\n }\n prevOverrideDepRef.current[trackKey] = currentDepVal;\n const active = evaluateDependsOn({ value: ov.depValue, negate: ov.negate }, currentDepVal);\n const wasActive =\n prevDepVal !== undefined && evaluateDependsOn({ value: ov.depValue, negate: ov.negate }, prevDepVal);\n if (active) {\n setValue(targetKey, ov.defaultValue);\n } else if (wasActive && fieldDefault !== undefined) {\n setValue(targetKey, fieldDefault);\n }\n }\n }\n }, [watchedValues, fieldsWithOverrideDefaults, initializing, setValue]);\n\n // Build a CEL-compatible nested context from flat watched values + field ID mappings.\n const celContext = useMemo(() => buildFieldCelContext(fieldById, watchedValues), [watchedValues, fieldById]);\n\n const isFieldVisible = useCallback(\n (field: ConfigField): boolean => isFieldVisibleImpl(field, fieldById, celContext),\n [celContext, fieldById]\n );\n\n const onSubmit = useCallback(\n async (data: FormValues) => {\n setSubmitting(true);\n setSubmitError(null);\n onSaving?.(true);\n // just introduced 2 second delay to add a visual hue. Can be removed if nor required.\n const minDelay = new Promise((r) => setTimeout(r, 2000));\n try {\n await submitDatasourceConfig(dsUid, data, allStorageFields, isFieldVisible);\n const [refreshed] = await Promise.all([fetchExistingValues(dsUid, allStorageFields), minDelay]);\n const defaults: FormValues = {};\n for (const field of allStorageFields) {\n if (field.defaultValue !== undefined) {\n defaults[formKey(field)] = field.defaultValue;\n }\n }\n const merged = { ...defaults, ...refreshed.values };\n const virtualValues = computeVirtualFieldValues(schema, merged);\n reset({ ...merged, ...virtualValues });\n trackConfigWizardSubmitEvent({ success: true });\n onSuccess('UPDATED', 'Configuration saved.');\n } catch (err: unknown) {\n trackConfigWizardSubmitEvent({ success: false });\n await minDelay;\n setSubmitError(err instanceof Error ? err.message : 'Failed to update datasource');\n } finally {\n setSubmitting(false);\n onSaving?.(false);\n }\n },\n [dsUid, allStorageFields, isFieldVisible, schema, reset, onSuccess, onSaving]\n );\n\n const isGroupValid = useCallback(\n (group: ResolvedGroup): boolean =>\n isGroupValidImpl(group, {\n watchedValues,\n fieldById,\n celContext,\n errors: errors as Record<string, unknown>,\n isVisible: isFieldVisible,\n }),\n [errors, watchedValues, fieldById, celContext, isFieldVisible]\n );\n\n const isFieldDisabled = useCallback(\n (field: ConfigField): boolean => isFieldDisabledImpl(field, celContext),\n [celContext]\n );\n\n const groupHasData = useCallback(\n (group: ResolvedGroup): boolean => groupHasDataImpl(group, watchedValues),\n [watchedValues]\n );\n\n return {\n // Schema\n resolvedGroups,\n fieldById,\n httpHeadersField,\n // Form\n control,\n handleSubmit,\n trigger,\n errors,\n watchedValues,\n celContext,\n // State\n initializing,\n fetchError,\n submitting,\n submitError,\n readOnly,\n // Callbacks\n isFieldVisible,\n isFieldDisabled,\n isGroupValid,\n groupHasData,\n onSubmit,\n setValue,\n };\n}\n"],"names":["_a","isFieldVisible","isFieldVisibleImpl","isGroupValid","isGroupValidImpl","isFieldDisabled","isFieldDisabledImpl","groupHasData","groupHasDataImpl"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { getConfigSchema } from '../../../../schema/utils/registry.js';
3
+
4
+ function useDatasourceSchema(pluginType) {
5
+ const [schema, setSchema] = useState(null);
6
+ const [loading, setLoading] = useState(false);
7
+ const [error, setError] = useState(null);
8
+ useEffect(() => {
9
+ let cancelled = false;
10
+ setLoading(true);
11
+ setError(null);
12
+ fetchConfigSchema(pluginType).then((result) => {
13
+ if (!cancelled) {
14
+ setSchema(result);
15
+ }
16
+ }).catch((err) => {
17
+ if (!cancelled) {
18
+ setError(err instanceof Error ? err.message : String(err));
19
+ }
20
+ }).finally(() => {
21
+ if (!cancelled) {
22
+ setLoading(false);
23
+ }
24
+ });
25
+ return () => {
26
+ cancelled = true;
27
+ };
28
+ }, [pluginType]);
29
+ return { schema, loading, error };
30
+ }
31
+ function fetchConfigSchema(pluginType) {
32
+ if (!pluginType) {
33
+ return Promise.resolve(null);
34
+ }
35
+ return getConfigSchema(pluginType);
36
+ }
37
+
38
+ export { fetchConfigSchema, useDatasourceSchema };
39
+ //# sourceMappingURL=useDatasourceSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDatasourceSchema.js","sources":["../../../../../../src/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceSchema.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { getConfigSchema } from '../../../../schema/utils/registry';\nimport type { DatasourceConfigSchema } from '../../../../schema/schema';\n\ntype UseDatasourceSchemaResult = { schema: DatasourceConfigSchema | null; loading: boolean; error: string | null };\n\nexport function useDatasourceSchema(pluginType: string): UseDatasourceSchemaResult {\n const [schema, setSchema] = useState<DatasourceConfigSchema | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setError(null);\n fetchConfigSchema(pluginType)\n .then((result) => {\n if (!cancelled) {\n setSchema(result);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n }\n })\n .finally(() => {\n if (!cancelled) {\n setLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [pluginType]);\n\n return { schema, loading, error };\n}\n\nexport function fetchConfigSchema(pluginType: string): Promise<DatasourceConfigSchema | null> {\n if (!pluginType) {\n return Promise.resolve(null);\n }\n return getConfigSchema(pluginType);\n}\n"],"names":[],"mappings":";;;AAMO,SAAS,oBAAoB,UAAA,EAA+C;AACjF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAwC,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAkB,KAAK,CAAA;AACrD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,iBAAA,CAAkB,UAAU,CAAA,CACzB,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,CAAU,MAAM,CAAA;AAAA,MAClB;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,MAC3D;AAAA,IACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAM;AAClC;AAEO,SAAS,kBAAkB,UAAA,EAA4D;AAC5F,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,gBAAgB,UAAU,CAAA;AACnC;;;;"}
@@ -0,0 +1,18 @@
1
+ import { reportInteraction, config } from '@grafana/runtime';
2
+
3
+ const trackConfigWizardSectionChange = (config_section = "default", plugin_id = "unknown") => {
4
+ reportInteraction("grafana_dsconfig_section_visited", {
5
+ config_section,
6
+ plugin_id,
7
+ grafana_version: config.buildInfo.version
8
+ });
9
+ };
10
+ const trackConfigWizardSubmitEvent = (props) => {
11
+ reportInteraction("grafana_dsconfig_submitted", {
12
+ ...props,
13
+ grafana_version: config.buildInfo.version
14
+ });
15
+ };
16
+
17
+ export { trackConfigWizardSectionChange, trackConfigWizardSubmitEvent };
18
+ //# sourceMappingURL=tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/tracking.ts"],"sourcesContent":["import { config, reportInteraction } from '@grafana/runtime';\n\nexport const trackConfigWizardSectionChange = (config_section = 'default', plugin_id = 'unknown') => {\n reportInteraction('grafana_dsconfig_section_visited', {\n config_section,\n plugin_id,\n grafana_version: config.buildInfo.version,\n });\n};\n\ntype trackConfigWizardSubmitEventProps = { success?: boolean };\n\nexport const trackConfigWizardSubmitEvent = (props: trackConfigWizardSubmitEventProps) => {\n reportInteraction('grafana_dsconfig_submitted', {\n ...props,\n grafana_version: config.buildInfo.version,\n });\n};\n"],"names":[],"mappings":";;AAEO,MAAM,8BAAA,GAAiC,CAAC,cAAA,GAAiB,SAAA,EAAW,YAAY,SAAA,KAAc;AACnG,EAAA,iBAAA,CAAkB,kCAAA,EAAoC;AAAA,IACpD,cAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA,EAAiB,OAAO,SAAA,CAAU;AAAA,GACnC,CAAA;AACH;AAIO,MAAM,4BAAA,GAA+B,CAAC,KAAA,KAA6C;AACxF,EAAA,iBAAA,CAAkB,4BAAA,EAA8B;AAAA,IAC9C,GAAG,KAAA;AAAA,IACH,eAAA,EAAiB,OAAO,SAAA,CAAU;AAAA,GACnC,CAAA;AACH;;;;"}
@@ -1521,6 +1521,14 @@ declare function useHealthChecks(): {
1521
1521
 
1522
1522
  declare function resolvePluginName(pluginType: string): string;
1523
1523
 
1524
+ type UseDatasourceSchemaResult = {
1525
+ schema: DatasourceConfigSchema | null;
1526
+ loading: boolean;
1527
+ error: string | null;
1528
+ };
1529
+ declare function useDatasourceSchema(pluginType: string): UseDatasourceSchemaResult;
1530
+ declare function fetchConfigSchema(pluginType: string): Promise<DatasourceConfigSchema | null>;
1531
+
1524
1532
  /**
1525
1533
  * CEL (Common Expression Language) expression evaluator for schema conditions.
1526
1534
  *
@@ -2008,5 +2016,5 @@ interface RequestLoopOptions<TQuery extends DataQuery$1 = DataQuery$1> {
2008
2016
  */
2009
2017
  declare function getRequestLooper<T extends DataQuery$1 = DataQuery$1>(req: DataQueryRequest<T>, options: RequestLoopOptions<T>): Observable<DataQueryResponse>;
2010
2018
 
2011
- export { AUTH_GROUP_IDS, AccessoryButton, AdvancedHttpSettings, Auth, AuthMethod, BINARY_OPERATIONS_KEY, CatalogSelector, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, DataLink, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, DatasourceConfigWizard, DatasourceErrorBoundary, DatasourceWithAsyncBackend, DatePicker, DatePickerWithInput, DebounceInput, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, InlineSelect, InputGroup, LabelFilters, LinkedToken, MacroType, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, QUERY_FORMAT_OPTIONS, QueryBuilderHints, QueryEditorMode, QueryEditorModeToggle, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, ROOT_CONFIG_FIELDS, RawQuery, RunQueryButton, RunQueryButtons, SQLEditor, SQLEditorMode, SQLEditorTestUtils, SecureSocksProxyToggle, Segment, Space, SqlDatasource, SqlQueryEditor, StatementPosition, SuggestionKind, TLSSettings, TableSelector, TokenType, buildCelContext, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload, clearExpressionCache, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateCelDirect, evaluateCelExpression, evaluateComputedRead, evaluateDependsOn, extractFieldRefs, formKey, formatDate, formatYamlDiff, generateLLMHint, generateProvisioningTemplate, generateTroubleshootingFields, getConfigSchema, getRequestLooper, getStandardSQLCompletionProvider, getWatchedValue, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, isAuthGroupId, isValidCelExpression, parseDependsOn, resolveActiveOverride, resolveGroups, resolvePluginName, resolveRequiredFieldsGroup, toOption, useHealthChecks };
2019
+ export { AUTH_GROUP_IDS, AccessoryButton, AdvancedHttpSettings, Auth, AuthMethod, BINARY_OPERATIONS_KEY, CatalogSelector, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, DataLink, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, DatasourceConfigWizard, DatasourceErrorBoundary, DatasourceWithAsyncBackend, DatePicker, DatePickerWithInput, DebounceInput, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, InlineSelect, InputGroup, LabelFilters, LinkedToken, MacroType, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, QUERY_FORMAT_OPTIONS, QueryBuilderHints, QueryEditorMode, QueryEditorModeToggle, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, ROOT_CONFIG_FIELDS, RawQuery, RunQueryButton, RunQueryButtons, SQLEditor, SQLEditorMode, SQLEditorTestUtils, SecureSocksProxyToggle, Segment, Space, SqlDatasource, SqlQueryEditor, StatementPosition, SuggestionKind, TLSSettings, TableSelector, TokenType, buildCelContext, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload, clearExpressionCache, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateCelDirect, evaluateCelExpression, evaluateComputedRead, evaluateDependsOn, extractFieldRefs, fetchConfigSchema, formKey, formatDate, formatYamlDiff, generateLLMHint, generateProvisioningTemplate, generateTroubleshootingFields, getConfigSchema, getRequestLooper, getStandardSQLCompletionProvider, getWatchedValue, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, isAuthGroupId, isValidCelExpression, parseDependsOn, resolveActiveOverride, resolveGroups, resolvePluginName, resolveRequiredFieldsGroup, toOption, useDatasourceSchema, useHealthChecks };
2012
2020
  export type { Aggregate, AllowedValuesValidationRule, Props$c as AuthProps, BaseFieldRef, BaseValidationRule, ColumnDefinition, ComputedMapping, ConfigField, ConfigGroup, CustomMeta, CustomValidationRule, DB, DataLinkConfig, DatasourceConfigSchema, DatasourceConfigWizardProps, DatasourceHealth, DatePickerProps, DatePickerWithInputProps, DebounceInputProps, DirectMapping, Expression, FieldEffect, FieldItemSchema, FieldKind, FieldOption, FieldOverride, FieldPack, FieldPackID, FieldPatch, FieldRelationship, FieldUI, FieldValidationRule, FormState, HealthState, IndexedPairMapping, Instruction, ItemCountValidationRule, LanguageCompletionProvider, LanguageDefinition, LengthValidationRule, MappingField, MetaDefinition, NameValue, PatternValidationRule, PositionContext, Props$s as Props, QueryBuilderLabelFilter, QueryBuilderOperation, QueryBuilderOperationDefinition, QueryBuilderOperationParamDef, QueryBuilderOperationParamEditorProps, QueryBuilderOperationParamValue, QueryEditorProps, QueryRowFilter, QueryStats, QueryWithDefaults, RAQBFieldTypes, RangeValidationRule, RelationshipType, RequestLoopOptions, ResolvedGroup, ResourceSelectorProps, ResponseParser, Role, RunQueryButtonsProps, RunningQueryInfo, SQLConnectionLimits, SQLExpression, SQLFilters, SQLMonarchLanguage, SQLOptions, SQLQuery, SQLSelectableValue, SchemaDefinition, SecureFieldState, SegmentProps, SqlQueryForInterpolation, SqlQueryModel, State$1 as State, StatementPlacementProvider, StorageMapping, SuggestionKindProvider, Props$f as TLSSettingsProps, TableDefinition, TableFieldSchema, TableIdentifier, TableSchema, TargetLocation, TestQueryModel, UIComponent, UIWidth, ValidationResults, ValueType, VisualQuery, VisualQueryBinary, VisualQueryModeller };
package/dist/esm/index.js CHANGED
@@ -41,6 +41,7 @@ export { DatasourceConfigWizard } from './components/ConfigEditor/DatasourceConf
41
41
  export { DatasourceErrorBoundary } from './components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js';
42
42
  export { useHealthChecks } from './components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js';
43
43
  export { resolvePluginName } from './components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js';
44
+ export { fetchConfigSchema, useDatasourceSchema } from './components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceSchema.js';
44
45
  export { buildCelContext, clearExpressionCache, evaluateCelDirect, evaluateCelExpression, extractFieldRefs, isValidCelExpression } from './components/ConfigEditor/DatasourceConfigWizard/cel.js';
45
46
  export { AUTH_GROUP_IDS, computeVirtualFieldValues, evaluateComputedRead, evaluateDependsOn, formKey, getWatchedValue, isAuthGroupId, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup } from './components/ConfigEditor/DatasourceConfigWizard/config.js';
46
47
  export { CustomHeadersSettings } from './components/CustomHeadersSettings/CustomHeadersSettings.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafana/plugin-ui",
3
- "version": "0.17.1",
3
+ "version": "0.17.3",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+ssh://git@github.com/grafana/plugin-ui.git"
@@ -74,12 +74,12 @@
74
74
  },
75
75
  "devDependencies": {
76
76
  "@arethetypeswrong/cli": "0.18.5",
77
- "@grafana/data": "13.1.0",
78
- "@grafana/e2e-selectors": "13.1.0",
77
+ "@grafana/data": "13.1.1",
78
+ "@grafana/e2e-selectors": "13.1.1",
79
79
  "@grafana/eslint-config": "8.2.0",
80
- "@grafana/runtime": "13.1.0",
80
+ "@grafana/runtime": "13.1.1",
81
81
  "@grafana/tsconfig": "2.2.0",
82
- "@grafana/ui": "13.1.0",
82
+ "@grafana/ui": "13.1.1",
83
83
  "@rollup/plugin-commonjs": "29.0.3",
84
84
  "@rollup/plugin-json": "6.1.0",
85
85
  "@rollup/plugin-node-resolve": "16.0.3",