@grafana/plugin-ui 0.14.1-dsconfig.bccd84e → 0.14.1-dsconfig.f7c437a

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.
@@ -1013,206 +1013,340 @@ type Props$a<C extends Config = Config> = {
1013
1013
  };
1014
1014
  declare const AdvancedHttpSettings: <C extends Config = Config>(props: Props$a<C>) => JSX.Element;
1015
1015
 
1016
- /**
1017
- * Datasource configuration schema types and pure helper functions.
1018
- *
1019
- * These types describe the structure of datasource plugin configuration schemas
1020
- * (dsconfig format). Schemas define fields, groups, validations, and relationships
1021
- * that drive the DatasourceConfigWizard UI and provisioning YAML generation.
1022
- */
1023
- type DatasourceConfigSchema = {
1016
+ interface DatasourceConfigSchema {
1017
+ /**
1018
+ * Schema version (required)
1019
+ * Used for compatibility and migrations
1020
+ *
1021
+ * Example: "v2"
1022
+ */
1024
1023
  schemaVersion: string;
1024
+ /**
1025
+ * Unique datasource plugin identifier
1026
+ * Example: "prometheus"
1027
+ */
1025
1028
  pluginType: string;
1029
+ /**
1030
+ * Human-readable name
1031
+ */
1026
1032
  pluginName: string;
1033
+ /**
1034
+ * Optional documentation URL
1035
+ */
1027
1036
  docURL?: string;
1037
+ /**
1038
+ * Source of truth for configuration
1039
+ */
1028
1040
  fields: ConfigField[];
1041
+ /**
1042
+ * Optional UI grouping
1043
+ */
1029
1044
  groups?: ConfigGroup[];
1045
+ /**
1046
+ * Relationships between fields
1047
+ */
1030
1048
  relationships?: FieldRelationship[];
1031
- };
1032
- type ConfigField = {
1049
+ }
1050
+ interface ConfigField {
1051
+ /**
1052
+ * Globally unique identifier
1053
+ * Recommended format: dot-separated path
1054
+ * Example: "auth.method", "httpHeaders.item.key"
1055
+ */
1033
1056
  id: string;
1057
+ /**
1058
+ * Local key used in storage or object
1059
+ */
1034
1060
  key: string;
1061
+ /**
1062
+ * UI metadata
1063
+ */
1035
1064
  label?: string;
1036
1065
  description?: string;
1037
1066
  docURL?: string;
1067
+ /**
1068
+ * Core type of the field
1069
+ */
1038
1070
  valueType: ValueType;
1071
+ /**
1072
+ * Semantic meaning (optional)
1073
+ */
1039
1074
  semanticType?: SemanticType;
1075
+ /**
1076
+ * Storage location (required for storage fields)
1077
+ */
1040
1078
  target?: TargetLocation;
1079
+ /**
1080
+ * Dotted path prefix within the target for nested objects.
1081
+ * Example: for jsonData.tracesToLogs.datasourceUid,
1082
+ * target="jsonData", section="tracesToLogs", key="datasourceUid".
1083
+ */
1041
1084
  section?: string;
1085
+ /**
1086
+ * Field kind.
1087
+ * @default "storage"
1088
+ */
1042
1089
  kind?: FieldKind;
1090
+ /**
1091
+ * True if field belongs to array item schema
1092
+ */
1043
1093
  isItemField?: boolean;
1094
+ /**
1095
+ * Lifecycle state
1096
+ */
1044
1097
  lifecycle?: Lifecycle;
1098
+ /**
1099
+ * UI rendering hints
1100
+ */
1045
1101
  ui?: FieldUI;
1102
+ /**
1103
+ * Validations rules
1104
+ */
1046
1105
  validations?: FieldValidationRule[];
1047
- dependsOn?: string;
1106
+ /**
1107
+ * Visibility condition (CEL expression)
1108
+ */
1109
+ dependsOn?: Expression;
1110
+ /**
1111
+ * Always required
1112
+ */
1048
1113
  required?: boolean;
1049
- requiredWhen?: string;
1050
- disabledWhen?: string;
1114
+ /**
1115
+ * Conditionally required
1116
+ */
1117
+ requiredWhen?: Expression;
1118
+ /**
1119
+ * Disabled condition
1120
+ */
1121
+ disabledWhen?: Expression;
1122
+ /**
1123
+ * Dynamic overrides
1124
+ */
1051
1125
  overrides?: FieldOverride[];
1126
+ /**
1127
+ * Declarative multi-field write side-effects.
1128
+ * When this field's value matches a condition, the listed target
1129
+ * fields are set to specified values. Typically used on virtual
1130
+ * selector fields (e.g. auth method dropdown).
1131
+ */
1052
1132
  effects?: FieldEffect[];
1133
+ /**
1134
+ * Item schema for array elements or map values.
1135
+ * Required if valueType === "array" or "map".
1136
+ */
1053
1137
  item?: FieldItemSchema;
1138
+ /**
1139
+ * Legacy indexed fields (deprecated)
1140
+ */
1141
+ repeatable?: boolean;
1142
+ pattern?: string;
1143
+ /**
1144
+ * Storage mapping
1145
+ */
1054
1146
  storage?: StorageMapping;
1147
+ /**
1148
+ * Metadata
1149
+ */
1055
1150
  tags?: string[];
1056
1151
  examples?: unknown[];
1057
1152
  defaultValue?: unknown;
1058
- };
1059
- type FieldItemSchema = {
1153
+ }
1154
+ interface FieldItemSchema {
1155
+ /**
1156
+ * Type of array items or map values.
1157
+ * For arrays, describes each element.
1158
+ * For maps, describes each value (keys are always strings).
1159
+ */
1060
1160
  valueType: ValueType;
1161
+ /**
1162
+ * Sub-fields for object items. Optional even when valueType = "object"
1163
+ * (omitting allows an unconstrained object).
1164
+ */
1061
1165
  fields?: ConfigField[];
1062
- };
1166
+ }
1167
+ /**
1168
+ * CEL expression string
1169
+ */
1170
+ type Expression = string;
1063
1171
  type ValueType = 'string' | 'number' | 'boolean' | 'array' | 'object' | 'map' | 'any';
1064
1172
  type SemanticType = 'url' | 'password' | 'token' | 'hostname' | 'duration' | 'datasourceUid' | 'query';
1065
1173
  type FieldKind = 'storage' | 'virtual';
1066
1174
  type Lifecycle = 'stable' | 'deprecated' | 'experimental';
1067
1175
  type TargetLocation = 'root' | 'jsonData' | 'secureJsonData';
