@grafana/plugin-ui 0.16.0-dsconfig.d7f2506 → 0.16.1

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 (220) hide show
  1. package/dist/cjs/index.cjs +15500 -11375
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +599 -930
  4. package/dist/esm/components/ConfigEditor/Auth/tls/TLSClientAuth.js +8 -5
  5. package/dist/esm/components/ConfigEditor/Auth/tls/TLSClientAuth.js.map +1 -1
  6. package/dist/esm/index.d.ts +599 -930
  7. package/dist/esm/index.js +2 -11
  8. package/dist/esm/index.js.map +1 -1
  9. package/dist/esm/node_modules/semver/classes/range.js +4 -24
  10. package/dist/esm/node_modules/semver/classes/range.js.map +1 -1
  11. package/dist/esm/node_modules/semver/classes/semver.js +2 -19
  12. package/dist/esm/node_modules/semver/classes/semver.js.map +1 -1
  13. package/dist/esm/node_modules/semver/functions/diff.js +1 -1
  14. package/dist/esm/node_modules/semver/functions/diff.js.map +1 -1
  15. package/dist/esm/node_modules/semver/index.js +0 -3
  16. package/dist/esm/node_modules/semver/index.js.map +1 -1
  17. package/dist/esm/node_modules/semver/internal/re.js +3 -3
  18. package/dist/esm/node_modules/semver/internal/re.js.map +1 -1
  19. package/dist/esm/node_modules/semver/ranges/subset.js +3 -3
  20. package/dist/esm/node_modules/semver/ranges/subset.js.map +1 -1
  21. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  22. package/dist/esm/schema/registry/alertmanager.schema.json.js +77 -0
  23. package/dist/esm/schema/registry/alertmanager.schema.json.js.map +1 -0
  24. package/dist/esm/schema/registry/cloudwatch.schema.json.js +384 -0
  25. package/dist/esm/schema/registry/cloudwatch.schema.json.js.map +1 -0
  26. package/dist/esm/schema/registry/elasticsearch.schema.json.js +287 -0
  27. package/dist/esm/schema/registry/elasticsearch.schema.json.js.map +1 -0
  28. package/dist/esm/schema/registry/grafana-amazonprometheus-datasource.schema.json.js +166 -0
  29. package/dist/esm/schema/registry/grafana-amazonprometheus-datasource.schema.json.js.map +1 -0
  30. package/dist/esm/schema/registry/grafana-appdynamics-datasource.schema.json.js +145 -0
  31. package/dist/esm/schema/registry/grafana-appdynamics-datasource.schema.json.js.map +1 -0
  32. package/dist/esm/schema/registry/grafana-astradb-datasource.schema.json.js +123 -0
  33. package/dist/esm/schema/registry/grafana-astradb-datasource.schema.json.js.map +1 -0
  34. package/dist/esm/schema/registry/grafana-athena-datasource.schema.json.js +158 -0
  35. package/dist/esm/schema/registry/grafana-athena-datasource.schema.json.js.map +1 -0
  36. package/dist/esm/schema/registry/grafana-azure-data-explorer-datasource.schema.json.js +204 -0
  37. package/dist/esm/schema/registry/grafana-azure-data-explorer-datasource.schema.json.js.map +1 -0
  38. package/dist/esm/schema/registry/grafana-azure-monitor-datasource.schema.json.js +294 -0
  39. package/dist/esm/schema/registry/grafana-azure-monitor-datasource.schema.json.js.map +1 -0
  40. package/dist/esm/schema/registry/grafana-azuredevops-datasource.schema.json.js +101 -0
  41. package/dist/esm/schema/registry/grafana-azuredevops-datasource.schema.json.js.map +1 -0
  42. package/dist/esm/schema/registry/grafana-azureprometheus-datasource.schema.json.js +125 -0
  43. package/dist/esm/schema/registry/grafana-azureprometheus-datasource.schema.json.js.map +1 -0
  44. package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js +508 -0
  45. package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js.map +1 -0
  46. package/dist/esm/schema/registry/grafana-clickhouse-datasource.schema.json.js +1400 -0
  47. package/dist/esm/schema/registry/grafana-clickhouse-datasource.schema.json.js.map +1 -0
  48. package/dist/esm/schema/registry/grafana-cockroachdb-datasource.schema.json.js +302 -0
  49. package/dist/esm/schema/registry/grafana-cockroachdb-datasource.schema.json.js.map +1 -0
  50. package/dist/esm/schema/registry/grafana-databricks-datasource.schema.json.js +291 -0
  51. package/dist/esm/schema/registry/grafana-databricks-datasource.schema.json.js.map +1 -0
  52. package/dist/esm/schema/registry/grafana-datadog-datasource.schema.json.js +155 -0
  53. package/dist/esm/schema/registry/grafana-datadog-datasource.schema.json.js.map +1 -0
  54. package/dist/esm/schema/registry/grafana-dynatrace-datasource.schema.json.js +179 -0
  55. package/dist/esm/schema/registry/grafana-dynatrace-datasource.schema.json.js.map +1 -0
  56. package/dist/esm/schema/registry/grafana-falconlogscale-datasource.schema.json.js +134 -0
  57. package/dist/esm/schema/registry/grafana-falconlogscale-datasource.schema.json.js.map +1 -0
  58. package/dist/esm/schema/registry/grafana-github-datasource.schema.json.js +156 -0
  59. package/dist/esm/schema/registry/grafana-github-datasource.schema.json.js.map +1 -0
  60. package/dist/esm/schema/registry/grafana-gitlab-datasource.schema.json.js +84 -0
  61. package/dist/esm/schema/registry/grafana-gitlab-datasource.schema.json.js.map +1 -0
  62. package/dist/esm/schema/registry/grafana-googlesheets-datasource.schema.json.js +231 -0
  63. package/dist/esm/schema/registry/grafana-googlesheets-datasource.schema.json.js.map +1 -0
  64. package/dist/esm/schema/registry/grafana-honeycomb-datasource.schema.json.js +87 -0
  65. package/dist/esm/schema/registry/grafana-honeycomb-datasource.schema.json.js.map +1 -0
  66. package/dist/esm/schema/registry/grafana-iot-sitewise-datasource.schema.json.js +159 -0
  67. package/dist/esm/schema/registry/grafana-iot-sitewise-datasource.schema.json.js.map +1 -0
  68. package/dist/esm/schema/registry/grafana-jira-datasource.schema.json.js +188 -0
  69. package/dist/esm/schema/registry/grafana-jira-datasource.schema.json.js.map +1 -0
  70. package/dist/esm/schema/registry/grafana-looker-datasource.schema.json.js +82 -0
  71. package/dist/esm/schema/registry/grafana-looker-datasource.schema.json.js.map +1 -0
  72. package/dist/esm/schema/registry/grafana-mongodb-datasource.schema.json.js +278 -0
  73. package/dist/esm/schema/registry/grafana-mongodb-datasource.schema.json.js.map +1 -0
  74. package/dist/esm/schema/registry/grafana-mqtt-datasource.schema.json.js +168 -0
  75. package/dist/esm/schema/registry/grafana-mqtt-datasource.schema.json.js.map +1 -0
  76. package/dist/esm/schema/registry/grafana-newrelic-datasource.schema.json.js +129 -0
  77. package/dist/esm/schema/registry/grafana-newrelic-datasource.schema.json.js.map +1 -0
  78. package/dist/esm/schema/registry/grafana-odbc-datasource.schema.json.js +56 -0
  79. package/dist/esm/schema/registry/grafana-odbc-datasource.schema.json.js.map +1 -0
  80. package/dist/esm/schema/registry/grafana-opensearch-datasource.schema.json.js +212 -0
  81. package/dist/esm/schema/registry/grafana-opensearch-datasource.schema.json.js.map +1 -0
  82. package/dist/esm/schema/registry/grafana-oracle-datasource.schema.json.js +186 -0
  83. package/dist/esm/schema/registry/grafana-oracle-datasource.schema.json.js.map +1 -0
  84. package/dist/esm/schema/registry/grafana-pagerduty-datasource.schema.json.js +85 -0
  85. package/dist/esm/schema/registry/grafana-pagerduty-datasource.schema.json.js.map +1 -0
  86. package/dist/esm/schema/registry/grafana-postgresql-datasource.schema.json.js +411 -0
  87. package/dist/esm/schema/registry/grafana-postgresql-datasource.schema.json.js.map +1 -0
  88. package/dist/esm/schema/registry/grafana-pyroscope-datasource.schema.json.js +41 -0
  89. package/dist/esm/schema/registry/grafana-pyroscope-datasource.schema.json.js.map +1 -0
  90. package/dist/esm/schema/registry/grafana-redshift-datasource.schema.json.js +201 -0
  91. package/dist/esm/schema/registry/grafana-redshift-datasource.schema.json.js.map +1 -0
  92. package/dist/esm/schema/registry/grafana-salesforce-datasource.schema.json.js +201 -0
  93. package/dist/esm/schema/registry/grafana-salesforce-datasource.schema.json.js.map +1 -0
  94. package/dist/esm/schema/registry/grafana-saphana-datasource.schema.json.js +208 -0
  95. package/dist/esm/schema/registry/grafana-saphana-datasource.schema.json.js.map +1 -0
  96. package/dist/esm/schema/registry/grafana-sentry-datasource.schema.json.js +94 -0
  97. package/dist/esm/schema/registry/grafana-sentry-datasource.schema.json.js.map +1 -0
  98. package/dist/esm/schema/registry/grafana-servicenow-datasource.schema.json.js +179 -0
  99. package/dist/esm/schema/registry/grafana-servicenow-datasource.schema.json.js.map +1 -0
  100. package/dist/esm/schema/registry/grafana-snowflake-datasource.schema.json.js +304 -0
  101. package/dist/esm/schema/registry/grafana-snowflake-datasource.schema.json.js.map +1 -0
  102. package/dist/esm/schema/registry/grafana-splunk-datasource.schema.json.js +319 -0
  103. package/dist/esm/schema/registry/grafana-splunk-datasource.schema.json.js.map +1 -0
  104. package/dist/esm/schema/registry/grafana-splunkobservability-datasource.schema.json.js +90 -0
  105. package/dist/esm/schema/registry/grafana-splunkobservability-datasource.schema.json.js.map +1 -0
  106. package/dist/esm/schema/registry/grafana-strava-datasource.schema.json.js +74 -0
  107. package/dist/esm/schema/registry/grafana-strava-datasource.schema.json.js.map +1 -0
  108. package/dist/esm/schema/registry/grafana-sumologic-datasource.schema.json.js +102 -0
  109. package/dist/esm/schema/registry/grafana-sumologic-datasource.schema.json.js.map +1 -0
  110. package/dist/esm/schema/registry/grafana-surrealdb-datasource.schema.json.js +92 -0
  111. package/dist/esm/schema/registry/grafana-surrealdb-datasource.schema.json.js.map +1 -0
  112. package/dist/esm/schema/registry/grafana-timestream-datasource.schema.json.js +145 -0
  113. package/dist/esm/schema/registry/grafana-timestream-datasource.schema.json.js.map +1 -0
  114. package/dist/esm/schema/registry/grafana-wavefront-datasource.schema.json.js +80 -0
  115. package/dist/esm/schema/registry/grafana-wavefront-datasource.schema.json.js.map +1 -0
  116. package/dist/esm/schema/registry/grafana-x-ray-datasource.schema.json.js +112 -0
  117. package/dist/esm/schema/registry/grafana-x-ray-datasource.schema.json.js.map +1 -0
  118. package/dist/esm/schema/registry/grafana-yugabyte-datasource.schema.json.js +114 -0
  119. package/dist/esm/schema/registry/grafana-yugabyte-datasource.schema.json.js.map +1 -0
  120. package/dist/esm/schema/registry/graphite.schema.json.js +104 -0
  121. package/dist/esm/schema/registry/graphite.schema.json.js.map +1 -0
  122. package/dist/esm/schema/registry/index.js +27 -0
  123. package/dist/esm/schema/registry/index.js.map +1 -0
  124. package/dist/esm/schema/registry/influxdb.schema.json.js +717 -0
  125. package/dist/esm/schema/registry/influxdb.schema.json.js.map +1 -0
  126. package/dist/esm/schema/registry/jaeger.schema.json.js +59 -0
  127. package/dist/esm/schema/registry/jaeger.schema.json.js.map +1 -0
  128. package/dist/esm/schema/registry/loki.schema.json.js +545 -0
  129. package/dist/esm/schema/registry/loki.schema.json.js.map +1 -0
  130. package/dist/esm/schema/registry/marcusolsson-csv-datasource.schema.json.js +45 -0
  131. package/dist/esm/schema/registry/marcusolsson-csv-datasource.schema.json.js.map +1 -0
  132. package/dist/esm/schema/registry/marcusolsson-json-datasource.schema.json.js +36 -0
  133. package/dist/esm/schema/registry/marcusolsson-json-datasource.schema.json.js.map +1 -0
  134. package/dist/esm/schema/registry/mssql.schema.json.js +292 -0
  135. package/dist/esm/schema/registry/mssql.schema.json.js.map +1 -0
  136. package/dist/esm/schema/registry/mysql.schema.json.js +304 -0
  137. package/dist/esm/schema/registry/mysql.schema.json.js.map +1 -0
  138. package/dist/esm/schema/registry/opentsdb.schema.json.js +113 -0
  139. package/dist/esm/schema/registry/opentsdb.schema.json.js.map +1 -0
  140. package/dist/esm/schema/registry/prometheus.schema.json.js +783 -0
  141. package/dist/esm/schema/registry/prometheus.schema.json.js.map +1 -0
  142. package/dist/esm/schema/registry/stackdriver.schema.json.js +224 -0
  143. package/dist/esm/schema/registry/stackdriver.schema.json.js.map +1 -0
  144. package/dist/esm/schema/registry/staticRegistry.js +135 -0
  145. package/dist/esm/schema/registry/staticRegistry.js.map +1 -0
  146. package/dist/esm/schema/registry/tempo.schema.json.js +664 -0
  147. package/dist/esm/schema/registry/tempo.schema.json.js.map +1 -0
  148. package/dist/esm/schema/registry/zipkin.schema.json.js +40 -0
  149. package/dist/esm/schema/registry/zipkin.schema.json.js.map +1 -0
  150. package/package.json +2 -3
  151. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +0 -217
  152. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +0 -1
  153. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js +0 -27
  154. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js.map +0 -1
  155. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/FieldInput.js +0 -135
  156. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/FieldInput.js.map +0 -1
  157. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +0 -80
  158. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +0 -1
  159. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js +0 -54
  160. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +0 -1
  161. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +0 -155
  162. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +0 -1
  163. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js +0 -75
  164. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js.map +0 -1
  165. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js +0 -262
  166. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js.map +0 -1
  167. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js +0 -354
  168. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js.map +0 -1
  169. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +0 -138
  170. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +0 -1
  171. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/formInterpreter.js +0 -93
  172. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/formInterpreter.js.map +0 -1
  173. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js +0 -253
  174. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +0 -1
  175. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js +0 -106
  176. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +0 -1
  177. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js +0 -52
  178. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +0 -1
  179. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js +0 -26
  180. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +0 -1
  181. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +0 -106
  182. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +0 -1
  183. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js +0 -124
  184. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +0 -1
  185. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +0 -190
  186. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +0 -1
  187. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js +0 -31
  188. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js.map +0 -1
  189. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PrimitiveInputs.js +0 -103
  190. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PrimitiveInputs.js.map +0 -1
  191. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js +0 -59
  192. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +0 -1
  193. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +0 -80
  194. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +0 -1
  195. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/layoutParts.js +0 -82
  196. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/layoutParts.js.map +0 -1
  197. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js +0 -30
  198. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js.map +0 -1
  199. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js +0 -340
  200. package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js.map +0 -1
  201. package/dist/esm/node_modules/js-yaml/dist/js-yaml.js +0 -3043
  202. package/dist/esm/node_modules/js-yaml/dist/js-yaml.js.map +0 -1
  203. package/dist/esm/node_modules/react-hook-form/dist/index.esm.js +0 -2766
  204. package/dist/esm/node_modules/react-hook-form/dist/index.esm.js.map +0 -1
  205. package/dist/esm/node_modules/semver/functions/truncate.js +0 -62
  206. package/dist/esm/node_modules/semver/functions/truncate.js.map +0 -1
  207. package/dist/esm/schema/utils/constants.js +0 -5
  208. package/dist/esm/schema/utils/constants.js.map +0 -1
  209. package/dist/esm/schema/utils/dsconfig.js +0 -97
  210. package/dist/esm/schema/utils/dsconfig.js.map +0 -1
  211. package/dist/esm/schema/utils/llm.js +0 -54
  212. package/dist/esm/schema/utils/llm.js.map +0 -1
  213. package/dist/esm/schema/utils/packs.js +0 -113
  214. package/dist/esm/schema/utils/packs.js.map +0 -1
  215. package/dist/esm/schema/utils/provisioning.js +0 -434
  216. package/dist/esm/schema/utils/provisioning.js.map +0 -1
  217. package/dist/esm/schema/utils/registry.js +0 -32
  218. package/dist/esm/schema/utils/registry.js.map +0 -1
  219. package/dist/esm/schema/utils/useDatasourceSchema.js +0 -39
  220. package/dist/esm/schema/utils/useDatasourceSchema.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafana/plugin-ui",
