@grafana/plugin-ui 0.14.0-dev.1 → 0.14.1-dsconfig.bccd84e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/cjs/index.cjs +2930 -377
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +358 -38
  4. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
  5. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.js +53 -0
  6. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.js.map +1 -0
  7. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.js +24 -0
  8. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.js.map +1 -0
  9. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +229 -0
  10. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -0
  11. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/IndexedPairEditor.js +124 -0
  12. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/IndexedPairEditor.js.map +1 -0
  13. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/PdcFieldNote.js +34 -0
  14. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/PdcFieldNote.js.map +1 -0
  15. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +60 -0
  16. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -0
  17. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SecureFieldInput.js +61 -0
  18. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SecureFieldInput.js.map +1 -0
  19. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js +54 -0
  20. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +1 -0
  21. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js +84 -0
  22. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/StringArrayInput.js.map +1 -0
  23. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +176 -0
  24. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +1 -0
  25. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +88 -0
  26. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +1 -0
  27. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js +106 -0
  28. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js.map +1 -0
  29. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js +241 -0
  30. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tabStyles.js.map +1 -0
  31. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useDatasourceConfigForm.js +284 -0
  32. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/useDatasourceConfigForm.js.map +1 -0
  33. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js +124 -0
  34. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/wizardStyles.js.map +1 -0
  35. package/dist/esm/components/DataLinks/DataLink.js +2 -2
  36. package/dist/esm/components/DataLinks/DataLinks.js +2 -2
  37. package/dist/esm/components/DatePicker/styles.js +2 -2
  38. package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
  39. package/dist/esm/components/QueryEditor/EditorField.js +2 -2
  40. package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
  41. package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
  42. package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
  43. package/dist/esm/components/QueryEditor/InlineSelect.js +1 -1
  44. package/dist/esm/components/QueryEditor/InlineSelect.js.map +1 -1
  45. package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
  46. package/dist/esm/components/QueryEditor/QueryEditor.js +3 -1
  47. package/dist/esm/components/QueryEditor/QueryEditor.js.map +1 -1
  48. package/dist/esm/components/QueryEditor/QueryHeader.js +2 -2
  49. package/dist/esm/components/QueryEditor/QueryHeader.js.map +1 -1
  50. package/dist/esm/components/QueryEditor/Space.js +2 -2
  51. package/dist/esm/components/QueryEditor/TableSelector.js +0 -1
  52. package/dist/esm/components/QueryEditor/TableSelector.js.map +1 -1
  53. package/dist/esm/components/QueryEditor/defaults.js.map +1 -1
  54. package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js +10 -2
  55. package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js.map +1 -1
  56. package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js +6 -1
  57. package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js.map +1 -1
  58. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +13 -3
  59. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js.map +1 -1
  60. package/dist/esm/components/QueryEditor/types.js +0 -1
  61. package/dist/esm/components/QueryEditor/types.js.map +1 -1
  62. package/dist/esm/components/QueryEditor/utils/formatSQL.js +15 -4
  63. package/dist/esm/components/QueryEditor/utils/formatSQL.js.map +1 -1
  64. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +2 -2
  65. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
  66. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +4 -4
  67. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js.map +1 -1
  68. package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js +0 -1
  69. package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js.map +1 -1
  70. package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js +0 -1
  71. package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js.map +1 -1
  72. package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js +0 -1
  73. package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js.map +1 -1
  74. package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js +0 -1
  75. package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js.map +1 -1
  76. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +2 -2
  77. package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js +10 -2
  78. package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js.map +1 -1
  79. package/dist/esm/components/SQLEditor/components/SQLEditor.js.map +1 -1
  80. package/dist/esm/components/SQLEditor/standardSql/definition.js +0 -6
  81. package/dist/esm/components/SQLEditor/standardSql/definition.js.map +1 -1
  82. package/dist/esm/components/SQLEditor/standardSql/getStatementPosition.js +2 -1
  83. package/dist/esm/components/SQLEditor/standardSql/getStatementPosition.js.map +1 -1
  84. package/dist/esm/components/SQLEditor/standardSql/statementPositionResolversRegistry.js +2 -1
  85. package/dist/esm/components/SQLEditor/standardSql/statementPositionResolversRegistry.js.map +1 -1
  86. package/dist/esm/components/SQLEditor/types.js +1 -17
  87. package/dist/esm/components/SQLEditor/types.js.map +1 -1
  88. package/dist/esm/components/SQLEditor/utils/LinkedToken.js +1 -1
  89. package/dist/esm/components/SQLEditor/utils/LinkedToken.js.map +1 -1
  90. package/dist/esm/components/SQLEditor/utils/linkedTokenBuilder.js +2 -2
  91. package/dist/esm/components/SQLEditor/utils/tokenType.js +18 -0
  92. package/dist/esm/components/SQLEditor/utils/tokenType.js.map +1 -0
  93. package/dist/esm/components/SQLEditor/utils/tokenUtils.js +1 -1
  94. package/dist/esm/components/VisualQueryBuilder/components/OperationEditorBody.js +1 -1
  95. package/dist/esm/components/VisualQueryBuilder/components/OperationList.js +1 -1
  96. package/dist/esm/components/VisualQueryBuilder/components/OperationParamEditor.js +1 -1
  97. package/dist/esm/components/VisualQueryBuilder/components/OperationsEditorRow.js +1 -1
  98. package/dist/esm/components/VisualQueryBuilder/components/QueryHeaderSwitch.js +1 -1
  99. package/dist/esm/components/VisualQueryBuilder/components/QueryOptionGroup.js +1 -1
  100. package/dist/esm/datasource/schema/config.js +235 -0
  101. package/dist/esm/datasource/schema/config.js.map +1 -0
  102. package/dist/esm/datasource/schema/datasource.js +228 -0
  103. package/dist/esm/datasource/schema/datasource.js.map +1 -0
  104. package/dist/esm/datasource/schema/llmHints.js +54 -0
  105. package/dist/esm/datasource/schema/llmHints.js.map +1 -0
  106. package/dist/esm/datasource/schema/provisioningYaml.js +356 -0
  107. package/dist/esm/datasource/schema/provisioningYaml.js.map +1 -0
  108. package/dist/esm/index.d.ts +358 -38
  109. package/dist/esm/index.js +7 -1
  110. package/dist/esm/index.js.map +1 -1
  111. package/package.json +30 -11