1068
1176
  type UIComponent = 'input' | 'textarea' | 'select' | 'multiselect' | 'radio' | 'checkbox' | 'switch' | 'code' | 'keyvalue' | 'list';
1069
- type FieldUI = {
1177
+ type UIWidth = 'full' | 'half';
1178
+ /**
1179
+ * UI configuration
1180
+ */
1181
+ interface FieldUI {
1070
1182
  component: UIComponent;
1071
1183
  multiline?: boolean;
1072
1184
  rows?: number;
1073
1185
  options?: FieldOption[];
1074
1186
  allowCustom?: boolean;
1075
- width?: 'full' | 'half';
1187
+ width?: UIWidth;
1076
1188
  placeholder?: string;
1189
+ /**
1190
+ * Language hint for code editor components.
1191
+ * Example: "promql", "logql", "traceql", "sql", "json"
1192
+ */
1077
1193
  language?: string;
1078
- };
1079
- type FieldOption = {
1080
- label: string;
1081
- value: unknown;
1082
- description?: string;
1083
- };
1084
- type FieldValidationRule = PatternValidation | RangeValidation | LengthValidation | ItemCountValidation | AllowedValuesValidation | CustomValidation;
1085
- type BaseValidation = {
1194
+ }
1195
+ type FieldValidationRule = PatternValidationRule | RangeValidationRule | LengthValidationRule | ItemCountValidationRule | AllowedValuesValidationRule | CustomValidationRule;
1196
+ interface BaseValidationRule {
1197
+ /**
1198
+ * Optional stable ID for the validation rule.
1199
+ * Useful for docs, localization, and test snapshots.
1200
+ */
1086
1201
  id?: string;
1202
+ /**
1203
+ * Human-readable validation error message.
1204
+ */
1087
1205
  message?: string;
1088
- };
1089
- type PatternValidation = BaseValidation & {
1206
+ }
1207
+ interface PatternValidationRule extends BaseValidationRule {
1090
1208
  type: 'pattern';
1091
1209
  pattern: string;
1092
- };
1093
- type RangeValidation = BaseValidation & {
1210
+ }
1211
+ interface RangeValidationRule extends BaseValidationRule {
1094
1212
  type: 'range';
1095
1213
  min?: number;
1096
1214
  max?: number;
1097
- };
1098
- type LengthValidation = BaseValidation & {
1215
+ }
1216
+ interface LengthValidationRule extends BaseValidationRule {
1099
1217
  type: 'length';
1100
1218
  min?: number;
1101
1219
  max?: number;
1102
- };
1103
- type ItemCountValidation = BaseValidation & {
1220
+ }
1221
+ interface ItemCountValidationRule extends BaseValidationRule {
1104
1222
  type: 'itemCount';
1105
1223
  min?: number;
1106
1224
  max?: number;
1107
- };
1108
- type AllowedValuesValidation = BaseValidation & {
1225
+ }
1226
+ interface AllowedValuesValidationRule extends BaseValidationRule {
1109
1227
  type: 'allowedValues';
1110
1228
  values: unknown[];
1111
- };
1112
- type CustomValidation = BaseValidation & {
1229
+ }
1230
+ interface CustomValidationRule extends BaseValidationRule {
1113
1231
  type: 'custom';
1114
- expression: string;
1115
- };
1116
- type FieldOverride = {
1117
- when: string;
1232
+ /**
1233
+ * CEL expression.
1234
+ *
1235
+ * Should evaluate to true when the field value is valid.
1236
+ */
1237
+ expression: Expression;
1238
+ }
1239
+ interface FieldOverride {
1240
+ /**
1241
+ * CEL condition
1242
+ */
1243
+ when: Expression;
1118
1244
  defaultValue?: unknown;
1245
+ /**
1246
+ * When true, the field is disabled/read-only while this override is active.
1247
+ */
1119
1248
  readOnly?: boolean;
1120
1249
  description?: string;
1121
1250
  placeholder?: string;
1122
1251
  tooltip?: string;
1123
1252
  validations?: FieldValidationRule[];
1124
1253
  options?: FieldOption[];
1125
- };
1126
- type FieldEffect = {
1127
- when: string;
1128
- set: Record<string, unknown>;
1129
- };
1254
+ }
1255
+ /**
1256
+ * Declares that when a field's value matches a condition,
1257
+ * listed target fields should be set to specified values.
1258
+ *
1259
+ * Use "value" in the `when` expression to refer to the field's value.
1260
+ */
1261
+ interface FieldEffect {
1262
+ /**
1263
+ * CEL expression. Example: "value == 'basic-auth'"
1264
+ */
1265
+ when: Expression;
1266
+ /**
1267
+ * Maps field IDs to the values they should be set to.
1268
+ * Must contain at least one entry.
1269
+ */
1270
+ set: Record<string, unknown> & {
1271
+ [k: string]: unknown;
1272
+ };
1273
+ }
1130
1274
  type StorageMapping = DirectMapping | IndexedPairMapping | ComputedMapping;
1131
- type DirectMapping = {
1275
+ /**
1276
+ * Direct mapping
1277
+ */
1278
+ interface DirectMapping {
1132
1279
  type: 'direct';
1133
- };
1134
- type IndexedPairMapping = {
1280
+ }
1281
+ /**
1282
+ * Indexed pair mapping (headers)
1283
+ */
1284
+ interface IndexedPairMapping {
1135
1285
  type: 'indexedPair';
1136
1286
  key: MappingField;
1137
1287
  value: MappingField;
1138
1288
  startIndex?: number;
1139
- };
1289
+ }
1290
+ /**
1291
+ * Computed mapping (virtual fields).
1292
+ * At least one of `read` or `write` must be provided.
1293
+ */
1140
1294
  type ComputedMapping = {
1141
1295
  type: 'computed';
1142
- read?: string;
1143
- write?: string;
1296
+ read: Expression;
1297
+ write?: Expression;
1298
+ } | {
1299
+ type: 'computed';
1300
+ read?: Expression;
1301
+ write: Expression;
1144
1302
  };