3
- "version": "0.16.0-dsconfig.d7f2506",
3
+ "version": "0.16.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+ssh://git@github.com/grafana/plugin-ui.git"
@@ -61,7 +61,6 @@
61
61
  "dependencies": {
62
62
  "@emotion/css": "11.13.5",
63
63
  "@hello-pangea/dnd": "17.0.0",
64
- "@marcbachmann/cel-js": "7.6.1",
65
64
  "@react-awesome-query-builder/ui": "6.6.12",
66
65
  "lodash": "4.18.1",
67
66
  "prismjs": "1.30.0",
@@ -73,7 +72,7 @@
73
72
  "uuid": "14.0.0"
74
73
  },
75
74
  "devDependencies": {
76
- "@arethetypeswrong/cli": "0.18.4",
75
+ "@arethetypeswrong/cli": "0.17.3",
77
76
  "@grafana/data": "10.4.7",
78
77
  "@grafana/e2e-selectors": "10.4.7",
79
78
  "@grafana/eslint-config": "8.0.0",
@@ -1,217 +0,0 @@
1
- import React, { useState, useMemo, useCallback } from 'react';
2
- import { useStyles2, Spinner, Icon, Tooltip, Button, Select } from '@grafana/ui';
3
- import { formKey, getWatchedValue, isAuthGroupId } from './config.js';
4
- import { SECURE_FIELD_CONFIGURED } from './datasource.js';
5
- import { isFieldRequired } from './fieldUtils.js';
6
- import { FetchErrorState, GroupFields, FormFooter } from './layoutParts.js';
7
- import { TabLayout } from './TabLayout.js';
8
- import { getWizardStyles } from './styles.js';
9
- import { useDatasourceConfigForm } from './hooks/useDatasourceConfigForm.js';
10
-
11
- function DatasourceConfigWizard(props) {
12
- const { schema, dsUid, dsName, onSuccess, onSaving, onRetest, healthError, renderActions, mode = "tab" } = props;
13
- const form = useDatasourceConfigForm({ schema, dsUid, onSuccess, onSaving });
14
- if (mode === "tab") {
15
- return /* @__PURE__ */ React.createElement(
16
- TabLayout,
17
- {
18
- form,
19
- schema,
20
- dsUid,
21
- dsName,
22
- onRetest,
23
- healthError,
24
- renderActions
25
- }
26
- );
27
- }
28
- return /* @__PURE__ */ React.createElement(
29
- WizardLayout,
30
- {
31
- form,
32
- schema,
33
- dsUid,
34
- dsName,
35
- onRetest,
36
- healthError,
37
- renderActions
38
- }
39
- );
40
- }
41
- function WizardLayout({ form, schema, dsUid, dsName, onRetest, healthError, renderActions }) {
42
- var _a, _b, _c;
43
- const styles = useStyles2(getWizardStyles);
44
- const [currentStep, setCurrentStep] = useState(0);
45
- const {
46
- resolvedGroups,
47
- fieldById,
48
- handleSubmit,
49
- trigger,
50
- errors,
51
- watchedValues,
52
- celContext,
53
- initializing,
54
- fetchError,
55
- submitting,
56
- readOnly,
57
- isFieldVisible,
58
- onSubmit
59
- } = form;
60
- const arrowSteps = useMemo(() => {
61
- const requiredGroup = resolvedGroups.find((g) => g.group.id === "_required");
62
- if (!requiredGroup) {
63
- return new Set(resolvedGroups.map((_, i) => i));
64
- }
65
- const requiredFieldIds = new Set(requiredGroup.fields.map((f) => f.id));
66
- const steps = /* @__PURE__ */ new Set();
67
- for (let i = 0; i < resolvedGroups.length; i++) {
68
- const g = resolvedGroups[i];
69
- if (g.group.id === "_required" || g.fields.some((f) => !requiredFieldIds.has(f.id))) {
70
- steps.add(i);
71
- }
72
- }
73
- return steps;
74
- }, [resolvedGroups]);
75
- const currentResolved = resolvedGroups[currentStep];
76
- const isFirstStep = useMemo(() => {
77
- for (let i = 0; i < currentStep; i++) {
78
- if (arrowSteps.has(i)) {
79
- return false;
80
- }
81
- }
82
- return true;
83
- }, [currentStep, arrowSteps]);
84
- const isLastStep = useMemo(() => {
85
- for (let i = currentStep + 1; i < resolvedGroups.length; i++) {
86
- if (arrowSteps.has(i)) {
87
- return false;
88
- }
89
- }
90
- return true;
91
- }, [currentStep, arrowSteps, resolvedGroups.length]);
92
- const visibleFieldsForStep = useMemo(
93
- () => currentResolved ? currentResolved.fields.filter(isFieldVisible) : [],
94
- [currentResolved, isFieldVisible]
95
- );
96
- const currentGroupValid = useMemo(() => {
97
- if (!currentResolved) {
98
- return true;
99
- }
100
- for (const field of visibleFieldsForStep) {
101
- if (errors[formKey(field)]) {
102
- return false;
103
- }
104
- if (isFieldRequired(field, watchedValues, fieldById, celContext)) {
105
- const val = getWatchedValue(watchedValues, formKey(field));
106
- if (val === SECURE_FIELD_CONFIGURED) {
107
- continue;
108
- }
109
- if (val === undefined || val === null || val === "") {
110
- return false;
111
- }
112
- }
113
- }
114
- return true;
115
- }, [currentResolved, errors, visibleFieldsForStep, watchedValues, fieldById, celContext]);
116
- const goNext = useCallback(async () => {
117
- if (!currentResolved) {
118
- return;
119
- }
120
- if (!readOnly) {
121
- const visibleKeys = visibleFieldsForStep.map((f) => formKey(f));
122
- const valid = await trigger(visibleKeys);
123
- if (!valid) {
124
- return;
125
- }
126
- }
127
- setCurrentStep((s) => {
128
- for (let i = s + 1; i < resolvedGroups.length; i++) {
129
- if (arrowSteps.has(i)) {
130
- return i;
131
- }
132
- }
133
- return s;
134
- });
135
- }, [currentResolved, visibleFieldsForStep, trigger, resolvedGroups.length, arrowSteps, readOnly]);
136
- const goPrev = useCallback(() => {
137
- setCurrentStep((s) => {
138
- for (let i = s - 1; i >= 0; i--) {
139
- if (arrowSteps.has(i)) {
140
- return i;
141
- }
142
- }
143
- return s;
144
- });
145
- }, [arrowSteps]);
146
- if (initializing) {
147
- return /* @__PURE__ */ React.createElement("div", { className: styles.container }, /* @__PURE__ */ React.createElement(Spinner, { size: "sm", inline: true }), " Loading configuration...");
148
- }
149
- if (fetchError) {
150
- return /* @__PURE__ */ React.createElement("div", { className: styles.container }, /* @__PURE__ */ React.createElement(FetchErrorState, { error: fetchError, dsUid, buttonClassName: styles.buttons }));
151
- }
152
- if (resolvedGroups.length === 0) {
153
- return null;
154
- }
155
- const currentGroup = currentResolved == null ? undefined : currentResolved.group;
156
- return /* @__PURE__ */ React.createElement("div", { className: styles.container }, submitting && /* @__PURE__ */ React.createElement("div", { className: styles.overlay }, /* @__PURE__ */ React.createElement(Spinner, { size: "sm" }), /* @__PURE__ */ React.createElement("span", null, "Saving & testing\u2026")), readOnly && /* @__PURE__ */ React.createElement("div", { className: styles.readOnlyBanner }, /* @__PURE__ */ React.createElement(Icon, { name: "lock", size: "xs" }), /* @__PURE__ */ React.createElement("span", null, "Read-only \u2014 managed externally")), /* @__PURE__ */ React.createElement("div", { className: styles.navBar }, currentGroup && /* @__PURE__ */ React.createElement(Tooltip, { content: (_a = currentGroup.description) != null ? _a : currentGroup.title }, /* @__PURE__ */ React.createElement("span", { className: styles.navTitle }, currentGroup.title, /* @__PURE__ */ React.createElement("span", { className: styles.stepCount }, currentStep + 1, "/", resolvedGroups.length))), /* @__PURE__ */ React.createElement("div", { className: styles.navActions }, /* @__PURE__ */ React.createElement(Tooltip, { content: isFirstStep ? "First step" : `Previous: ${(_b = resolvedGroups[currentStep - 1]) == null ? undefined : _b.group.title}` }, /* @__PURE__ */ React.createElement(
157
- Button,
158
- {
159
- variant: "secondary",
160
- fill: "text",
161
- size: "sm",
162
- icon: "angle-left",
163
- "aria-label": "Previous",
164
- onClick: goPrev,
165
- disabled: isFirstStep || submitting,
166
- type: "button"
167
- }
168
- )), /* @__PURE__ */ React.createElement(
169
- Select,
170
- {
171
- options: resolvedGroups.map((g, i) => ({ label: g.group.title, value: i })),
172
- value: currentStep,
173
- onChange: (v) => {
174
- if (v) {
175
- setCurrentStep(v.value);
176
- }
177
- },
178
- disabled: submitting,
179
- width: 18
180
- }
181
- ), /* @__PURE__ */ React.createElement(Tooltip, { content: isLastStep ? "Last step" : `Next: ${(_c = resolvedGroups[currentStep + 1]) == null ? undefined : _c.group.title}` }, /* @__PURE__ */ React.createElement(
182
- Button,
183
- {
184
- variant: isLastStep || !readOnly && !currentGroupValid ? "secondary" : "primary",
185
- size: "sm",
186
- icon: "angle-right",
187
- "aria-label": "Next",
188
- onClick: goNext,
189
- disabled: isLastStep || submitting,
190
- type: "button"
191
- }
192
- )))), currentResolved && /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit(onSubmit), className: styles.form }, /* @__PURE__ */ React.createElement(
193
- GroupFields,
194
- {
195
- group: currentResolved,
196
- form,
197
- dsUid,
198
- showAuthHeaders: currentResolved.group.id === "_required" || isAuthGroupId(currentResolved.group.id)
199
- }
200
- ), /* @__PURE__ */ React.createElement(
201
- FormFooter,
202
- {
203
- form,
204
- schema,
205
- dsUid,
206
- dsName,
207
- onRetest,
208
- healthError,
209
- renderActions,
210
- saveDisabled: submitting || !currentGroupValid,
211
- className: styles.buttons
212
- }
213
- )));
214
- }
215
-
216
- export { DatasourceConfigWizard };
217
- //# sourceMappingURL=DatasourceConfigWizard.js.map
@@ -1 +0,0 @@
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, Select, Icon, Tooltip, Spinner } from '@grafana/ui';\nimport type { DatasourceConfigSchema } from '../../../schema/schema';\nimport { formKey, getWatchedValue, isAuthGroupId } from './config';\nimport { SECURE_FIELD_CONFIGURED } from './datasource';\nimport { isFieldRequired } from './fieldUtils';\nimport { GroupFields, FormFooter, FetchErrorState } from './layoutParts';\nimport { TabLayout } from './TabLayout';\nimport { getWizardStyles } from './styles';\nimport { useDatasourceConfigForm } from './hooks/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 handleSubmit,\n trigger,\n errors,\n watchedValues,\n celContext,\n initializing,\n fetchError,\n submitting,\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, celContext)) {\n const val = getWatchedValue(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, celContext]);\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 <FetchErrorState error={fetchError} dsUid={dsUid} buttonClassName={styles.buttons} />\n </div>\n );\n }\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 <GroupFields\n group={currentResolved}\n form={form}\n dsUid={dsUid}\n showAuthHeaders={currentResolved.group.id === '_required' || isAuthGroupId(currentResolved.group.id)}\n />\n <FormFooter\n form={form}\n schema={schema}\n dsUid={dsUid}\n dsName={dsName}\n onRetest={onRetest}\n healthError={healthError}\n renderActions={renderActions}\n saveDisabled={submitting || !currentGroupValid}\n className={styles.buttons}\n />\n </form>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- import React, { Component } from 'react';
2
- import { Alert } from '@grafana/ui';
3
-
4
- var __defProp = Object.defineProperty;
5
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
- var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
7
- class DatasourceErrorBoundary extends Component {
8
- constructor() {
9
- super(...arguments);
10
- __publicField(this, "state", { error: null });
11
- }
12
- static getDerivedStateFromError(error) {
13
- return { error };
14
- }
15
- componentDidCatch(error, info) {
16
- console.error("[DatasourceConfigWizard] Caught error:", error, info.componentStack);
17
- }
18
- render() {
19
- if (this.state.error) {
20
- return /* @__PURE__ */ React.createElement(Alert, { severity: "warning", title: "Configuration wizard unavailable" }, "Could not load the configuration wizard", this.props.dsName ? ` for ${this.props.dsName}` : "", ". Use the Settings link to configure this datasource manually.");
21
- }
22
- return this.props.children;
23
- }
24
- }
25
-
26
- export { DatasourceErrorBoundary };
27
- //# sourceMappingURL=DatasourceErrorBoundary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DatasourceErrorBoundary.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.tsx"],"sourcesContent":["import React, { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { Alert } from '@grafana/ui';\n\n/** Lightweight error boundary scoped to datasource config widgets — won't crash the host UI. */\nexport class DatasourceErrorBoundary extends Component<\n { children: ReactNode; dsName?: string },\n { error: Error | null }\n> {\n state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error('[DatasourceConfigWizard] Caught error:', error, info.componentStack);\n }\n\n render() {\n if (this.state.error) {\n return (\n <Alert severity=\"warning\" title=\"Configuration wizard unavailable\">\n Could not load the configuration wizard\n {this.props.dsName ? ` for ${this.props.dsName}` : ''}. Use the Settings link to configure this datasource\n manually.\n </Alert>\n );\n }\n return this.props.children;\n }\n}\n"],"names":[],"mappings":";;;;;;AAIO,MAAM,gCAAgC,SAG3C,CAAA;AAAA,EAHK,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAIL,IAAiC,aAAA,CAAA,IAAA,EAAA,OAAA,EAAA,EAAE,OAAO,IAAK,EAAA,CAAA;AAAA;AAAA,EAE/C,OAAO,yBAAyB,KAAc,EAAA;AAC5C,IAAA,OAAO,EAAE,KAAM,EAAA;AAAA;AACjB,EAEA,iBAAA,CAAkB,OAAc,IAAiB,EAAA;AAC/C,IAAA,OAAA,CAAQ,KAAM,CAAA,wCAAA,EAA0C,KAAO,EAAA,IAAA,CAAK,cAAc,CAAA;AAAA;AACpF,EAEA,MAAS,GAAA;AACP,IAAI,IAAA,IAAA,CAAK,MAAM,KAAO,EAAA;AACpB,MAAA,2CACG,KAAM,EAAA,EAAA,QAAA,EAAS,SAAU,EAAA,KAAA,EAAM,sCAAmC,yCAEhE,EAAA,IAAA,CAAK,KAAM,CAAA,MAAA,GAAS,QAAQ,IAAK,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA,GAAK,IAAG,gEAExD,CAAA;AAAA;AAGJ,IAAA,OAAO,KAAK,KAAM,CAAA,QAAA;AAAA;AAEtB;;;;"}
@@ -1,135 +0,0 @@
1
- import React from 'react';
2
- import { SecureFieldInput } from './inputs/SecureFieldInput.js';
3
- import { StringArrayInput } from './inputs/StringArrayInput.js';
4
- import { IndexedPairEditor } from './inputs/IndexedPairEditor.js';
5
- import { FileUploadField } from './inputs/FileUploadField.js';
6
- import { ObjectArrayEditor } from './inputs/ObjectArrayEditor.js';
7
- import { ComplexFieldNote } from './inputs/ComplexFieldNote.js';
8
- import { RadioInput, SelectInput, BooleanInput, NumberInput, TextAreaInput, TextInput } from './inputs/PrimitiveInputs.js';
9
-
10
- function resolveFieldInputKind(field, hasSetValue) {
11
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
12
- if (((_a = field.ui) == null ? undefined : _a.component) === "fileUpload" && field.ui.fileMapping && hasSetValue) {
13
- return "fileUpload";
14
- }
15
- if (field.target === "secureJsonData") {
16
- return "secure";
17
- }
18
- if (((_b = field.ui) == null ? undefined : _b.component) === "radio") {
19
- return "radio";
20
- }
21
- if (((_c = field.ui) == null ? undefined : _c.component) === "select") {
22
- return "select";
23
- }
24
- if (field.valueType === "boolean") {
25
- return "boolean";
26
- }
27
- if (field.valueType === "number") {
28
- return "number";
29
- }
30
- if (((_d = field.ui) == null ? undefined : _d.component) === "textarea") {
31
- return "textarea";
32
- }
33
- if (((_e = field.storage) == null ? undefined : _e.type) === "indexedPair") {
34
- return "indexedPair";
35
- }
36
- if (field.valueType === "array" && ((_f = field.item) == null ? undefined : _f.valueType) === "string") {
37
- return "stringArray";
38
- }
39
- if (field.valueType === "array" && ((_g = field.item) == null ? undefined : _g.valueType) === "object" && ((_h = field.item.fields) == null ? undefined : _h.length)) {
40
- return "objectArray";
41
- }
42
- if (field.valueType === "object" || field.valueType === "map" || field.valueType === "array" && (((_i = field.item) == null ? undefined : _i.valueType) === "object" || ((_j = field.item) == null ? undefined : _j.valueType) === "map")) {
43
- return "complex";
44
- }
45
- return "text";
46
- }
47
- function SecureInput({ field, formField, disabled }) {
48
- var _a, _b, _c;
49
- const label = (_a = field.label) != null ? _a : field.key;
50
- return /* @__PURE__ */ React.createElement(
51
- SecureFieldInput,
52
- {
53
- formField,
54
- placeholder: (_c = (_b = field.ui) == null ? undefined : _b.placeholder) != null ? _c : label,
55
- disabled,
56
- label
57
- }
58
- );
59
- }
60
- function FileUploadInput({ field, formField, disabled, setValue }) {
61
- if (!setValue) {
62
- return null;
63
- }
64
- return /* @__PURE__ */ React.createElement(FileUploadField, { field, formField, disabled, setValue });
65
- }
66
- function IndexedPairInput({ field, formField, disabled }) {
67
- var _a, _b, _c, _d, _e;
68
- const items = Array.isArray(formField.value) ? formField.value : [];
69
- const maxItems = (_c = (_b = (_a = field.validations) == null ? undefined : _a.find((v) => v.type === "itemCount")) == null ? undefined : _b.max) != null ? _c : 10;
70
- const itemLabel = (_e = (_d = field.label) == null ? undefined : _d.toLowerCase().replace(/s$/, "")) != null ? _e : "header";
71
- return /* @__PURE__ */ React.createElement(
72
- IndexedPairEditor,
73
- {
74
- value: items,
75
- onChange: formField.onChange,
76
- maxItems,
77
- disabled,
78
- itemLabel
79
- }
80
- );
81
- }
82
- function StringArrayField({ field, formField, disabled }) {
83
- var _a, _b;
84
- const label = (_a = field.label) != null ? _a : field.key;
85
- return /* @__PURE__ */ React.createElement(
86
- StringArrayInput,
87
- {
88
- value: Array.isArray(formField.value) ? formField.value : [],
89
- onChange: formField.onChange,
90
- placeholder: (_b = field.ui) == null ? undefined : _b.placeholder,
91
- disabled,
92
- itemLabel: label.toLowerCase().replace(/s$/, "")
93
- }
94
- );
95
- }
96
- function ObjectArrayInput({ field, formField, disabled, errorMessage }) {
97
- return /* @__PURE__ */ React.createElement(
98
- ObjectArrayEditor,
99
- {
100
- field,
101
- value: formField.value,
102
- onChange: formField.onChange,
103
- disabled,
104
- errorMessage
105
- }
106
- );
107
- }
108
- function ComplexInput({ field, formField }) {
109
- var _a;
110
- const label = (_a = field.label) != null ? _a : field.key;
111
- const count = Array.isArray(formField.value) ? formField.value.length : 0;
112
- return /* @__PURE__ */ React.createElement(ComplexFieldNote, { count, label });
113
- }
114
- const FIELD_INPUTS = {
115
- fileUpload: FileUploadInput,
116
- secure: SecureInput,
117
- radio: RadioInput,
118
- select: SelectInput,
119
- boolean: BooleanInput,
120
- number: NumberInput,
121
- textarea: TextAreaInput,
122
- indexedPair: IndexedPairInput,
123
- stringArray: StringArrayField,
124
- objectArray: ObjectArrayInput,
125
- complex: ComplexInput,
126
- text: TextInput
127
- };
128
- function FieldInput(props) {
129
- const kind = resolveFieldInputKind(props.field, props.setValue !== undefined);
130
- const Component = FIELD_INPUTS[kind];
131
- return /* @__PURE__ */ React.createElement(Component, { ...props });
132
- }
133
-
134
- export { FieldInput, resolveFieldInputKind };
135
- //# sourceMappingURL=FieldInput.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FieldInput.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/FieldInput.tsx"],"sourcesContent":["import React from 'react';\nimport type { ConfigField } from '../../../schema/schema';\nimport type { IndexedPairItem } from './datasource';\nimport type { FieldInputProps } from './inputs/types';\nimport { SecureFieldInput } from './inputs/SecureFieldInput';\nimport { StringArrayInput } from './inputs/StringArrayInput';\nimport { IndexedPairEditor } from './inputs/IndexedPairEditor';\nimport { FileUploadField } from './inputs/FileUploadField';\nimport { ObjectArrayEditor } from './inputs/ObjectArrayEditor';\nimport { ComplexFieldNote } from './inputs/ComplexFieldNote';\nimport { TextInput, NumberInput, BooleanInput, TextAreaInput, SelectInput, RadioInput } from './inputs/PrimitiveInputs';\n\nexport type { FieldInputProps };\n\n/** Discriminant identifying which input component renders a field. */\nexport type FieldInputKind =\n | 'fileUpload'\n | 'secure'\n | 'radio'\n | 'select'\n | 'boolean'\n | 'number'\n | 'textarea'\n | 'indexedPair'\n | 'stringArray'\n | 'objectArray'\n | 'complex'\n | 'text';\n\n/**\n * Resolve a field to its input kind.\n *\n * Order matters: earlier rules win. Cross-cutting storage concerns (secure\n * storage, indexed-pair storage) intentionally take precedence over\n * `valueType`, and an explicit `ui.component` (radio/select/textarea) takes\n * precedence over the type-derived default. `fileUpload` requires `setValue`\n * because it distributes parsed values across sibling fields.\n */\nexport function resolveFieldInputKind(field: ConfigField, hasSetValue: boolean): FieldInputKind {\n if (field.ui?.component === 'fileUpload' && field.ui.fileMapping && hasSetValue) {\n return 'fileUpload';\n }\n if (field.target === 'secureJsonData') {\n return 'secure';\n }\n if (field.ui?.component === 'radio') {\n return 'radio';\n }\n if (field.ui?.component === 'select') {\n return 'select';\n }\n if (field.valueType === 'boolean') {\n return 'boolean';\n }\n if (field.valueType === 'number') {\n return 'number';\n }\n if (field.ui?.component === 'textarea') {\n return 'textarea';\n }\n if (field.storage?.type === 'indexedPair') {\n return 'indexedPair';\n }\n if (field.valueType === 'array' && field.item?.valueType === 'string') {\n return 'stringArray';\n }\n if (field.valueType === 'array' && field.item?.valueType === 'object' && field.item.fields?.length) {\n return 'objectArray';\n }\n if (\n field.valueType === 'object' ||\n field.valueType === 'map' ||\n (field.valueType === 'array' && (field.item?.valueType === 'object' || field.item?.valueType === 'map'))\n ) {\n return 'complex';\n }\n return 'text';\n}\n\n// ── Adapters: map the normalized FieldInputProps onto each leaf component's own API ──\n\n/** Password/token stored in secureJsonData. */\nfunction SecureInput({ field, formField, disabled }: FieldInputProps) {\n const label = field.label ?? field.key;\n return (\n <SecureFieldInput\n formField={formField}\n placeholder={field.ui?.placeholder ?? label}\n disabled={disabled}\n label={label}\n />\n );\n}\n\n/** JSON file upload that distributes parsed keys across sibling fields. */\nfunction FileUploadInput({ field, formField, disabled, setValue }: FieldInputProps) {\n // Only reachable when setValue exists (see resolveFieldInputKind), but guard anyway.\n if (!setValue) {\n return null;\n }\n return <FileUploadField field={field} formField={formField} disabled={disabled} setValue={setValue} />;\n}\n\n/** Editable key/value list backed by indexed storage (e.g. HTTP headers). */\nfunction IndexedPairInput({ field, formField, disabled }: FieldInputProps) {\n const items = Array.isArray(formField.value) ? (formField.value as IndexedPairItem[]) : [];\n const maxItems =\n field.validations?.find((v): v is { type: 'itemCount'; max?: number } => v.type === 'itemCount')?.max ?? 10;\n const itemLabel = field.label?.toLowerCase().replace(/s$/, '') ?? 'header';\n return (\n <IndexedPairEditor\n value={items}\n onChange={formField.onChange}\n maxItems={maxItems}\n disabled={disabled}\n itemLabel={itemLabel}\n />\n );\n}\n\n/** Row-based editor for an array of strings. */\nfunction StringArrayField({ field, formField, disabled }: FieldInputProps) {\n const label = field.label ?? field.key;\n return (\n <StringArrayInput\n value={Array.isArray(formField.value) ? (formField.value as string[]) : []}\n onChange={formField.onChange}\n placeholder={field.ui?.placeholder}\n disabled={disabled}\n itemLabel={label.toLowerCase().replace(/s$/, '')}\n />\n );\n}\n\n/** Inline editor for an array of objects with defined item fields. */\nfunction ObjectArrayInput({ field, formField, disabled, errorMessage }: FieldInputProps) {\n return (\n <ObjectArrayEditor\n field={field}\n value={formField.value}\n onChange={formField.onChange}\n disabled={disabled}\n errorMessage={errorMessage}\n />\n );\n}\n\n/** Read-only note for complex shapes not editable in the wizard. */\nfunction ComplexInput({ field, formField }: FieldInputProps) {\n const label = field.label ?? field.key;\n const count = Array.isArray(formField.value) ? formField.value.length : 0;\n return <ComplexFieldNote count={count} label={label} />;\n}\n\n/** Registry mapping each resolved kind to its renderer. */\nconst FIELD_INPUTS: Record<FieldInputKind, React.ComponentType<FieldInputProps>> = {\n fileUpload: FileUploadInput,\n secure: SecureInput,\n radio: RadioInput,\n select: SelectInput,\n boolean: BooleanInput,\n number: NumberInput,\n textarea: TextAreaInput,\n indexedPair: IndexedPairInput,\n stringArray: StringArrayField,\n objectArray: ObjectArrayInput,\n complex: ComplexInput,\n text: TextInput,\n};\n\n/**\n * Render the appropriate input for a schema field.\n *\n * Replaces the former `renderFieldInput` switch with a resolver + component\n * registry: each input is an independently testable component, and adding a\n * new input means extending the registry rather than editing a growing\n * conditional.\n */\nexport function FieldInput(props: FieldInputProps) {\n const kind = resolveFieldInputKind(props.field, props.setValue !== undefined);\n const Component = FIELD_INPUTS[kind];\n return <Component {...props} />;\n}\n"],"names":[],"mappings":"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"}
@@ -1,80 +0,0 @@
1
- import React from 'react';
2
- import { Controller } from '../../../node_modules/react-hook-form/dist/index.esm.js';
3
- import { useStyles2, Tooltip, Icon } from '@grafana/ui';
4
- import { resolveActiveOverride, formKey } from './config.js';
5
- import { isFieldRequired, buildValidationRules, parseItemErrors } from './fieldUtils.js';
6
- import { PdcFieldNote } from './inputs/PdcFieldNote.js';
7
- import { FieldInput } from './FieldInput.js';
8
- import { getFieldStyles } from './styles.js';
9
-
10
- function SchemaField({
11
- field,
12
- control,
13
- errors,
14
- disabled,
15
- dsUid,
16
- watchedValues,
17
- fieldById,
18
- celContext,
19
- setValue
20
- }) {
21
- const styles = useStyles2(getFieldStyles);
22
- const activeOverride = resolveActiveOverride(field, watchedValues, fieldById);
23
- const fk = formKey(field);
24
- if (field.key === "pdcInjected" && field.target === "jsonData") {
25
- return /* @__PURE__ */ React.createElement(
26
- Controller,
27
- {
28
- name: fk,
29
- control,
30
- render: ({ field: formField }) => /* @__PURE__ */ React.createElement(
31
- PdcFieldNote,
32
- {
33
- enabled: !!formField.value,
34
- description: field.description,
35
- configUrl: `/connections/datasources/edit/${dsUid}`
36
- }
37
- )
38
- }
39
- );
40
- }
41
- const required = isFieldRequired(field, watchedValues, fieldById, celContext);
42
- const validationRules = buildValidationRules(field, required);
43
- return /* @__PURE__ */ React.createElement(
44
- Controller,
45
- {
46
- name: fk,
47
- control,
48
- rules: validationRules,
49
- render: ({ field: formField }) => {
50
- var _a, _b, _c, _d, _e;
51
- const errorMessage = (_a = errors[fk]) == null ? undefined : _a.message;
52
- const label = (_b = field.label) != null ? _b : field.key;
53
- const description = (_c = activeOverride == null ? undefined : activeOverride.description) != null ? _c : field.description;
54
- const effectiveField = activeOverride ? {
55
- ...field,
56
- description,
57
- ui: {
58
- ...field.ui,
59
- placeholder: (_e = activeOverride.placeholder) != null ? _e : (_d = field.ui) == null ? undefined : _d.placeholder
60
- }
61
- } : field;
62
- const isReadOnly = !!(activeOverride == null ? undefined : activeOverride.readOnly);
63
- const isBool = field.valueType === "boolean";
64
- return /* @__PURE__ */ React.createElement("div", { className: isBool ? styles.fieldRowCenter : styles.fieldRow }, /* @__PURE__ */ React.createElement("div", { className: isBool ? styles.fieldLabelRowCompact : styles.fieldLabelRow }, /* @__PURE__ */ React.createElement("span", { className: styles.fieldLabel }, label, required && /* @__PURE__ */ React.createElement("span", { className: styles.fieldRequired }, "*")), description && /* @__PURE__ */ React.createElement(Tooltip, { content: description }, /* @__PURE__ */ React.createElement(Icon, { name: "info-circle", size: "xs", className: styles.fieldInfoIcon }))), /* @__PURE__ */ React.createElement("div", { className: styles.fieldInputCol }, /* @__PURE__ */ React.createElement(
65
- FieldInput,
66
- {
67
- field: effectiveField,
68
- formField,
69
- disabled: disabled || isReadOnly,
70
- errorMessage,
71
- setValue
72
- }
73
- ), errorMessage && !parseItemErrors(errorMessage) && /* @__PURE__ */ React.createElement("span", { className: styles.fieldError }, errorMessage)));
74
- }
75
- }
76
- );
77
- }
78
-
79
- export { SchemaField };
80
- //# sourceMappingURL=SchemaField.js.map
@@ -1 +0,0 @@
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 '../../../schema/schema';\nimport { resolveActiveOverride, formKey } from './config';\nimport type { FormValues } from './datasource';\nimport { isFieldRequired, buildValidationRules, parseItemErrors } from './fieldUtils';\nimport { PdcFieldNote } from './inputs/PdcFieldNote';\nimport { FieldInput } from './FieldInput';\nimport { getFieldStyles } from './styles';\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 celContext?: Record<string, unknown>;\n setValue?: (name: string, value: unknown) => void;\n};\n\nexport function SchemaField({\n field,\n control,\n errors,\n disabled,\n dsUid,\n watchedValues,\n fieldById,\n celContext,\n setValue,\n}: SchemaFieldProps) {\n const styles = useStyles2(getFieldStyles);\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, celContext);\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 <FieldInput\n field={effectiveField}\n formField={formField}\n disabled={disabled || isReadOnly}\n errorMessage={errorMessage}\n setValue={setValue}\n />\n {/* Show global error only if it's NOT a per-item error (those render inline) */}\n {errorMessage && !parseItemErrors(errorMessage) && (\n <span className={styles.fieldError}>{errorMessage}</span>\n )}\n </div>\n </div>\n );\n }}\n />\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,54 +0,0 @@
1
- import React from 'react';
2
- import { cx } from '@emotion/css';
3
- import { useStyles2 } from '@grafana/ui';
4
- import { getTabStyles } from './styles.js';
5
-
6
- function SidebarNav({ groups, activeIndex, sectionStates, onSelect }) {
7
- const styles = useStyles2(getTabStyles);
8
- const visibleGroups = groups.filter((g) => g.group.id !== "_required");
9
- return /* @__PURE__ */ React.createElement("nav", { className: styles.sidebar }, /* @__PURE__ */ React.createElement("div", { className: styles.sidebarTitle }, "Connect data source"), /* @__PURE__ */ React.createElement("ul", { className: styles.navList }, visibleGroups.map((g, vi) => {
10
- var _a, _b;
11
- const origIndex = groups.indexOf(g);
12
- const state = (_a = sectionStates[origIndex]) != null ? _a : "draft";
13
- const isActive = origIndex === activeIndex;
14
- const isOptional = g.group.optional === true;
15
- const isLast = vi === visibleGroups.length - 1;
16
- const nextIsOptional = !isLast && ((_b = visibleGroups[vi + 1]) == null ? undefined : _b.group.optional) === true;
17
- return /* @__PURE__ */ React.createElement("li", { key: g.group.id }, /* @__PURE__ */ React.createElement(
18
- "div",
19
- {
20
- className: cx(styles.navItem, isActive && styles.navItemActive),
21
- onClick: () => onSelect(origIndex),
22
- role: "button",
23
- tabIndex: 0,
24
- onKeyDown: (e) => {
25
- if (e.key === "Enter" || e.key === " ") {
26
- e.preventDefault();
27
- onSelect(origIndex);
28
- }
29
- }
30
- },
31
- /* @__PURE__ */ React.createElement("div", { className: styles.navDotWrap }, /* @__PURE__ */ React.createElement(
32
- "span",
33
- {
34
- className: cx(
35
- styles.navDot,
36
- isOptional && styles.navDotOptional,
37
- isActive && styles.navDotActive,
38
- state === "validated" && !isActive && styles.navDotValidated,
39
- state === "error" && !isActive && styles.navDotError
40
- )
41
- }
42
- ), !isLast && /* @__PURE__ */ React.createElement(
43
- "div",
44
- {
45
- className: cx(styles.navConnector, (isOptional || nextIsOptional) && styles.navConnectorDashed)
46
- }
47
- )),
48
- /* @__PURE__ */ React.createElement("span", { className: cx(styles.navLabel, isActive && styles.navLabelActive) }, g.group.title)
49
- ));
50
- })));
51
- }
52
-
53
- export { SidebarNav };
54
- //# sourceMappingURL=SidebarNav.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SidebarNav.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.tsx"],"sourcesContent":["import React from 'react';\nimport { cx } from '@emotion/css';\nimport { useStyles2 } from '@grafana/ui';\nimport type { ResolvedGroup } from './hooks/useDatasourceConfigForm';\nimport { getTabStyles } from './styles';\n\nexport type SectionState = 'active' | 'draft' | 'validated' | 'error';\n\ntype SidebarNavProps = {\n groups: ResolvedGroup[];\n activeIndex: number;\n sectionStates: SectionState[];\n onSelect: (index: number) => void;\n};\n\nexport function SidebarNav({ groups, activeIndex, sectionStates, onSelect }: SidebarNavProps) {\n const styles = useStyles2(getTabStyles);\n\n // Filter out _required synthetic group\n const visibleGroups = groups.filter((g) => g.group.id !== '_required');\n\n return (\n <nav className={styles.sidebar}>\n <div className={styles.sidebarTitle}>Connect data source</div>\n <ul className={styles.navList}>\n {visibleGroups.map((g, vi) => {\n // Map back to original index for state/selection\n const origIndex = groups.indexOf(g);\n const state = sectionStates[origIndex] ?? 'draft';\n const isActive = origIndex === activeIndex;\n const isOptional = g.group.optional === true;\n const isLast = vi === visibleGroups.length - 1;\n // Next item determines connector style\n const nextIsOptional = !isLast && visibleGroups[vi + 1]?.group.optional === true;\n\n return (\n <li key={g.group.id}>\n <div\n className={cx(styles.navItem, isActive && styles.navItemActive)}\n onClick={() => onSelect(origIndex)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(origIndex);\n }\n }}\n >\n <div className={styles.navDotWrap}>\n <span\n className={cx(\n styles.navDot,\n isOptional && styles.navDotOptional,\n isActive && styles.navDotActive,\n state === 'validated' && !isActive && styles.navDotValidated,\n state === 'error' && !isActive && styles.navDotError\n )}\n />\n {!isLast && (\n <div\n className={cx(styles.navConnector, (isOptional || nextIsOptional) && styles.navConnectorDashed)}\n />\n )}\n </div>\n <span className={cx(styles.navLabel, isActive && styles.navLabelActive)}>{g.group.title}</span>\n </div>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n"],"names":[],"mappings":"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"}