@@ -4,6 +4,7 @@ import { DataSourceInstanceSettings, SelectableValue, DataSourceJsonData, Variab
4
4
  import { DataSourceSrv, DataSourceWithBackend, TemplateSrv } from '@grafana/runtime';
5
5
  import { JsonTree } from '@react-awesome-query-builder/ui';
6
6
  import { DataQuery } from '@grafana/schema';
7
+ import { SqlLanguage } from 'sql-formatter';
7
8
  import { Grammar } from 'prismjs';
8
9
 
9
10
  interface QueryEditorRowProps {
@@ -99,9 +100,6 @@ type Props$q = {
99
100
  };
100
101
  declare const DataLink: (props: Props$q) => React.JSX.Element;
101
102
 
102
- declare function applyQueryDefaults(q?: SQLQuery): SQLQuery;
103
- type QueryWithDefaults = ReturnType<typeof applyQueryDefaults>;
104
-
105
103
  declare enum QueryEditorPropertyType {
106
104
  String = "string"
107
105
  }
@@ -136,6 +134,21 @@ interface QueryEditorFunctionParameterExpression {
136
134
  name?: string;
137
135
  }
138
136
 
137
+ declare enum TokenType {
138
+ Parenthesis = "delimiter.parenthesis.sql",
139
+ Whitespace = "white.sql",
140
+ Keyword = "keyword.sql",
141
+ Delimiter = "delimiter.sql",
142
+ Operator = "operator.sql",
143
+ Identifier = "identifier.sql",
144
+ IdentifierQuote = "identifier.quote.sql",
145
+ Type = "type.sql",
146
+ Function = "predefined.sql",
147
+ Number = "number.sql",
148
+ String = "string.sql",
149
+ Variable = "variable.sql"
150
+ }
151
+
139
152
  declare class LinkedToken {
140
153
  type: string;
141
154
  value: string;
@@ -164,17 +177,6 @@ declare class LinkedToken {
164
177
  getNextOfType(type: TokenType, value?: string): LinkedToken | null;
165
178
  }
166
179
 
167
- type StatementPositionResolver = (currentToken: LinkedToken | null, previousKeyword: LinkedToken | null, previousNonWhiteSpace: LinkedToken | null, previousIsSlash: Boolean) => Boolean;
168
- type SuggestionsResolver = <T extends PositionContext = PositionContext>(positionContext: T) => Promise<CustomSuggestion[]>;
169
- interface SQLMonarchLanguage extends monacoTypes.languages.IMonarchLanguage {
170
- keywords?: string[];
171
- builtinFunctions?: string[];
172
- logicalOperators?: string[];
173
- comparisonOperators?: string[];
174
- /** Used by basic languages in the monaco registry **/
175
- operators?: string[];
176
- }
177
-
178
180
  /**
179
181
  * Provides a context for suggestions resolver
180
182
  * @alpha
@@ -290,7 +292,25 @@ interface SQLCompletionItemProvider extends Omit<monacoTypes.languages.Completio
290
292
  */
291
293
  provideCompletionItems?: (model: monacoTypes.editor.ITextModel, position: monacoTypes.Position, context: monacoTypes.languages.CompletionContext, token: monacoTypes.CancellationToken, positionContext: PositionContext) => monacoTypes.languages.CompletionList;
292
294
  }
295
+ interface SQLMonarchLanguage extends monacoTypes.languages.IMonarchLanguage {
296
+ keywords?: string[];
297
+ builtinFunctions?: string[];
298
+ logicalOperators?: string[];
299
+ comparisonOperators?: string[];
300
+ /** Used by basic languages in the monaco registry **/
301
+ operators?: string[];
302
+ }
303
+ type StatementPositionResolver = (currentToken: LinkedToken | null, previousKeyword: LinkedToken | null, previousNonWhiteSpace: LinkedToken | null, previousIsSlash: Boolean) => Boolean;
304
+ type SuggestionsResolver = <T extends PositionContext = PositionContext>(positionContext: T) => Promise<CustomSuggestion[]>;
293
305
  type LanguageCompletionProvider = (m: Monaco, l?: SQLMonarchLanguage) => SQLCompletionItemProvider;
306
+ interface LanguageDefinition extends monacoTypes.languages.ILanguageExtensionPoint {
307
+ loader?: (module: any) => Promise<{
308
+ language: SQLMonarchLanguage;
309
+ conf: monacoTypes.languages.LanguageConfiguration;
310
+ }>;
311
+ completionProvider?: (m: Monaco, language: SQLMonarchLanguage) => SQLCompletionItemProvider;
312
+ formatter?: (q: string) => string;
313
+ }
294
314
  declare enum OperatorType {
295
315
  Comparison = 0,
296
316
  Logical = 1
@@ -302,20 +322,7 @@ declare enum MacroType {
302
322
  Column = 3,
303
323
  Table = 4
304
324
  }
305
- declare enum TokenType {
306
- Parenthesis = "delimiter.parenthesis.sql",
307
- Whitespace = "white.sql",
308
- Keyword = "keyword.sql",
309
- Delimiter = "delimiter.sql",
310
- Operator = "operator.sql",
311
- Identifier = "identifier.sql",
312
- IdentifierQuote = "identifier.quote.sql",
313
- Type = "type.sql",
314
- Function = "predefined.sql",
315
- Number = "number.sql",
316
- String = "string.sql",
317
- Variable = "variable.sql"
318
- }
325
+
319
326
  declare enum StatementPosition {
320
327
  Unknown = "unknown",
321
328
  SelectKeyword = "selectKeyword",
@@ -417,14 +424,6 @@ declare enum SQLEditorMode {
417
424
  Code = "code"
418
425
  }
419
426
 
420
- interface LanguageDefinition extends monacoTypes.languages.ILanguageExtensionPoint {
421
- loader?: (module: any) => Promise<{
422
- language: SQLMonarchLanguage;
423
- conf: monacoTypes.languages.LanguageConfiguration;
424
- }>;
425
- completionProvider?: (m: Monaco, language: SQLMonarchLanguage) => SQLCompletionItemProvider;
426
- formatter?: (q: string) => string;
427
- }
428
427
  interface SQLEditorProps {
429
428
  query: string;
430
429
  /**
@@ -640,6 +639,11 @@ interface MetaDefinition {
640
639
  completion?: string;
641
640
  kind: CompletionItemKind;
642
641
  }
642
+ /**
643
+ * Represents a query with all default values applied.
644
+ * This is equivalent to SQLQuery since applyQueryDefaults returns SQLQuery.
645
+ */
646
+ type QueryWithDefaults = SQLQuery;
643
647
 
644
648
  interface GroupByRowProps {
645
649
  sql: SQLExpression;
@@ -781,8 +785,9 @@ interface MetricFindQueryOptions extends SearchFilterOptions {
781
785
  }
782
786
 
783
787
  interface Props$p extends QueryEditorProps$1<SqlDatasource, SQLQuery, SQLOptions> {
788
+ language?: SqlLanguage;
784
789
  }
785
- declare function SqlQueryEditor({ datasource, query, onChange, onRunQuery, range }: Props$p): React.JSX.Element | null;
790
+ declare function SqlQueryEditor({ datasource, query, onChange, onRunQuery, range, language }: Props$p): React.JSX.Element | null;
786
791
 
787
792
  type RunQueryButtonProps = {
788
793
  ariaLabel?: string;
@@ -1008,6 +1013,227 @@ type Props$a<C extends Config = Config> = {
1008
1013
  };
1009
1014
  declare const AdvancedHttpSettings: <C extends Config = Config>(props: Props$a<C>) => JSX.Element;
1010
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 = {
1024
+ schemaVersion: string;
1025
+ pluginType: string;
1026
+ pluginName: string;
1027
+ docURL?: string;
1028
+ fields: ConfigField[];
1029
+ groups?: ConfigGroup[];
1030
+ relationships?: FieldRelationship[];
1031
+ };
1032
+ type ConfigField = {
1033
+ id: string;
1034
+ key: string;
1035
+ label?: string;
1036
+ description?: string;
1037
+ docURL?: string;
1038
+ valueType: ValueType;
1039
+ semanticType?: SemanticType;
1040
+ target?: TargetLocation;
1041
+ section?: string;
1042
+ kind?: FieldKind;
1043
+ isItemField?: boolean;
1044
+ lifecycle?: Lifecycle;
1045
+ ui?: FieldUI;
1046
+ validations?: FieldValidationRule[];
1047
+ dependsOn?: string;
1048
+ required?: boolean;
1049
+ requiredWhen?: string;
1050
+ disabledWhen?: string;
1051
+ overrides?: FieldOverride[];
1052
+ effects?: FieldEffect[];
1053
+ item?: FieldItemSchema;
1054
+ storage?: StorageMapping;
1055
+ tags?: string[];
1056
+ examples?: unknown[];
1057
+ defaultValue?: unknown;
1058
+ };
1059
+ type FieldItemSchema = {
1060
+ valueType: ValueType;
1061
+ fields?: ConfigField[];
1062
+ };
1063
+ type ValueType = 'string' | 'number' | 'boolean' | 'array' | 'object' | 'map' | 'any';
1064
+ type SemanticType = 'url' | 'password' | 'token' | 'hostname' | 'duration' | 'datasourceUid' | 'query';
1065
+ type FieldKind = 'storage' | 'virtual';
1066
+ type Lifecycle = 'stable' | 'deprecated' | 'experimental';
1067
+ type TargetLocation = 'root' | 'jsonData' | 'secureJsonData';
1068
+ type UIComponent = 'input' | 'textarea' | 'select' | 'multiselect' | 'radio' | 'checkbox' | 'switch' | 'code' | 'keyvalue' | 'list';
1069
+ type FieldUI = {
1070
+ component: UIComponent;
1071
+ multiline?: boolean;
1072
+ rows?: number;
1073
+ options?: FieldOption[];
1074
+ allowCustom?: boolean;
1075
+ width?: 'full' | 'half';
1076
+ placeholder?: string;
1077
+ 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 = {
1086
+ id?: string;
1087
+ message?: string;
1088
+ };
1089
+ type PatternValidation = BaseValidation & {
1090
+ type: 'pattern';
1091
+ pattern: string;
1092
+ };
1093
+ type RangeValidation = BaseValidation & {
1094
+ type: 'range';
1095
+ min?: number;
1096
+ max?: number;
1097
+ };
1098
+ type LengthValidation = BaseValidation & {
1099
+ type: 'length';
1100
+ min?: number;
1101
+ max?: number;
1102
+ };
1103
+ type ItemCountValidation = BaseValidation & {
1104
+ type: 'itemCount';
1105
+ min?: number;
1106
+ max?: number;
1107
+ };
1108
+ type AllowedValuesValidation = BaseValidation & {
1109
+ type: 'allowedValues';
1110
+ values: unknown[];
1111
+ };
1112
+ type CustomValidation = BaseValidation & {
1113
+ type: 'custom';
1114
+ expression: string;
1115
+ };
1116
+ type FieldOverride = {
1117
+ when: string;
1118
+ defaultValue?: unknown;
1119
+ readOnly?: boolean;
1120
+ description?: string;
1121
+ placeholder?: string;
1122
+ tooltip?: string;
1123
+ validations?: FieldValidationRule[];
1124
+ options?: FieldOption[];
1125
+ };
1126
+ type FieldEffect = {
1127
+ when: string;
1128
+ set: Record<string, unknown>;
1129
+ };
1130
+ type StorageMapping = DirectMapping | IndexedPairMapping | ComputedMapping;
1131
+ type DirectMapping = {
1132
+ type: 'direct';
1133
+ };
1134
+ type IndexedPairMapping = {
1135
+ type: 'indexedPair';
1136
+ key: MappingField;
1137
+ value: MappingField;
1138
+ startIndex?: number;
1139
+ };
1140
+ type ComputedMapping = {
1141
+ type: 'computed';
1142
+ read?: string;
1143
+ write?: string;
1144
+ };
1145
+ type MappingField = {
1146
+ target: TargetLocation;
1147
+ pattern: string;
1148
+ };
1149
+ type ConfigGroup = {
1150
+ id: string;
1151
+ title: string;
1152
+ description?: string;
1153
+ order?: number;
1154
+ optional?: boolean;
1155
+ fieldRefs: string[];
1156
+ };
1157
+ type FieldRelationship = {
1158
+ type: 'pair' | 'group' | 'datasourceReference';
1159
+ fields: string[];
1160
+ description?: string;
1161
+ 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>;
1216
+
1217
+ type DatasourceConfigWizardProps = {
1218
+ schema: DatasourceConfigSchema;
1219
+ dsUid: string;
1220
+ dsName: string;
1221
+ onSuccess: (status: string, message?: string) => void;
1222
+ onSaving?: (saving: boolean) => void;
1223
+ onRetest?: () => void;
1224
+ onFollowup?: (intent: string) => void;
1225
+ healthError?: string;
1226
+ mode?: 'tab' | 'wizard';
1227
+ /** Optional render prop for custom action buttons (e.g. analyze/troubleshoot). */
1228
+ renderActions?: (props: {
1229
+ dsUid: string;
1230
+ dsName: string;
1231
+ dsType: string;
1232
+ healthError?: string;
1233
+ }) => ReactNode;
1234
+ };
1235
+ declare function DatasourceConfigWizard(props: DatasourceConfigWizardProps): React.JSX.Element;
1236
+
1011
1237
  interface CustomHeader {
1012
1238
  id: string;
1013
1239
  name: string;
@@ -1232,4 +1458,98 @@ interface Props {
1232
1458
  }
1233
1459
  declare function RawQuery({ query, language, className }: Props): React.JSX.Element;
1234
1460
 
1235
- 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, DatePicker, type DatePickerProps, DatePickerWithInput, type DatePickerWithInputProps, DebounceInput, type DebounceInputProps, EditorField, EditorFieldGroup, EditorHeader, EditorList, EditorMode, EditorRow, EditorRows, EditorStack, EditorSwitch, FlexItem, GroupByRow, 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, 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 RAQBFieldTypes, RawQuery, type ResourceSelectorProps, type ResponseParser, RunQueryButton, 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, convertLegacyAuthProps, formatDate, getStandardSQLCompletionProvider, language as grafanaStandardSQLLanguage, conf as grafanaStandardSQLLanguageConf, toOption };
1461
+ type DatasourceResponse = Record<string, unknown> & {
1462
+ name: string;
1463
+ id: number;
1464
+ uid: string;
1465
+ access?: 'proxy' | 'direct';
1466
+ type?: string;
1467
+ typeLogoUrl?: string;
1468
+ url?: string;
1469
+ withCredentials?: boolean;
1470
+ basicAuth?: boolean;
1471
+ basicAuthUser?: string;
1472
+ user?: string;
1473
+ database?: string;
1474
+ jsonData?: Record<string, unknown>;
1475
+ secureJsonFields?: Record<string, boolean>;
1476
+ readOnly?: boolean;
1477
+ };
1478
+ type DatasourceConfigPayload = {
1479
+ rootFields: Record<string, unknown>;
1480
+ jsonData: Record<string, unknown>;
1481
+ secureJsonData: Record<string, string>;
1482
+ secureJsonFields: Record<string, boolean>;
1483
+ };
1484
+ type FormValues = Record<string, unknown>;
1485
+
1486
+ declare const SECURE_FIELD_CONFIGURED = "__CONFIGURED__";
1487
+ type FetchExistingResult = {
1488
+ values: FormValues;
1489
+ readOnly: boolean;
1490
+ error?: string;
1491
+ };
1492
+ /** Indexed pair item as stored in form values. Each item tracks its original storage index. */
1493
+ type IndexedPairItem = {
1494
+ /** Original storage index (e.g. 1 for httpHeaderName1). 0 = new item, not yet persisted. */
1495
+ index: number;
1496
+ name: string;
1497
+ value: string;
1498
+ };
1499
+ /**
1500
+ * Expand indexed pair storage (e.g. httpHeaderName1..N / httpHeaderValue1..N)
1501
+ * into an array of {index, name, value} items for the form.
1502
+ * Each item's `index` tracks its storage position so deletes don't shift others.
1503
+ * Scans all keys in the source record to find matching indices — no gap heuristics.
1504
+ */
1505
+ declare function expandIndexedPair(field: ConfigField, ds: DatasourceResponse): IndexedPairItem[];
1506
+ /**
1507
+ * Flatten an array of indexed pair items back into individual indexed keys
1508
+ * for jsonData and secureJsonData.
1509
+ */
1510
+ declare function flattenIndexedPair(field: ConfigField, items: IndexedPairItem[], jsonData: Record<string, unknown>, secureJsonData: Record<string, string>, secureJsonFields: Record<string, boolean>): void;
1511
+ declare function fetchExistingValues(dsUid: string, fields: ConfigField[]): Promise<FetchExistingResult>;
1512
+ declare function buildDatasourceConfigPayload(data: FormValues, fields: ConfigField[], existing: DatasourceResponse, isFieldVisible: (field: ConfigField) => boolean): DatasourceConfigPayload;
1513
+ declare function submitDatasourceConfig(dsUid: string, data: FormValues, fields: ConfigField[], isFieldVisible: (field: ConfigField) => boolean): Promise<void>;
1514
+
1515
+ /**
1516
+ * Generate LLM hints for select fields (used when creating datasources).
1517
+ */
1518
+ declare function generateLLMHint(schema: DatasourceConfigSchema): string;
1519
+ /**
1520
+ * Generate comprehensive structured field data for troubleshooting context.
1521
+ * Returns an array of field descriptors the LLM can use to render rich tables.
1522
+ */
1523
+ declare function generateTroubleshootingFields(schema: DatasourceConfigSchema): Array<{
1524
+ label: string;
1525
+ key: string;
1526
+ target: string;
1527
+ type: string;
1528
+ required: boolean;
1529
+ description?: string;
1530
+ defaultValue?: unknown;
1531
+ options?: string[];
1532
+ section?: string;
1533
+ dependsOn?: string;
1534
+ }>;
1535
+
1536
+ type ProvisioningYamlOptions = {
1537
+ /** Include comments with field descriptions. Default: true for template, false for export. */
1538
+ comments?: boolean;
1539
+ /** Name override (used in template mode). */
1540
+ name?: string;
1541
+ };
1542
+ /**
1543
+ * Generate a Grafana provisioning YAML from a dsconfig schema.
1544
+ * In template mode (no values), emits all fields with defaults and comments.
1545
+ * When values are provided, emits actual values — used for existing datasource export.
1546
+ */
1547
+ declare function toProvisioningYaml(schema: DatasourceConfigSchema, values?: Record<string, unknown>, options?: ProvisioningYamlOptions): string;
1548
+ /**
1549
+ * Generate provisioning YAML from an existing Grafana datasource API response.
1550
+ * If a dsconfig schema is available, uses it for field ordering and comments.
1551
+ * If not, generates basic YAML from the raw API response.
1552
+ */
1553
+ declare function datasourceToProvisioningYaml(ds: Record<string, unknown>, schema: DatasourceConfigSchema | null): string;
1554
+
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 };
@@ -6,7 +6,7 @@ import { useStyles2 } from '@grafana/ui';
6
6
  function ConfigDescriptionLink(props) {
7
7
  const { description, suffix, feature } = props;
8
8
  const text = `Learn more about ${feature}`;
9
- const styles = useStyles2(getStyles$c);
9
+ const styles = useStyles2(getStyles$g);
10
10
  return /* @__PURE__ */ React.createElement("span", { className: styles.container }, description, /* @__PURE__ */ React.createElement(
11
11
  "a",
12
12
  {
@@ -18,7 +18,7 @@ function ConfigDescriptionLink(props) {
18
18
  text
19
19
  ));
20
20
  }
21
- const getStyles$c = (theme) => {
21
+ const getStyles$g = (theme) => {
22
22
  return {
23
23
  container: css({
24
24
  color: theme.colors.text.secondary,
@@ -0,0 +1,53 @@
1
+ import React, { useMemo } from 'react';
2
+ import { Controller } from 'react-hook-form';
3
+ import { useStyles2, Tooltip, Icon } from '@grafana/ui';
4
+ import { IndexedPairEditor } from './IndexedPairEditor.js';
5
+ import { getWizardStyles } from './wizardStyles.js';
6
+
7
+ function AuthorizationHeaderField({
8
+ headersFieldKey,
9
+ control,
10
+ disabled,
11
+ watchedValues
12
+ }) {
13
+ const styles = useStyles2(getWizardStyles);
14
+ const items = useMemo(
15
+ () => Array.isArray(watchedValues[headersFieldKey]) ? watchedValues[headersFieldKey] : [],
16
+ [watchedValues, headersFieldKey]
17
+ );
18
+ const authEntries = useMemo(() => {
19
+ const entries = [];
20
+ for (let i = 0; i < items.length; i++) {
21
+ if (items[i].name.toLowerCase() === "authorization") {
22
+ entries.push({ item: items[i], originalIdx: i });
23
+ }
24
+ }
25
+ return entries;
26
+ }, [items]);
27
+ if (authEntries.length === 0) {
28
+ return null;
29
+ }
30
+ const authItems = authEntries.map((e) => e.item);
31
+ return /* @__PURE__ */ React.createElement(
32
+ Controller,
33
+ {
34
+ name: headersFieldKey,
35
+ control,
36
+ render: ({ field: formField }) => {
37
+ const handleChange = (updatedAuthItems) => {
38
+ const updated = [...items];
39
+ for (let i = 0; i < authEntries.length; i++) {
40
+ if (i < updatedAuthItems.length) {
41
+ updated[authEntries[i].originalIdx] = updatedAuthItems[i];
42
+ }
43
+ }
44
+ formField.onChange(updated);
45
+ };
46
+ return /* @__PURE__ */ React.createElement("div", { className: styles.fieldRow }, /* @__PURE__ */ React.createElement("div", { className: styles.fieldLabelRow }, /* @__PURE__ */ React.createElement("span", { className: styles.fieldLabel }, "Custom HTTP Headers"), /* @__PURE__ */ React.createElement(Tooltip, { content: "Authorization HTTP header(s) sent with every request." }, /* @__PURE__ */ React.createElement(Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React.createElement("div", { className: styles.fieldInputCol }, /* @__PURE__ */ React.createElement(IndexedPairEditor, { value: authItems, onChange: handleChange, disabled, hideControls: true })));
47
+ }
48
+ }
49
+ );
50
+ }
51
+
52
+ export { AuthorizationHeaderField };
53
+ //# sourceMappingURL=AuthorizationHeaderField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthorizationHeaderField.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/AuthorizationHeaderField.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { type useForm, Controller } from 'react-hook-form';\nimport { useStyles2, Icon, Tooltip } from '@grafana/ui';\nimport type { IndexedPairItem } from '../../../datasource/schema/datasource';\nimport type { FormValues } from '../../../datasource/schema/types';\nimport { IndexedPairEditor } from './IndexedPairEditor';\nimport { getWizardStyles } from './wizardStyles';\n\nexport function AuthorizationHeaderField({\n headersFieldKey,\n control,\n disabled,\n watchedValues,\n}: {\n headersFieldKey: string;\n control: ReturnType<typeof useForm<FormValues>>['control'];\n disabled?: boolean;\n watchedValues: Record<string, unknown>;\n}) {\n const styles = useStyles2(getWizardStyles);\n const items = useMemo(\n () => (Array.isArray(watchedValues[headersFieldKey]) ? watchedValues[headersFieldKey] : []) as IndexedPairItem[],\n [watchedValues, headersFieldKey]\n );\n\n const authEntries = useMemo(() => {\n const entries: Array<{ item: IndexedPairItem; originalIdx: number }> = [];\n for (let i = 0; i < items.length; i++) {\n if (items[i].name.toLowerCase() === 'authorization') {\n entries.push({ item: items[i], originalIdx: i });\n }\n }\n return entries;\n }, [items]);\n\n if (authEntries.length === 0) {\n return null;\n }\n\n const authItems = authEntries.map((e) => e.item);\n\n return (\n <Controller\n name={headersFieldKey}\n control={control}\n render={({ field: formField }) => {\n const handleChange = (updatedAuthItems: IndexedPairItem[]) => {\n const updated = [...items];\n for (let i = 0; i < authEntries.length; i++) {\n if (i < updatedAuthItems.length) {\n updated[authEntries[i].originalIdx] = updatedAuthItems[i];\n }\n }\n formField.onChange(updated);\n };\n\n return (\n <div className={styles.fieldRow}>\n <div className={styles.fieldLabelRow}>\n <span className={styles.fieldLabel}>Custom HTTP Headers</span>\n <Tooltip content=\"Authorization HTTP header(s) sent with every request.\">\n <Icon name=\"info-circle\" size=\"xs\" className={styles.fieldInfoIcon} />\n </Tooltip>\n </div>\n <div className={styles.fieldInputCol}>\n <IndexedPairEditor value={authItems} onChange={handleChange} disabled={disabled} hideControls />\n </div>\n </div>\n );\n }}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;AAQO,SAAS,wBAAA,CAAyB;AAAA,EACvC,eAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,MAAA,GAAS,WAAW,eAAe,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,MAAO,KAAA,CAAM,OAAA,CAAQ,aAAA,CAAc,eAAe,CAAC,CAAA,GAAI,aAAA,CAAc,eAAe,CAAA,GAAI,EAAC;AAAA,IACzF,CAAC,eAAe,eAAe;AAAA,GACjC;AAEA,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,MAAM,UAAiE,EAAC;AACxE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,WAAA,OAAkB,eAAA,EAAiB;AACnD,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAG,WAAA,EAAa,GAAG,CAAA;AAAA,MACjD;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAY,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAE/C,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,eAAA;AAAA,MACN,OAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,WAAU,KAAM;AAChC,QAAA,MAAM,YAAA,GAAe,CAAC,gBAAA,KAAwC;AAC5D,UAAA,MAAM,OAAA,GAAU,CAAC,GAAG,KAAK,CAAA;AACzB,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,YAAA,IAAI,CAAA,GAAI,iBAAiB,MAAA,EAAQ;AAC/B,cAAA,OAAA,CAAQ,YAAY,CAAC,CAAA,CAAE,WAAW,CAAA,GAAI,iBAAiB,CAAC,CAAA;AAAA,YAC1D;AAAA,UACF;AACA,UAAA,SAAA,CAAU,SAAS,OAAO,CAAA;AAAA,QAC5B,CAAA;AAEA,QAAA,uBACE,KAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAW,MAAA,CAAO,4BACrB,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,aAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAW,MAAA,CAAO,cAAY,qBAAmB,CAAA,sCACtD,OAAA,EAAA,EAAQ,OAAA,EAAQ,uDAAA,EAAA,kBACf,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAc,IAAA,EAAK,IAAA,EAAK,WAAW,MAAA,CAAO,aAAA,EAAe,CACtE,CACF,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,iCACrB,KAAA,CAAA,aAAA,CAAC,iBAAA,EAAA,EAAkB,OAAO,SAAA,EAAW,QAAA,EAAU,cAAc,QAAA,EAAoB,YAAA,EAAY,IAAA,EAAC,CAChG,CACF,CAAA;AAAA,MAEJ;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { css } from '@emotion/css';
3
+ import { useStyles2, Icon } from '@grafana/ui';
4
+
5
+ function ComplexFieldNote({ count, label }) {
6
+ const styles = useStyles2(getStyles$c);
7
+ return /* @__PURE__ */ React.createElement("div", { className: styles.note }, /* @__PURE__ */ React.createElement(Icon, { name: "info-circle", size: "xs" }), /* @__PURE__ */ React.createElement("span", null, count > 0 ? `${count} ${label.toLowerCase()} configured.` : `No ${label.toLowerCase()} configured.`, " Configure in Grafana UI."));
8
+ }
9
+ const getStyles$c = (theme) => ({
10
+ note: css({
11
+ display: "inline-flex",
12
+ alignItems: "center",
13
+ gap: theme.spacing(0.5),
14
+ padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,
15
+ fontSize: theme.typography.bodySmall.fontSize,
16
+ color: theme.colors.text.secondary,
17
+ backgroundColor: theme.colors.background.secondary,
18
+ borderRadius: theme.shape.radius.default,
19
+ border: `1px solid ${theme.colors.border.weak}`
20
+ })
21
+ });
22
+
23
+ export { ComplexFieldNote };
24
+ //# sourceMappingURL=ComplexFieldNote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComplexFieldNote.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/ComplexFieldNote.tsx"],"sourcesContent":["import React from 'react';\nimport { css } from '@emotion/css';\nimport type { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, Icon } from '@grafana/ui';\n\nexport function ComplexFieldNote({ count, label }: { count: number; label: string }) {\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.note}>\n <Icon name=\"info-circle\" size=\"xs\" />\n <span>\n {count > 0 ? `${count} ${label.toLowerCase()} configured.` : `No ${label.toLowerCase()} configured.`} Configure\n in Grafana UI.\n </span>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n note: css({\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.text.secondary,\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n }),\n});\n"],"names":["getStyles"],"mappings":";;;;AAKO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,KAAA,EAAM,EAAqC;AACnF,EAAA,MAAM,MAAA,GAAS,WAAWA,WAAS,CAAA;AACnC,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,IAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,aAAA,EAAc,IAAA,EAAK,IAAA,EAAK,CAAA,kBACnC,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EACE,KAAA,GAAQ,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAa,CAAA,YAAA,CAAA,GAAiB,CAAA,GAAA,EAAM,KAAA,CAAM,WAAA,EAAa,CAAA,YAAA,CAAA,EAAe,2BAEvG,CACF,CAAA;AAEJ;AAEA,MAAMA,WAAA,GAAY,CAAC,KAAA,MAA0B;AAAA,EAC3C,MAAM,GAAA,CAAI;AAAA,IACR,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,IACtB,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,IACrD,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,QAAA;AAAA,IACrC,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,SAAA;AAAA,IACzB,eAAA,EAAiB,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,SAAA;AAAA,IACzC,YAAA,EAAc,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAA;AAAA,IACjC,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,GAC9C;AACH,CAAA,CAAA;;;;"}