1145
- type MappingField = {
1303
+ /**
1304
+ * Mapping field
1305
+ */
1306
+ interface MappingField {
1146
1307
  target: TargetLocation;
1147
1308
  pattern: string;
1148
- };
1149
- type ConfigGroup = {
1309
+ }
1310
+ interface FieldOption {
1311
+ label: string;
1312
+ /**
1313
+ * Must match parent field valueType.
1314
+ * Must not be null.
1315
+ */
1316
+ value: NonNullable<unknown>;
1317
+ /**
1318
+ * Optional human-readable description of the option.
1319
+ */
1320
+ description?: string;
1321
+ }
1322
+ interface ConfigGroup {
1150
1323
  id: string;
1151
1324
  title: string;
1152
1325
  description?: string;
1153
1326
  order?: number;
1327
+ /**
1328
+ * When true, the group is optional and can be collapsed/hidden by default.
1329
+ */
1154
1330
  optional?: boolean;
1331
+ /**
1332
+ * References field IDs (not keys)
1333
+ */
1155
1334
  fieldRefs: string[];
1156
- };
1157
- type FieldRelationship = {
1158
- type: 'pair' | 'group' | 'datasourceReference';
1335
+ }
1336
+ type RelationshipType = 'pair' | 'group' | 'datasourceReference';
1337
+ interface FieldRelationship {
1338
+ type: RelationshipType;
1339
+ /**
1340
+ * References field IDs
1341
+ */
1159
1342
  fields: string[];
1160
1343
  description?: string;
1344
+ /**
1345
+ * Constrains the datasource UID to a specific plugin type.
1346
+ * Only applicable when type is "datasourceReference".
1347
+ */
1161
1348
  targetPluginType?: string;
1162
- };
1163
- /**
1164
- * Resolve a schema's groups into arrays of ConfigField objects.
1165
- * If the schema has no groups, returns a single group containing all non-virtual fields.
1166
- */
1167
- declare function resolveGroups(schema: DatasourceConfigSchema): Array<{
1168
- group: ConfigGroup;
1169
- fields: ConfigField[];
1170
- }>;
1171
- /**
1172
- * Build a virtual "Required" group containing all required fields, any parent
1173
- * fields they depend on (via `dependsOn`), and any child fields that depend on
1174
- * required fields. When the schema contains an "auth" group, its fields are
1175
- * also pulled in (auth is effectively required for Prometheus/Loki/Tempo style
1176
- * datasources). Fields are returned in schema order and de-duplicated.
1177
- * Returns `null` when the virtual group would be empty.
1178
- */
1179
- declare function resolveRequiredFieldsGroup(schema: DatasourceConfigSchema): {
1180
- group: ConfigGroup;
1181
- fields: ConfigField[];
1182
- } | null;
1183
- /**
1184
- * Unique form key for a field. Section-scoped fields (e.g. section:"logs", key:"defaultTable")
1185
- * get a prefixed key ("logs.defaultTable") so they don't collide with top-level fields that
1186
- * share the same key name.
1187
- */
1188
- declare function formKey(field: ConfigField): string;
1189
- /**
1190
- * Parse a simple CEL-like dependsOn expression: "fieldId == 'value'" or "fieldId == true".
1191
- * Returns { field, value } or null if unparseable.
1192
- */
1193
- declare function parseDependsOn(expr: string): {
1194
- field: string;
1195
- value: string;
1196
- } | null;
1197
- /**
1198
- * Resolve the first matching override for a field given current form values.
1199
- * Override `when` uses the same "fieldId == 'value'" syntax as dependsOn.
1200
- * Returns the matching override or undefined if none match.
1201
- */
1202
- declare function resolveActiveOverride(field: ConfigField, watchedValues: Record<string, unknown>, fieldById: Map<string, ConfigField>): FieldOverride | undefined;
1203
- /**
1204
- * Evaluate a simple computed.read expression against form values.
1205
- * Supports patterns used in dsconfig schemas:
1206
- * - "fieldRef == true ? 'a' : (fieldRef == true ? 'b' : 'c')"
1207
- * - Simple ternary chains with equality checks
1208
- * Falls back to the field's defaultValue if the expression can't be evaluated.
1209
- */
1210
- declare function evaluateComputedRead(expr: string, values: Record<string, unknown>, fields: ConfigField[]): unknown;
1211
- /**
1212
- * Compute initial values for all virtual fields that have storage.computed.read expressions.
1213
- * Call after loading existing storage field values.
1214
- */
1215
- declare function computeVirtualFieldValues(schema: DatasourceConfigSchema, existingValues: Record<string, unknown>): Record<string, unknown>;
1349
+ }
1216
1350
 
1217
1351
  type DatasourceConfigWizardProps = {
1218
1352
  schema: DatasourceConfigSchema;
@@ -1458,6 +1592,66 @@ interface Props {
1458
1592
  }
1459
1593
  declare function RawQuery({ query, language, className }: Props): React.JSX.Element;
1460
1594
 
1595
+ /**
1596
+ * Pure helper functions for working with DatasourceConfigSchema.
1597
+ *
1598
+ * Types are defined in schema.ts — import them from there directly.
1599
+ */
1600
+
1601
+ /**
1602
+ * Resolve a schema's groups into arrays of ConfigField objects.
1603
+ * If the schema has no groups, returns a single group containing all non-virtual fields.
1604
+ */
1605
+ declare function resolveGroups(schema: DatasourceConfigSchema): Array<{
1606
+ group: ConfigGroup;
1607
+ fields: ConfigField[];
1608
+ }>;
1609
+ /**
1610
+ * Build a virtual "Required" group containing all required fields, any parent
1611
+ * fields they depend on (via `dependsOn`), and any child fields that depend on
1612
+ * required fields. When the schema contains an "auth" group, its fields are
1613
+ * also pulled in (auth is effectively required for Prometheus/Loki/Tempo style
1614
+ * datasources). Fields are returned in schema order and de-duplicated.
1615
+ * Returns `null` when the virtual group would be empty.
1616
+ */
1617
+ declare function resolveRequiredFieldsGroup(schema: DatasourceConfigSchema): {
1618
+ group: ConfigGroup;
1619
+ fields: ConfigField[];
1620
+ } | null;
1621
+ /**
1622
+ * Unique form key for a field. Section-scoped fields (e.g. section:"logs", key:"defaultTable")
1623
+ * get a prefixed key ("logs.defaultTable") so they don't collide with top-level fields that
1624
+ * share the same key name.
1625
+ */
1626
+ declare function formKey(field: ConfigField): string;
1627
+ /**
1628
+ * Parse a simple CEL-like dependsOn expression: "fieldId == 'value'" or "fieldId == true".
1629
+ * Returns { field, value } or null if unparseable.
1630
+ */
1631
+ declare function parseDependsOn(expr: string): {
1632
+ field: string;
1633
+ value: string;
1634
+ } | null;
1635
+ /**
1636
+ * Resolve the first matching override for a field given current form values.
1637
+ * Override `when` uses the same "fieldId == 'value'" syntax as dependsOn.
1638
+ * Returns the matching override or undefined if none match.
1639
+ */
1640
+ declare function resolveActiveOverride(field: ConfigField, watchedValues: Record<string, unknown>, fieldById: Map<string, ConfigField>): FieldOverride | undefined;
1641
+ /**
1642
+ * Evaluate a simple computed.read expression against form values.
1643
+ * Supports patterns used in dsconfig schemas:
1644
+ * - "fieldRef == true ? 'a' : (fieldRef == true ? 'b' : 'c')"
1645
+ * - Simple ternary chains with equality checks
1646
+ * Falls back to the field's defaultValue if the expression can't be evaluated.
1647
+ */
1648
+ declare function evaluateComputedRead(expr: string, values: Record<string, unknown>, fields: ConfigField[]): unknown;
1649
+ /**
1650
+ * Compute initial values for all virtual fields that have storage.computed.read expressions.
1651
+ * Call after loading existing storage field values.
1652
+ */
1653
+ declare function computeVirtualFieldValues(schema: DatasourceConfigSchema, existingValues: Record<string, unknown>): Record<string, unknown>;
1654
+
1461
1655
  type DatasourceResponse = Record<string, unknown> & {
1462
1656
  name: string;
1463
1657
  id: number;
@@ -1552,4 +1746,4 @@ declare function toProvisioningYaml(schema: DatasourceConfigSchema, values?: Rec
1552
1746
  */
1553
1747
  declare function datasourceToProvisioningYaml(ds: Record<string, unknown>, schema: DatasourceConfigSchema | null): string;
1554
1748
 
1555
- export { AccessoryButton, AdvancedHttpSettings, type Aggregate, type AllowedValuesValidation, Auth, AuthMethod, type Props$c as AuthProps, BINARY_OPERATIONS_KEY, CatalogSelector, type ColumnDefinition, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, type ConfigField, type ConfigGroup, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, type CustomValidation, type DB, DataLink, type DataLinkConfig, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, type DatasourceConfigPayload, type DatasourceConfigSchema, DatasourceConfigWizard, type DatasourceConfigWizardProps, type DatasourceResponse, DatePicker, type DatePickerProps, DatePickerWithInput, type DatePickerWithInputProps, DebounceInput, type DebounceInputProps, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, type FetchExistingResult, type FieldEffect, type FieldItemSchema, type FieldKind, type FieldOption, type FieldOverride, type FieldRelationship, type FieldUI, type FieldValidationRule, FlexItem, type FormValues, GroupByRow, type IndexedPairItem, InlineSelect, InputGroup, type ItemCountValidation, LabelFilters, type LanguageCompletionProvider, type LanguageDefinition, type LengthValidation, type Lifecycle, LinkedToken, MacroType, type MetaDefinition, type NameValue, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, type PatternValidation, type PositionContext, type Props$s as Props, type ProvisioningYamlOptions, QUERY_FORMAT_OPTIONS, QueryBuilderHints, type QueryBuilderLabelFilter, type QueryBuilderOperation, type QueryBuilderOperationDefinition, type QueryBuilderOperationParamDef, type QueryBuilderOperationParamEditorProps, type QueryBuilderOperationParamValue, QueryEditorMode, QueryEditorModeToggle, type QueryEditorProps, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, type QueryRowFilter, type QueryStats, type QueryWithDefaults, type RAQBFieldTypes, type RangeValidation, RawQuery, type ResourceSelectorProps, type ResponseParser, RunQueryButton, SECURE_FIELD_CONFIGURED, type SQLConnectionLimits, SQLEditor, SQLEditorMode, SQLEditorTestUtils, type SQLExpression, type SQLFilters, type SQLMonarchLanguage, type SQLOptions, type SQLQuery, type SQLSelectableValue, type SchemaDefinition, SecureSocksProxyToggle, Segment, type SegmentProps, type SemanticType, Space, SqlDatasource, SqlQueryEditor, type SqlQueryForInterpolation, type SqlQueryModel, type State$1 as State, type StatementPlacementProvider, StatementPosition, type StorageMapping, SuggestionKind, type SuggestionKindProvider, TLSSettings, type Props$f as TLSSettingsProps, type TableDefinition, type TableFieldSchema, type TableIdentifier, type TableSchema, TableSelector, type TargetLocation, type TestQueryModel, TokenType, type UIComponent, type ValidationResults, type ValueType, type VisualQuery, type VisualQueryBinary, type VisualQueryModeller, buildDatasourceConfigPayload, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateComputedRead, expandIndexedPair, fetchExistingValues, flattenIndexedPair, formKey, formatDate, generateLLMHint, generateTroubleshootingFields, getStandardSQLCompletionProvider, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup, submitDatasourceConfig, toOption, toProvisioningYaml };
1749
+ export { AccessoryButton, AdvancedHttpSettings, type Aggregate, Auth, AuthMethod, type Props$c as AuthProps, BINARY_OPERATIONS_KEY, CatalogSelector, type ColumnDefinition, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemPriority, ConfigDescriptionLink, ConfigSection, ConfigSubSection, ConnectionSettings, CustomHeadersSettings, type DB, DataLink, type DataLinkConfig, DataLinks, DataSourceDescription, DataSourcePicker, DatasetSelector, type DatasourceConfigPayload, DatasourceConfigWizard, type DatasourceConfigWizardProps, type DatasourceResponse, DatePicker, type DatePickerProps, DatePickerWithInput, type DatePickerWithInputProps, DebounceInput, type DebounceInputProps, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, type FetchExistingResult, FlexItem, type FormValues, GroupByRow, type IndexedPairItem, InlineSelect, InputGroup, LabelFilters, type LanguageCompletionProvider, type LanguageDefinition, LinkedToken, MacroType, type MetaDefinition, type NameValue, OperationExplainedBox, OperationList, OperationListExplained, OperationsEditorRow, OperatorType, type PositionContext, type Props$s as Props, type ProvisioningYamlOptions, QUERY_FORMAT_OPTIONS, QueryBuilderHints, type QueryBuilderLabelFilter, type QueryBuilderOperation, type QueryBuilderOperationDefinition, type QueryBuilderOperationParamDef, type QueryBuilderOperationParamEditorProps, type QueryBuilderOperationParamValue, QueryEditorMode, QueryEditorModeToggle, type QueryEditorProps, QueryEditorRow, QueryFormat, QueryHeaderSwitch, QueryModellerBase, QueryOptionGroup, type QueryRowFilter, type QueryStats, type QueryWithDefaults, type RAQBFieldTypes, RawQuery, type ResourceSelectorProps, type ResponseParser, RunQueryButton, SECURE_FIELD_CONFIGURED, type SQLConnectionLimits, SQLEditor, SQLEditorMode, SQLEditorTestUtils, type SQLExpression, type SQLFilters, type SQLMonarchLanguage, type SQLOptions, type SQLQuery, type SQLSelectableValue, type SchemaDefinition, SecureSocksProxyToggle, Segment, type SegmentProps, Space, SqlDatasource, SqlQueryEditor, type SqlQueryForInterpolation, type SqlQueryModel, type State$1 as State, type StatementPlacementProvider, StatementPosition, SuggestionKind, type SuggestionKindProvider, TLSSettings, type Props$f as TLSSettingsProps, type TableDefinition, type TableFieldSchema, type TableIdentifier, type TableSchema, TableSelector, type TestQueryModel, TokenType, type ValidationResults, type VisualQuery, type VisualQueryBinary, type VisualQueryModeller, buildDatasourceConfigPayload, computeVirtualFieldValues, convertLegacyAuthProps, datasourceToProvisioningYaml, evaluateComputedRead, expandIndexedPair, fetchExistingValues, flattenIndexedPair, formKey, formatDate, generateLLMHint, generateTroubleshootingFields, getStandardSQLCompletionProvider, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup, submitDatasourceConfig, toOption, toProvisioningYaml };
@@ -1 +1 @@
1
- {"version":3,"file":"DatasourceConfigWizard.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.tsx"],"sourcesContent":["import React, { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { useStyles2, Button, LinkButton, Select, Icon, Alert, Tooltip, Spinner } from '@grafana/ui';\nimport { formKey, type DatasourceConfigSchema } from '../../../datasource/schema/config';\nimport { SECURE_FIELD_CONFIGURED } from '../../../datasource/schema/datasource';\nimport { isFieldRequired } from './fieldUtils';\nimport { SchemaField } from './SchemaField';\nimport { AuthorizationHeaderField } from './AuthorizationHeaderField';\nimport { TabLayout } from './TabLayout';\nimport { getWizardStyles } from './wizardStyles';\nimport { useDatasourceConfigForm } from './useDatasourceConfigForm';\n\nexport type DatasourceConfigWizardProps = {\n schema: DatasourceConfigSchema;\n dsUid: string;\n dsName: string;\n onSuccess: (status: string, message?: string) => void;\n onSaving?: (saving: boolean) => void;\n onRetest?: () => void;\n onFollowup?: (intent: string) => void;\n healthError?: string;\n mode?: 'tab' | 'wizard';\n /** Optional render prop for custom action buttons (e.g. analyze/troubleshoot). */\n renderActions?: (props: { dsUid: string; dsName: string; dsType: string; healthError?: string }) => ReactNode;\n};\n\nexport function DatasourceConfigWizard(props: DatasourceConfigWizardProps) {\n const { schema, dsUid, dsName, onSuccess, onSaving, onRetest, healthError, renderActions, mode = 'tab' } = props;\n\n const form = useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving });\n\n if (mode === 'tab') {\n return (\n <TabLayout\n form={form}\n schema={schema}\n dsUid={dsUid}\n dsName={dsName}\n onRetest={onRetest}\n healthError={healthError}\n renderActions={renderActions}\n />\n );\n }\n\n return (\n <WizardLayout\n form={form}\n schema={schema}\n dsUid={dsUid}\n dsName={dsName}\n onRetest={onRetest}\n healthError={healthError}\n renderActions={renderActions}\n />\n );\n}\n\ntype LayoutProps = {\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\nfunction WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderActions }: LayoutProps) {\n const styles = useStyles2(getWizardStyles);\n const [currentStep, setCurrentStep] = useState(0);\n\n const {\n resolvedGroups,\n fieldById,\n httpHeadersField,\n control,\n handleSubmit,\n trigger,\n errors,\n watchedValues,\n initializing,\n fetchError,\n submitting,\n submitError,\n readOnly,\n isFieldVisible,\n onSubmit,\n } = form;\n\n const arrowSteps = useMemo(() => {\n const requiredGroup = resolvedGroups.find((g) => g.group.id === '_required');\n if (!requiredGroup) {\n return new Set(resolvedGroups.map((_, i) => i));\n }\n const requiredFieldIds = new Set(requiredGroup.fields.map((f) => f.id));\n const steps = new Set<number>();\n for (let i = 0; i < resolvedGroups.length; i++) {\n const g = resolvedGroups[i];\n if (g.group.id === '_required' || g.fields.some((f) => !requiredFieldIds.has(f.id))) {\n steps.add(i);\n }\n }\n return steps;\n }, [resolvedGroups]);\n\n const currentResolved = resolvedGroups[currentStep];\n\n const isFirstStep = useMemo(() => {\n for (let i = 0; i < currentStep; i++) {\n if (arrowSteps.has(i)) {\n return false;\n }\n }\n return true;\n }, [currentStep, arrowSteps]);\n\n const isLastStep = useMemo(() => {\n for (let i = currentStep + 1; i < resolvedGroups.length; i++) {\n if (arrowSteps.has(i)) {\n return false;\n }\n }\n return true;\n }, [currentStep, arrowSteps, resolvedGroups.length]);\n\n const visibleFieldsForStep = useMemo(\n () => (currentResolved ? currentResolved.fields.filter(isFieldVisible) : []),\n [currentResolved, isFieldVisible]\n );\n\n const currentGroupValid = useMemo(() => {\n if (!currentResolved) {\n return true;\n }\n for (const field of visibleFieldsForStep) {\n if (errors[formKey(field)]) {\n return false;\n }\n if (isFieldRequired(field, watchedValues, fieldById)) {\n const val = watchedValues[formKey(field)];\n if (val === SECURE_FIELD_CONFIGURED) {\n continue;\n }\n if (val === undefined || val === null || val === '') {\n return false;\n }\n }\n }\n return true;\n }, [currentResolved, errors, visibleFieldsForStep, watchedValues, fieldById]);\n\n const goNext = useCallback(async () => {\n if (!currentResolved) {\n return;\n }\n if (!readOnly) {\n const visibleKeys = visibleFieldsForStep.map((f) => formKey(f));\n const valid = await trigger(visibleKeys);\n if (!valid) {\n return;\n }\n }\n setCurrentStep((s) => {\n for (let i = s + 1; i < resolvedGroups.length; i++) {\n if (arrowSteps.has(i)) {\n return i;\n }\n }\n return s;\n });\n }, [currentResolved, visibleFieldsForStep, trigger, resolvedGroups.length, arrowSteps, readOnly]);\n\n const goPrev = useCallback(() => {\n setCurrentStep((s) => {\n for (let i = s - 1; i >= 0; i--) {\n if (arrowSteps.has(i)) {\n return i;\n }\n }\n return s;\n });\n }, [arrowSteps]);\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 <Alert severity=\"error\" title=\"Failed to load configuration\">\n {fetchError}\n </Alert>\n <div className={styles.buttons}>\n <LinkButton\n variant=\"secondary\"\n size=\"sm\"\n icon=\"external-link-alt\"\n href={`/connections/datasources/edit/${dsUid}`}\n >\n Open datasource settings\n </LinkButton>\n </div>\n </div>\n );\n }\n\n const allDisabled = submitting || readOnly;\n\n if (resolvedGroups.length === 0) {\n return null;\n }\n\n const currentGroup = currentResolved?.group;\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={goPrev}\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) {\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 || (!readOnly && !currentGroupValid) ? 'secondary' : 'primary'}\n size=\"sm\"\n icon=\"angle-right\"\n aria-label=\"Next\"\n onClick={goNext}\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 {visibleFieldsForStep.map((field) => (\n <SchemaField\n key={formKey(field)}\n field={field}\n control={control}\n errors={errors}\n disabled={allDisabled}\n dsUid={dsUid}\n watchedValues={watchedValues}\n fieldById={fieldById}\n />\n ))}\n\n {(currentResolved.group.id === '_required' || currentResolved.group.id === 'auth') && httpHeadersField && (\n <AuthorizationHeaderField\n headersFieldKey={formKey(httpHeadersField)}\n control={control}\n disabled={allDisabled}\n watchedValues={watchedValues}\n />\n )}\n\n {submitError && (\n <Alert severity=\"error\" title=\"Error\">\n {submitError}\n </Alert>\n )}\n\n <div className={styles.buttons}>\n {readOnly ? (\n <Button variant=\"primary\" size=\"sm\" icon=\"sync\" onClick={onRetest} type=\"button\">\n Test\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" disabled={submitting || !currentGroupValid} type=\"submit\">\n {submitting ? 'Saving...' : 'Save & Test'}\n </Button>\n )}\n {healthError && renderActions?.({ dsUid, dsName, dsType: schema.pluginType, healthError })}\n </div>\n </form>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DatasourceConfigWizard.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.tsx"],"sourcesContent":["import React, { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { useStyles2, Button, LinkButton, Select, Icon, Alert, Tooltip, Spinner } from '@grafana/ui';\nimport type { DatasourceConfigSchema } from '../../../datasource/schema/schema';\nimport { formKey } from '../../../datasource/schema/config';\nimport { SECURE_FIELD_CONFIGURED } from '../../../datasource/schema/datasource';\nimport { isFieldRequired } from './fieldUtils';\nimport { SchemaField } from './SchemaField';\nimport { AuthorizationHeaderField } from './AuthorizationHeaderField';\nimport { TabLayout } from './TabLayout';\nimport { getWizardStyles } from './wizardStyles';\nimport { useDatasourceConfigForm } from './useDatasourceConfigForm';\n\nexport type DatasourceConfigWizardProps = {\n schema: DatasourceConfigSchema;\n dsUid: string;\n dsName: string;\n onSuccess: (status: string, message?: string) => void;\n onSaving?: (saving: boolean) => void;\n onRetest?: () => void;\n onFollowup?: (intent: string) => void;\n healthError?: string;\n mode?: 'tab' | 'wizard';\n /** Optional render prop for custom action buttons (e.g. analyze/troubleshoot). */\n renderActions?: (props: { dsUid: string; dsName: string; dsType: string; healthError?: string }) => ReactNode;\n};\n\nexport function DatasourceConfigWizard(props: DatasourceConfigWizardProps) {\n const { schema, dsUid, dsName, onSuccess, onSaving, onRetest, healthError, renderActions, mode = 'tab' } = props;\n\n const form = useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving });\n\n if (mode === 'tab') {\n return (\n <TabLayout\n form={form}\n schema={schema}\n dsUid={dsUid}\n dsName={dsName}\n onRetest={onRetest}\n healthError={healthError}\n renderActions={renderActions}\n />\n );\n }\n\n return (\n <WizardLayout\n form={form}\n schema={schema}\n dsUid={dsUid}\n dsName={dsName}\n onRetest={onRetest}\n healthError={healthError}\n renderActions={renderActions}\n />\n );\n}\n\ntype LayoutProps = {\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\nfunction WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderActions }: LayoutProps) {\n const styles = useStyles2(getWizardStyles);\n const [currentStep, setCurrentStep] = useState(0);\n\n const {\n resolvedGroups,\n fieldById,\n httpHeadersField,\n control,\n handleSubmit,\n trigger,\n errors,\n watchedValues,\n initializing,\n fetchError,\n submitting,\n submitError,\n readOnly,\n isFieldVisible,\n onSubmit,\n } = form;\n\n const arrowSteps = useMemo(() => {\n const requiredGroup = resolvedGroups.find((g) => g.group.id === '_required');\n if (!requiredGroup) {\n return new Set(resolvedGroups.map((_, i) => i));\n }\n const requiredFieldIds = new Set(requiredGroup.fields.map((f) => f.id));\n const steps = new Set<number>();\n for (let i = 0; i < resolvedGroups.length; i++) {\n const g = resolvedGroups[i];\n if (g.group.id === '_required' || g.fields.some((f) => !requiredFieldIds.has(f.id))) {\n steps.add(i);\n }\n }\n return steps;\n }, [resolvedGroups]);\n\n const currentResolved = resolvedGroups[currentStep];\n\n const isFirstStep = useMemo(() => {\n for (let i = 0; i < currentStep; i++) {\n if (arrowSteps.has(i)) {\n return false;\n }\n }\n return true;\n }, [currentStep, arrowSteps]);\n\n const isLastStep = useMemo(() => {\n for (let i = currentStep + 1; i < resolvedGroups.length; i++) {\n if (arrowSteps.has(i)) {\n return false;\n }\n }\n return true;\n }, [currentStep, arrowSteps, resolvedGroups.length]);\n\n const visibleFieldsForStep = useMemo(\n () => (currentResolved ? currentResolved.fields.filter(isFieldVisible) : []),\n [currentResolved, isFieldVisible]\n );\n\n const currentGroupValid = useMemo(() => {\n if (!currentResolved) {\n return true;\n }\n for (const field of visibleFieldsForStep) {\n if (errors[formKey(field)]) {\n return false;\n }\n if (isFieldRequired(field, watchedValues, fieldById)) {\n const val = watchedValues[formKey(field)];\n if (val === SECURE_FIELD_CONFIGURED) {\n continue;\n }\n if (val === undefined || val === null || val === '') {\n return false;\n }\n }\n }\n return true;\n }, [currentResolved, errors, visibleFieldsForStep, watchedValues, fieldById]);\n\n const goNext = useCallback(async () => {\n if (!currentResolved) {\n return;\n }\n if (!readOnly) {\n const visibleKeys = visibleFieldsForStep.map((f) => formKey(f));\n const valid = await trigger(visibleKeys);\n if (!valid) {\n return;\n }\n }\n setCurrentStep((s) => {\n for (let i = s + 1; i < resolvedGroups.length; i++) {\n if (arrowSteps.has(i)) {\n return i;\n }\n }\n return s;\n });\n }, [currentResolved, visibleFieldsForStep, trigger, resolvedGroups.length, arrowSteps, readOnly]);\n\n const goPrev = useCallback(() => {\n setCurrentStep((s) => {\n for (let i = s - 1; i >= 0; i--) {\n if (arrowSteps.has(i)) {\n return i;\n }\n }\n return s;\n });\n }, [arrowSteps]);\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 <Alert severity=\"error\" title=\"Failed to load configuration\">\n {fetchError}\n </Alert>\n <div className={styles.buttons}>\n <LinkButton\n variant=\"secondary\"\n size=\"sm\"\n icon=\"external-link-alt\"\n href={`/connections/datasources/edit/${dsUid}`}\n >\n Open datasource settings\n </LinkButton>\n </div>\n </div>\n );\n }\n\n const allDisabled = submitting || readOnly;\n\n if (resolvedGroups.length === 0) {\n return null;\n }\n\n const currentGroup = currentResolved?.group;\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={goPrev}\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) {\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 || (!readOnly && !currentGroupValid) ? 'secondary' : 'primary'}\n size=\"sm\"\n icon=\"angle-right\"\n aria-label=\"Next\"\n onClick={goNext}\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 {visibleFieldsForStep.map((field) => (\n <SchemaField\n key={formKey(field)}\n field={field}\n control={control}\n errors={errors}\n disabled={allDisabled}\n dsUid={dsUid}\n watchedValues={watchedValues}\n fieldById={fieldById}\n />\n ))}\n\n {(currentResolved.group.id === '_required' || currentResolved.group.id === 'auth') && httpHeadersField && (\n <AuthorizationHeaderField\n headersFieldKey={formKey(httpHeadersField)}\n control={control}\n disabled={allDisabled}\n watchedValues={watchedValues}\n />\n )}\n\n {submitError && (\n <Alert severity=\"error\" title=\"Error\">\n {submitError}\n </Alert>\n )}\n\n <div className={styles.buttons}>\n {readOnly ? (\n <Button variant=\"primary\" size=\"sm\" icon=\"sync\" onClick={onRetest} type=\"button\">\n Test\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" disabled={submitting || !currentGroupValid} type=\"submit\">\n {submitting ? 'Saving...' : 'Save & Test'}\n </Button>\n )}\n {healthError && renderActions?.({ dsUid, dsName, dsType: schema.pluginType, healthError })}\n </div>\n </form>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaField.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/SchemaField.tsx"],"sourcesContent":["import React from 'react';\nimport { type useForm, Controller } from 'react-hook-form';\nimport { useStyles2, Icon, Tooltip } from '@grafana/ui';\nimport { type ConfigField, resolveActiveOverride, formKey } from '../../../datasource/schema/config';\nimport type { FormValues } from '../../../datasource/schema/types';\nimport { isFieldRequired, buildValidationRules } from './fieldUtils';\nimport { PdcFieldNote } from './PdcFieldNote';\nimport { renderFieldInput } from './renderFieldInput';\nimport { getWizardStyles } from './wizardStyles';\n\nexport type SchemaFieldProps = {\n field: ConfigField;\n control: ReturnType<typeof useForm<FormValues>>['control'];\n errors: ReturnType<typeof useForm<FormValues>>['formState']['errors'];\n disabled?: boolean;\n dsUid: string;\n watchedValues: Record<string, unknown>;\n fieldById: Map<string, ConfigField>;\n};\n\nexport function SchemaField({ field, control, errors, disabled, dsUid, watchedValues, fieldById }: SchemaFieldProps) {\n const styles = useStyles2(getWizardStyles);\n\n const activeOverride = resolveActiveOverride(field, watchedValues, fieldById);\n const fk = formKey(field);\n\n if (field.key === 'pdcInjected' && field.target === 'jsonData') {\n return (\n <Controller\n name={fk}\n control={control}\n render={({ field: formField }) => (\n <PdcFieldNote\n enabled={!!formField.value}\n description={field.description}\n configUrl={`/connections/datasources/edit/${dsUid}`}\n />\n )}\n />\n );\n }\n\n const required = isFieldRequired(field, watchedValues, fieldById);\n const validationRules = buildValidationRules(field, required);\n\n return (\n <Controller\n name={fk}\n control={control}\n rules={validationRules}\n render={({ field: formField }) => {\n const errorMessage = errors[fk]?.message as string | undefined;\n const label = field.label ?? field.key;\n const description = activeOverride?.description ?? field.description;\n const effectiveField = activeOverride\n ? {\n ...field,\n description,\n ui: {\n ...field.ui,\n placeholder: activeOverride.placeholder ?? field.ui?.placeholder,\n } as ConfigField['ui'],\n }\n : field;\n const isReadOnly = !!activeOverride?.readOnly;\n const isBool = field.valueType === 'boolean';\n\n return (\n <div className={isBool ? styles.fieldRowCenter : styles.fieldRow}>\n <div className={isBool ? styles.fieldLabelRowCompact : styles.fieldLabelRow}>\n <span className={styles.fieldLabel}>\n {label}\n {required && <span className={styles.fieldRequired}>*</span>}\n </span>\n {description && (\n <Tooltip content={description}>\n <Icon name=\"info-circle\" size=\"xs\" className={styles.fieldInfoIcon} />\n </Tooltip>\n )}\n </div>\n <div className={styles.fieldInputCol}>\n {renderFieldInput(effectiveField, formField, disabled || isReadOnly)}\n {errorMessage && <span className={styles.fieldError}>{errorMessage}</span>}\n </div>\n </div>\n );\n }}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAoBO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,OAAA,EAAS,QAAQ,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,SAAA,EAAU,EAAqB;AACnH,EAAA,MAAM,MAAA,GAAS,WAAW,eAAe,CAAA;AAEzC,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,KAAA,EAAO,aAAA,EAAe,SAAS,CAAA;AAC5E,EAAA,MAAM,EAAA,GAAK,QAAQ,KAAK,CAAA;AAExB,EAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,aAAA,IAAiB,KAAA,CAAM,WAAW,UAAA,EAAY;AAC9D,IAAA,uBACE,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,EAAA;AAAA,QACN,OAAA;AAAA,QACA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,WAAU,qBAC1B,KAAA,CAAA,aAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,CAAC,CAAC,SAAA,CAAU,KAAA;AAAA,YACrB,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,SAAA,EAAW,iCAAiC,KAAK,CAAA;AAAA;AAAA;AACnD;AAAA,KAEJ;AAAA,EAEJ;AAEA,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,KAAA,EAAO,aAAA,EAAe,SAAS,CAAA;AAChE,EAAA,MAAM,eAAA,GAAkB,oBAAA,CAAqB,KAAA,EAAO,QAAQ,CAAA;AAE5D,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,EAAA;AAAA,MACN,OAAA;AAAA,MACA,KAAA,EAAO,eAAA;AAAA,MACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,WAAU,KAAM;AAlDxC,QAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAmDQ,QAAA,MAAM,YAAA,GAAA,CAAe,EAAA,GAAA,MAAA,CAAO,EAAE,CAAA,KAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAY,OAAA;AACjC,QAAA,MAAM,KAAA,GAAA,CAAQ,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,EAAA,GAAe,KAAA,CAAM,GAAA;AACnC,QAAA,MAAM,WAAA,GAAA,CAAc,EAAA,GAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,WAAA,KAAhB,IAAA,GAAA,EAAA,GAA+B,KAAA,CAAM,WAAA;AACzD,QAAA,MAAM,iBAAiB,cAAA,GACnB;AAAA,UACE,GAAG,KAAA;AAAA,UAEH,EAAA,EAAI;AAAA,YACF,GAAG,KAAA,CAAM,EAAA;AAAA,YACT,cAAa,EAAA,GAAA,cAAA,CAAe,WAAA,KAAf,IAAA,GAAA,EAAA,GAAA,CAA8B,EAAA,GAAA,KAAA,CAAM,OAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAU;AAAA;AACvD,SACF,GACA,KAAA;AACJ,QAAA,MAAM,UAAA,GAAa,CAAC,EAAC,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,QAAA,CAAA;AACrC,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,KAAc,SAAA;AAEnC,QAAA,uBACE,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,GAAS,MAAA,CAAO,cAAA,GAAiB,MAAA,CAAO,QAAA,EAAA,kBACtD,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,GAAS,OAAO,oBAAA,GAAuB,MAAA,CAAO,aAAA,EAAA,kBAC5D,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,UAAA,EAAA,EACrB,OACA,QAAA,oBAAY,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,aAAA,EAAA,EAAe,GAAC,CACvD,GACC,WAAA,oBACC,KAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAQ,OAAA,EAAS,WAAA,EAAA,kBAChB,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAc,IAAA,EAAK,IAAA,EAAK,SAAA,EAAW,MAAA,CAAO,aAAA,EAAe,CACtE,CAEJ,CAAA,sCACC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,aAAA,EAAA,EACpB,gBAAA,CAAiB,cAAA,EAAgB,SAAA,EAAW,QAAA,IAAY,UAAU,CAAA,EAClE,YAAA,oBAAgB,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,UAAA,EAAA,EAAa,YAAa,CACrE,CACF,CAAA;AAAA,MAEJ;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"SchemaField.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/SchemaField.tsx"],"sourcesContent":["import React from 'react';\nimport { type useForm, Controller } from 'react-hook-form';\nimport { useStyles2, Icon, Tooltip } from '@grafana/ui';\nimport type { ConfigField } from '../../../datasource/schema/schema';\nimport { resolveActiveOverride, formKey } from '../../../datasource/schema/config';\nimport type { FormValues } from '../../../datasource/schema/types';\nimport { isFieldRequired, buildValidationRules } from './fieldUtils';\nimport { PdcFieldNote } from './PdcFieldNote';\nimport { renderFieldInput } from './renderFieldInput';\nimport { getWizardStyles } from './wizardStyles';\n\nexport type SchemaFieldProps = {\n field: ConfigField;\n control: ReturnType<typeof useForm<FormValues>>['control'];\n errors: ReturnType<typeof useForm<FormValues>>['formState']['errors'];\n disabled?: boolean;\n dsUid: string;\n watchedValues: Record<string, unknown>;\n fieldById: Map<string, ConfigField>;\n};\n\nexport function SchemaField({ field, control, errors, disabled, dsUid, watchedValues, fieldById }: SchemaFieldProps) {\n const styles = useStyles2(getWizardStyles);\n\n const activeOverride = resolveActiveOverride(field, watchedValues, fieldById);\n const fk = formKey(field);\n\n if (field.key === 'pdcInjected' && field.target === 'jsonData') {\n return (\n <Controller\n name={fk}\n control={control}\n render={({ field: formField }) => (\n <PdcFieldNote\n enabled={!!formField.value}\n description={field.description}\n configUrl={`/connections/datasources/edit/${dsUid}`}\n />\n )}\n />\n );\n }\n\n const required = isFieldRequired(field, watchedValues, fieldById);\n const validationRules = buildValidationRules(field, required);\n\n return (\n <Controller\n name={fk}\n control={control}\n rules={validationRules}\n render={({ field: formField }) => {\n const errorMessage = errors[fk]?.message as string | undefined;\n const label = field.label ?? field.key;\n const description = activeOverride?.description ?? field.description;\n const effectiveField = activeOverride\n ? {\n ...field,\n description,\n ui: {\n ...field.ui,\n placeholder: activeOverride.placeholder ?? field.ui?.placeholder,\n } as ConfigField['ui'],\n }\n : field;\n const isReadOnly = !!activeOverride?.readOnly;\n const isBool = field.valueType === 'boolean';\n\n return (\n <div className={isBool ? styles.fieldRowCenter : styles.fieldRow}>\n <div className={isBool ? styles.fieldLabelRowCompact : styles.fieldLabelRow}>\n <span className={styles.fieldLabel}>\n {label}\n {required && <span className={styles.fieldRequired}>*</span>}\n </span>\n {description && (\n <Tooltip content={description}>\n <Icon name=\"info-circle\" size=\"xs\" className={styles.fieldInfoIcon} />\n </Tooltip>\n )}\n </div>\n <div className={styles.fieldInputCol}>\n {renderFieldInput(effectiveField, formField, disabled || isReadOnly)}\n {errorMessage && <span className={styles.fieldError}>{errorMessage}</span>}\n </div>\n </div>\n );\n }}\n />\n );\n}\n"],"names":[],"mappings":"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"}