@grafana/plugin-ui 0.10.9 → 0.11.0

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 (183) hide show
  1. package/dist/cjs/index.cjs +1799 -1325
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +94 -46
  4. package/dist/esm/components/ConfigEditor/AdvancedSettings/AdvancedHttpSettings.js +42 -38
  5. package/dist/esm/components/ConfigEditor/AdvancedSettings/AdvancedHttpSettings.js.map +1 -1
  6. package/dist/esm/components/ConfigEditor/Auth/Auth.js +19 -14
  7. package/dist/esm/components/ConfigEditor/Auth/Auth.js.map +1 -1
  8. package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js +19 -15
  9. package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js.map +1 -1
  10. package/dist/esm/components/ConfigEditor/Auth/auth-method/BasicAuth.js +52 -49
  11. package/dist/esm/components/ConfigEditor/Auth/auth-method/BasicAuth.js.map +1 -1
  12. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeader.js +59 -55
  13. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeader.js.map +1 -1
  14. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeaders.js +20 -17
  15. package/dist/esm/components/ConfigEditor/Auth/custom-headers/CustomHeaders.js.map +1 -1
  16. package/dist/esm/components/ConfigEditor/Auth/tls/SelfSignedCertificate.js +28 -28
  17. package/dist/esm/components/ConfigEditor/Auth/tls/SelfSignedCertificate.js.map +1 -1
  18. package/dist/esm/components/ConfigEditor/Auth/tls/SkipTLSVerification.js +2 -2
  19. package/dist/esm/components/ConfigEditor/Auth/tls/SkipTLSVerification.js.map +1 -1
  20. package/dist/esm/components/ConfigEditor/Auth/tls/TLSClientAuth.js +84 -82
  21. package/dist/esm/components/ConfigEditor/Auth/tls/TLSClientAuth.js.map +1 -1
  22. package/dist/esm/components/ConfigEditor/Auth/tls/TLSSettings.js +10 -7
  23. package/dist/esm/components/ConfigEditor/Auth/tls/TLSSettings.js.map +1 -1
  24. package/dist/esm/components/ConfigEditor/Auth/tls/TLSSettingsSection.js +8 -2
  25. package/dist/esm/components/ConfigEditor/Auth/tls/TLSSettingsSection.js.map +1 -1
  26. package/dist/esm/components/ConfigEditor/Auth/utils.js +2 -1
  27. package/dist/esm/components/ConfigEditor/Auth/utils.js.map +1 -1
  28. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +14 -11
  29. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js.map +1 -1
  30. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigSection.js +2 -2
  31. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigSection.js.map +1 -1
  32. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigSubSection.js +2 -2
  33. package/dist/esm/components/ConfigEditor/ConfigSection/ConfigSubSection.js.map +1 -1
  34. package/dist/esm/components/ConfigEditor/ConfigSection/GenericConfigSection.js +19 -11
  35. package/dist/esm/components/ConfigEditor/ConfigSection/GenericConfigSection.js.map +1 -1
  36. package/dist/esm/components/ConfigEditor/Connection/ConnectionSettings.js +24 -19
  37. package/dist/esm/components/ConfigEditor/Connection/ConnectionSettings.js.map +1 -1
  38. package/dist/esm/components/ConfigEditor/DataSourceDescription.js +12 -2
  39. package/dist/esm/components/ConfigEditor/DataSourceDescription.js.map +1 -1
  40. package/dist/esm/components/ConfigEditor/SecureSocksProxyToggle.js +24 -20
  41. package/dist/esm/components/ConfigEditor/SecureSocksProxyToggle.js.map +1 -1
  42. package/dist/esm/components/CustomHeadersSettings/CustomHeadersSettings.js +69 -60
  43. package/dist/esm/components/CustomHeadersSettings/CustomHeadersSettings.js.map +1 -1
  44. package/dist/esm/components/DataLinks/DataLink.js +104 -89
  45. package/dist/esm/components/DataLinks/DataLink.js.map +1 -1
  46. package/dist/esm/components/DataLinks/DataLinks.js +48 -41
  47. package/dist/esm/components/DataLinks/DataLinks.js.map +1 -1
  48. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +9 -4
  49. package/dist/esm/components/DataSourcePicker/DataSourcePicker.js.map +1 -1
  50. package/dist/esm/components/DatePicker/DatePicker.js +6 -5
  51. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
  52. package/dist/esm/components/DatePickerWithInput/DatePickerWithInput.js +19 -15
  53. package/dist/esm/components/DatePickerWithInput/DatePickerWithInput.js.map +1 -1
  54. package/dist/esm/components/DebounceInput/DebounceInput.js +6 -5
  55. package/dist/esm/components/DebounceInput/DebounceInput.js.map +1 -1
  56. package/dist/esm/components/Plugins/PluginSignatureBadge.js +3 -2
  57. package/dist/esm/components/Plugins/PluginSignatureBadge.js.map +1 -1
  58. package/dist/esm/components/QueryEditor/AccessoryButton.js +2 -2
  59. package/dist/esm/components/QueryEditor/AccessoryButton.js.map +1 -1
  60. package/dist/esm/components/QueryEditor/CatalogSelector.js +54 -0
  61. package/dist/esm/components/QueryEditor/CatalogSelector.js.map +1 -0
  62. package/dist/esm/components/QueryEditor/ConfirmModal.js +18 -8
  63. package/dist/esm/components/QueryEditor/ConfirmModal.js.map +1 -1
  64. package/dist/esm/components/QueryEditor/DatasetSelector.js +3 -2
  65. package/dist/esm/components/QueryEditor/DatasetSelector.js.map +1 -1
  66. package/dist/esm/components/QueryEditor/EditorField.js +11 -3
  67. package/dist/esm/components/QueryEditor/EditorField.js.map +1 -1
  68. package/dist/esm/components/QueryEditor/EditorFieldGroup.js +2 -2
  69. package/dist/esm/components/QueryEditor/EditorFieldGroup.js.map +1 -1
  70. package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
  71. package/dist/esm/components/QueryEditor/EditorHeader.js.map +1 -1
  72. package/dist/esm/components/QueryEditor/EditorList.js +11 -7
  73. package/dist/esm/components/QueryEditor/EditorList.js.map +1 -1
  74. package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
  75. package/dist/esm/components/QueryEditor/EditorRow.js.map +1 -1
  76. package/dist/esm/components/QueryEditor/EditorRows.js +2 -2
  77. package/dist/esm/components/QueryEditor/EditorRows.js.map +1 -1
  78. package/dist/esm/components/QueryEditor/EditorStack.js +2 -2
  79. package/dist/esm/components/QueryEditor/EditorStack.js.map +1 -1
  80. package/dist/esm/components/QueryEditor/EditorSwitch.js +3 -2
  81. package/dist/esm/components/QueryEditor/EditorSwitch.js.map +1 -1
  82. package/dist/esm/components/QueryEditor/FlexItem.js +2 -2
  83. package/dist/esm/components/QueryEditor/FlexItem.js.map +1 -1
  84. package/dist/esm/components/QueryEditor/InlineSelect.js +12 -4
  85. package/dist/esm/components/QueryEditor/InlineSelect.js.map +1 -1
  86. package/dist/esm/components/QueryEditor/InputGroup.js +3 -2
  87. package/dist/esm/components/QueryEditor/InputGroup.js.map +1 -1
  88. package/dist/esm/components/QueryEditor/QueryEditor.js +44 -37
  89. package/dist/esm/components/QueryEditor/QueryEditor.js.map +1 -1
  90. package/dist/esm/components/QueryEditor/QueryHeader.js +172 -95
  91. package/dist/esm/components/QueryEditor/QueryHeader.js.map +1 -1
  92. package/dist/esm/components/QueryEditor/RunQueryButton.js +13 -9
  93. package/dist/esm/components/QueryEditor/RunQueryButton.js.map +1 -1
  94. package/dist/esm/components/QueryEditor/SchemaSelector.js +56 -0
  95. package/dist/esm/components/QueryEditor/SchemaSelector.js.map +1 -0
  96. package/dist/esm/components/QueryEditor/Space.js +2 -2
  97. package/dist/esm/components/QueryEditor/Space.js.map +1 -1
  98. package/dist/esm/components/QueryEditor/TableSelector.js +21 -7
  99. package/dist/esm/components/QueryEditor/TableSelector.js.map +1 -1
  100. package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js +6 -5
  101. package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js.map +1 -1
  102. package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js +26 -18
  103. package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js.map +1 -1
  104. package/dist/esm/components/QueryEditor/query-editor-raw/QueryValidator.js +19 -2
  105. package/dist/esm/components/QueryEditor/query-editor-raw/QueryValidator.js.map +1 -1
  106. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +42 -38
  107. package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js.map +1 -1
  108. package/dist/esm/components/QueryEditor/types.js +1 -0
  109. package/dist/esm/components/QueryEditor/types.js.map +1 -1
  110. package/dist/esm/components/QueryEditor/visual-query-builder/AwesomeQueryBuilder.js +8 -8
  111. package/dist/esm/components/QueryEditor/visual-query-builder/AwesomeQueryBuilder.js.map +1 -1
  112. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +11 -3
  113. package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js.map +1 -1
  114. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
  115. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js.map +1 -1
  116. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRows.js +2 -2
  117. package/dist/esm/components/QueryEditor/visual-query-builder/EditorRows.js.map +1 -1
  118. package/dist/esm/components/QueryEditor/visual-query-builder/GroupByRow.js +16 -12
  119. package/dist/esm/components/QueryEditor/visual-query-builder/GroupByRow.js.map +1 -1
  120. package/dist/esm/components/QueryEditor/visual-query-builder/OrderByRow.js +29 -20
  121. package/dist/esm/components/QueryEditor/visual-query-builder/OrderByRow.js.map +1 -1
  122. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +7 -4
  123. package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js.map +1 -1
  124. package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js +2 -2
  125. package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js.map +1 -1
  126. package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js +2 -2
  127. package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js.map +1 -1
  128. package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js +2 -2
  129. package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js.map +1 -1
  130. package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js +4 -4
  131. package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js.map +1 -1
  132. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +52 -44
  133. package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js.map +1 -1
  134. package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js +11 -2
  135. package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js.map +1 -1
  136. package/dist/esm/components/QueryEditor/visual-query-builder/WhereRow.js +4 -3
  137. package/dist/esm/components/QueryEditor/visual-query-builder/WhereRow.js.map +1 -1
  138. package/dist/esm/components/QueryEditorRow/QueryEditorRow.js +6 -2
  139. package/dist/esm/components/QueryEditorRow/QueryEditorRow.js.map +1 -1
  140. package/dist/esm/components/SQLEditor/components/SQLEditor.js +40 -34
  141. package/dist/esm/components/SQLEditor/components/SQLEditor.js.map +1 -1
  142. package/dist/esm/components/SQLEditor/hooks/useLatestCallback.js +16 -0
  143. package/dist/esm/components/SQLEditor/hooks/useLatestCallback.js.map +1 -0
  144. package/dist/esm/components/SQLEditor/standardSql/definition.js +1 -0
  145. package/dist/esm/components/SQLEditor/standardSql/definition.js.map +1 -1
  146. package/dist/esm/components/Segment/Segment.js +4 -3
  147. package/dist/esm/components/Segment/Segment.js.map +1 -1
  148. package/dist/esm/components/VisualQueryBuilder/components/LabelFilterItem.js +105 -99
  149. package/dist/esm/components/VisualQueryBuilder/components/LabelFilterItem.js.map +1 -1
  150. package/dist/esm/components/VisualQueryBuilder/components/LabelFilters.js +28 -27
  151. package/dist/esm/components/VisualQueryBuilder/components/LabelFilters.js.map +1 -1
  152. package/dist/esm/components/VisualQueryBuilder/components/OperationEditor.js +31 -26
  153. package/dist/esm/components/VisualQueryBuilder/components/OperationEditor.js.map +1 -1
  154. package/dist/esm/components/VisualQueryBuilder/components/OperationEditorBody.js +70 -55
  155. package/dist/esm/components/VisualQueryBuilder/components/OperationEditorBody.js.map +1 -1
  156. package/dist/esm/components/VisualQueryBuilder/components/OperationExplainedBox.js +11 -2
  157. package/dist/esm/components/VisualQueryBuilder/components/OperationExplainedBox.js.map +1 -1
  158. package/dist/esm/components/VisualQueryBuilder/components/OperationHeader.js +75 -62
  159. package/dist/esm/components/VisualQueryBuilder/components/OperationHeader.js.map +1 -1
  160. package/dist/esm/components/VisualQueryBuilder/components/OperationInfoButton.js +39 -28
  161. package/dist/esm/components/VisualQueryBuilder/components/OperationInfoButton.js.map +1 -1
  162. package/dist/esm/components/VisualQueryBuilder/components/OperationList.js +38 -31
  163. package/dist/esm/components/VisualQueryBuilder/components/OperationList.js.map +1 -1
  164. package/dist/esm/components/VisualQueryBuilder/components/OperationListExplained.js +15 -14
  165. package/dist/esm/components/VisualQueryBuilder/components/OperationListExplained.js.map +1 -1
  166. package/dist/esm/components/VisualQueryBuilder/components/OperationParamEditor.js +35 -31
  167. package/dist/esm/components/VisualQueryBuilder/components/OperationParamEditor.js.map +1 -1
  168. package/dist/esm/components/VisualQueryBuilder/components/OperationsEditorRow.js +3 -2
  169. package/dist/esm/components/VisualQueryBuilder/components/OperationsEditorRow.js.map +1 -1
  170. package/dist/esm/components/VisualQueryBuilder/components/QueryBuilderHints.js +12 -9
  171. package/dist/esm/components/VisualQueryBuilder/components/QueryBuilderHints.js.map +1 -1
  172. package/dist/esm/components/VisualQueryBuilder/components/QueryEditorModeToggle.js +2 -2
  173. package/dist/esm/components/VisualQueryBuilder/components/QueryEditorModeToggle.js.map +1 -1
  174. package/dist/esm/components/VisualQueryBuilder/components/QueryHeaderSwitch.js +6 -2
  175. package/dist/esm/components/VisualQueryBuilder/components/QueryHeaderSwitch.js.map +1 -1
  176. package/dist/esm/components/VisualQueryBuilder/components/QueryOptionGroup.js +20 -12
  177. package/dist/esm/components/VisualQueryBuilder/components/QueryOptionGroup.js.map +1 -1
  178. package/dist/esm/components/VisualQueryBuilder/components/RawQuery.js +2 -2
  179. package/dist/esm/components/VisualQueryBuilder/components/RawQuery.js.map +1 -1
  180. package/dist/esm/index.d.ts +94 -46
  181. package/dist/esm/index.js +4 -0
  182. package/dist/esm/index.js.map +1 -1
  183. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
- import React__default from 'react';
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import 'react';
2
3
  import { css, cx } from '@emotion/css';
3
4
  import { InlineField, Input } from '@grafana/ui';
4
5
  import { ConfigSection } from '../ConfigSection/ConfigSection.js';
@@ -19,34 +20,38 @@ const ConnectionSettings = ({
19
20
  maxWidth: 578
20
21
  })
21
22
  };
22
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(ConfigSection, { title: "Connection", description, className: cx(styles.container, className) }, /* @__PURE__ */ React__default.createElement(
23
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(ConfigSection, { title: "Connection", description, className: cx(styles.container, className), children: /* @__PURE__ */ jsx(
23
24
  InlineField,
24
25
  {
25
26
  htmlFor: "connection-url",
26
27
  label: urlLabel || "URL",
27
28
  labelWidth: 24,
28
- tooltip: urlTooltip || /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, "Specify a complete HTTP URL", /* @__PURE__ */ React__default.createElement("br", null), "(for example https://example.com:8080)"),
29
+ tooltip: urlTooltip || /* @__PURE__ */ jsxs(Fragment, { children: [
30
+ "Specify a complete HTTP URL",
31
+ /* @__PURE__ */ jsx("br", {}),
32
+ "(for example https://example.com:8080)"
33
+ ] }),
29
34
  grow: true,
30
35
  disabled: config.readOnly,
31
36
  required: true,
32
37
  invalid: !isValidUrl && !config.readOnly,
33
38
  error: isValidUrl ? "" : "Please enter a valid URL",
34
- interactive: true
35
- },
36
- /* @__PURE__ */ React__default.createElement(
37
- Input,
38
- {
39
- id: "connection-url",
40
- "aria-label": "Data source connection URL",
41
- onChange: (event) => onChange({
42
- ...config,
43
- url: event.currentTarget.value
44
- }),
45
- value: config.url || "",
46
- placeholder: urlPlaceholder || "URL"
47
- }
48
- )
49
- )));
39
+ interactive: true,
40
+ children: /* @__PURE__ */ jsx(
41
+ Input,
42
+ {
43
+ id: "connection-url",
44
+ "aria-label": "Data source connection URL",
45
+ onChange: (event) => onChange({
46
+ ...config,
47
+ url: event.currentTarget.value
48
+ }),
49
+ value: config.url || "",
50
+ placeholder: urlPlaceholder || "URL"
51
+ }
52
+ )
53
+ }
54
+ ) }) });
50
55
  };
51
56
 
52
57
  export { ConnectionSettings };
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectionSettings.js","sources":["../../../../../src/components/ConfigEditor/Connection/ConnectionSettings.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { InlineField, Input, type PopoverContent } from '@grafana/ui';\nimport { ConfigSection } from '../ConfigSection';\nimport { type Config, type OnChangeHandler } from '../types';\n\nexport type Props<C extends Config = Config> = {\n config: C;\n onChange: OnChangeHandler<C>;\n description?: ReactNode;\n urlPlaceholder?: string;\n urlTooltip?: PopoverContent;\n urlLabel?: string;\n className?: string;\n};\n\nexport const ConnectionSettings: <C extends Config = Config>(props: Props<C>) => JSX.Element = ({\n config,\n onChange,\n description,\n urlPlaceholder,\n urlTooltip,\n urlLabel,\n className,\n}) => {\n const isValidUrl =\n config.url !== undefined &&\n /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/.test(config.url);\n\n const styles = {\n container: css({\n maxWidth: 578,\n }),\n };\n\n return (\n <>\n <ConfigSection title=\"Connection\" description={description} className={cx(styles.container, className)}>\n <InlineField\n htmlFor=\"connection-url\"\n label={urlLabel || 'URL'}\n labelWidth={24}\n tooltip={\n urlTooltip || (\n <>\n Specify a complete HTTP URL\n <br />\n (for example https://example.com:8080)\n </>\n )\n }\n grow\n disabled={config.readOnly}\n required\n invalid={!isValidUrl && !config.readOnly}\n error={isValidUrl ? '' : 'Please enter a valid URL'}\n interactive\n >\n <Input\n id=\"connection-url\"\n aria-label=\"Data source connection URL\"\n onChange={(event) =>\n onChange({\n ...config,\n url: event.currentTarget.value,\n })\n }\n value={config.url || ''}\n placeholder={urlPlaceholder || 'URL'}\n />\n </InlineField>\n </ConfigSection>\n </>\n );\n};\n"],"names":["React"],"mappings":";;;;;;AAgBO,MAAM,qBAAkF,CAAC;AAAA,EAC9F,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAM,KAAA;AACJ,EAAA,MAAM,aACJ,MAAO,CAAA,GAAA,KAAQ,aACf,qFAAsF,CAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAEvG,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,WAAW,GAAI,CAAA;AAAA,MACb,QAAU,EAAA;AAAA,KACX;AAAA,GACH;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,aAAA,EAAA,EAAc,KAAM,EAAA,YAAA,EAAa,WAA0B,EAAA,SAAA,EAAW,EAAG,CAAA,MAAA,CAAO,SAAW,EAAA,SAAS,CACnG,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,gBAAA;AAAA,MACR,OAAO,QAAY,IAAA,KAAA;AAAA,MACnB,UAAY,EAAA,EAAA;AAAA,MACZ,SACE,UACE,oBAAAA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EAAE,+CAECA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,GAAE,wCAER,CAAA;AAAA,MAGJ,IAAI,EAAA,IAAA;AAAA,MACJ,UAAU,MAAO,CAAA,QAAA;AAAA,MACjB,QAAQ,EAAA,IAAA;AAAA,MACR,OAAS,EAAA,CAAC,UAAc,IAAA,CAAC,MAAO,CAAA,QAAA;AAAA,MAChC,KAAA,EAAO,aAAa,EAAK,GAAA,0BAAA;AAAA,MACzB,WAAW,EAAA;AAAA,KAAA;AAAA,oBAEXA,cAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAG,EAAA,gBAAA;AAAA,QACH,YAAW,EAAA,4BAAA;AAAA,QACX,QAAA,EAAU,CAAC,KAAA,KACT,QAAS,CAAA;AAAA,UACP,GAAG,MAAA;AAAA,UACH,GAAA,EAAK,MAAM,aAAc,CAAA;AAAA,SAC1B,CAAA;AAAA,QAEH,KAAA,EAAO,OAAO,GAAO,IAAA,EAAA;AAAA,QACrB,aAAa,cAAkB,IAAA;AAAA;AAAA;AACjC,GAEJ,CACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ConnectionSettings.js","sources":["../../../../../src/components/ConfigEditor/Connection/ConnectionSettings.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { InlineField, Input, type PopoverContent } from '@grafana/ui';\nimport { ConfigSection } from '../ConfigSection';\nimport { type Config, type OnChangeHandler } from '../types';\n\nexport type Props<C extends Config = Config> = {\n config: C;\n onChange: OnChangeHandler<C>;\n description?: ReactNode;\n urlPlaceholder?: string;\n urlTooltip?: PopoverContent;\n urlLabel?: string;\n className?: string;\n};\n\nexport const ConnectionSettings: <C extends Config = Config>(props: Props<C>) => JSX.Element = ({\n config,\n onChange,\n description,\n urlPlaceholder,\n urlTooltip,\n urlLabel,\n className,\n}) => {\n const isValidUrl =\n config.url !== undefined &&\n /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/.test(config.url);\n\n const styles = {\n container: css({\n maxWidth: 578,\n }),\n };\n\n return (\n <>\n <ConfigSection title=\"Connection\" description={description} className={cx(styles.container, className)}>\n <InlineField\n htmlFor=\"connection-url\"\n label={urlLabel || 'URL'}\n labelWidth={24}\n tooltip={\n urlTooltip || (\n <>\n Specify a complete HTTP URL\n <br />\n (for example https://example.com:8080)\n </>\n )\n }\n grow\n disabled={config.readOnly}\n required\n invalid={!isValidUrl && !config.readOnly}\n error={isValidUrl ? '' : 'Please enter a valid URL'}\n interactive\n >\n <Input\n id=\"connection-url\"\n aria-label=\"Data source connection URL\"\n onChange={(event) =>\n onChange({\n ...config,\n url: event.currentTarget.value,\n })\n }\n value={config.url || ''}\n placeholder={urlPlaceholder || 'URL'}\n />\n </InlineField>\n </ConfigSection>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAgBO,MAAM,qBAAkF,CAAC;AAAA,EAC9F,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAM,KAAA;AACJ,EAAA,MAAM,aACJ,MAAO,CAAA,GAAA,KAAQ,aACf,qFAAsF,CAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAEvG,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,WAAW,GAAI,CAAA;AAAA,MACb,QAAU,EAAA;AAAA,KACX;AAAA,GACH;AAEA,EACE,uBAAA,GAAA,CAAA,QAAA,EAAA,EACE,QAAC,kBAAA,GAAA,CAAA,aAAA,EAAA,EAAc,KAAM,EAAA,YAAA,EAAa,WAA0B,EAAA,SAAA,EAAW,EAAG,CAAA,MAAA,CAAO,SAAW,EAAA,SAAS,CACnG,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,gBAAA;AAAA,MACR,OAAO,QAAY,IAAA,KAAA;AAAA,MACnB,UAAY,EAAA,EAAA;AAAA,MACZ,OAAA,EACE,8BACI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,6BAAA;AAAA,4BAEC,IAAG,EAAA,EAAA,CAAA;AAAA,QAAE;AAAA,OAER,EAAA,CAAA;AAAA,MAGJ,IAAI,EAAA,IAAA;AAAA,MACJ,UAAU,MAAO,CAAA,QAAA;AAAA,MACjB,QAAQ,EAAA,IAAA;AAAA,MACR,OAAS,EAAA,CAAC,UAAc,IAAA,CAAC,MAAO,CAAA,QAAA;AAAA,MAChC,KAAA,EAAO,aAAa,EAAK,GAAA,0BAAA;AAAA,MACzB,WAAW,EAAA,IAAA;AAAA,MAEX,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,EAAG,EAAA,gBAAA;AAAA,UACH,YAAW,EAAA,4BAAA;AAAA,UACX,QAAA,EAAU,CAAC,KAAA,KACT,QAAS,CAAA;AAAA,YACP,GAAG,MAAA;AAAA,YACH,GAAA,EAAK,MAAM,aAAc,CAAA;AAAA,WAC1B,CAAA;AAAA,UAEH,KAAA,EAAO,OAAO,GAAO,IAAA,EAAA;AAAA,UACrB,aAAa,cAAkB,IAAA;AAAA;AAAA;AACjC;AAAA,KAEJ,CACF,EAAA,CAAA;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- import React__default from 'react';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { css, cx } from '@emotion/css';
3
3
  import { useTheme2 } from '@grafana/ui';
4
4
 
@@ -25,7 +25,17 @@ const DataSourceDescription = ({ dataSourceName, docsLink, hasRequiredFields = t
25
25
  })
26
26
  })
27
27
  };
28
- return /* @__PURE__ */ React__default.createElement("div", { className: cx(styles.container, className) }, /* @__PURE__ */ React__default.createElement("p", { className: styles.text }, "Before you can use the ", dataSourceName, " data source, you must configure it below or in the config file. For detailed instructions,", " ", /* @__PURE__ */ React__default.createElement("a", { href: docsLink, target: "_blank", rel: "noreferrer" }, "view the documentation"), "."), hasRequiredFields && /* @__PURE__ */ React__default.createElement("p", { className: styles.text }, /* @__PURE__ */ React__default.createElement("i", null, "Fields marked with * are required")));
28
+ return /* @__PURE__ */ jsxs("div", { className: cx(styles.container, className), children: [
29
+ /* @__PURE__ */ jsxs("p", { className: styles.text, children: [
30
+ "Before you can use the ",
31
+ dataSourceName,
32
+ " data source, you must configure it below or in the config file. For detailed instructions,",
33
+ " ",
34
+ /* @__PURE__ */ jsx("a", { href: docsLink, target: "_blank", rel: "noreferrer", children: "view the documentation" }),
35
+ "."
36
+ ] }),
37
+ hasRequiredFields && /* @__PURE__ */ jsx("p", { className: styles.text, children: /* @__PURE__ */ jsx("i", { children: "Fields marked with * are required" }) })
38
+ ] });
29
39
  };
30
40
 
31
41
  export { DataSourceDescription };
@@ -1 +1 @@
1
- {"version":3,"file":"DataSourceDescription.js","sources":["../../../../src/components/ConfigEditor/DataSourceDescription.tsx"],"sourcesContent":["import React from 'react';\nimport { cx, css } from '@emotion/css';\nimport { useTheme2 } from '@grafana/ui';\n\ntype Props = {\n dataSourceName: string;\n docsLink: string;\n hasRequiredFields?: boolean;\n className?: string;\n};\n\nexport const DataSourceDescription = ({ dataSourceName, docsLink, hasRequiredFields = true, className }: Props) => {\n const theme = useTheme2();\n\n const styles = {\n container: css({\n p: {\n margin: 0,\n },\n 'p + p': {\n marginTop: theme.spacing(2),\n },\n }),\n text: css({\n ...theme.typography.body,\n color: theme.colors.text.secondary,\n a: css({\n color: theme.colors.text.link,\n textDecoration: 'underline',\n '&:hover': {\n textDecoration: 'none',\n },\n }),\n }),\n };\n\n return (\n <div className={cx(styles.container, className)}>\n <p className={styles.text}>\n Before you can use the {dataSourceName} data source, you must configure it below or in the config file. For\n detailed instructions,{' '}\n <a href={docsLink} target=\"_blank\" rel=\"noreferrer\">\n view the documentation\n </a>\n .\n </p>\n {hasRequiredFields && (\n <p className={styles.text}>\n <i>Fields marked with * are required</i>\n </p>\n )}\n </div>\n );\n};\n"],"names":["React"],"mappings":";;;;AAWa,MAAA,qBAAA,GAAwB,CAAC,EAAE,cAAA,EAAgB,UAAU,iBAAoB,GAAA,IAAA,EAAM,WAAuB,KAAA;AACjH,EAAA,MAAM,QAAQ,SAAU,EAAA;AAExB,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,WAAW,GAAI,CAAA;AAAA,MACb,CAAG,EAAA;AAAA,QACD,MAAQ,EAAA;AAAA,OACV;AAAA,MACA,OAAS,EAAA;AAAA,QACP,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AAC5B,KACD,CAAA;AAAA,IACD,MAAM,GAAI,CAAA;AAAA,MACR,GAAG,MAAM,UAAW,CAAA,IAAA;AAAA,MACpB,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,SAAA;AAAA,MACzB,GAAG,GAAI,CAAA;AAAA,QACL,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,IAAA;AAAA,QACzB,cAAgB,EAAA,WAAA;AAAA,QAChB,SAAW,EAAA;AAAA,UACT,cAAgB,EAAA;AAAA;AAClB,OACD;AAAA,KACF;AAAA,GACH;AAEA,EAAA,oDACG,KAAI,EAAA,EAAA,SAAA,EAAW,EAAG,CAAA,MAAA,CAAO,WAAW,SAAS,CAAA,EAAA,kBAC3CA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAE,WAAW,MAAO,CAAA,IAAA,EAAA,EAAM,2BACD,cAAe,EAAA,6FAAA,EAChB,qBACtBA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAE,IAAM,EAAA,QAAA,EAAU,QAAO,QAAS,EAAA,GAAA,EAAI,gBAAa,wBAEpD,CAAA,EAAI,GAEN,CACC,EAAA,iBAAA,oBACEA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAE,WAAW,MAAO,CAAA,IAAA,EAAA,+CAClB,GAAE,EAAA,IAAA,EAAA,mCAAiC,CACtC,CAEJ,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"DataSourceDescription.js","sources":["../../../../src/components/ConfigEditor/DataSourceDescription.tsx"],"sourcesContent":["import { cx, css } from '@emotion/css';\nimport { useTheme2 } from '@grafana/ui';\n\ntype Props = {\n dataSourceName: string;\n docsLink: string;\n hasRequiredFields?: boolean;\n className?: string;\n};\n\nexport const DataSourceDescription = ({ dataSourceName, docsLink, hasRequiredFields = true, className }: Props) => {\n const theme = useTheme2();\n\n const styles = {\n container: css({\n p: {\n margin: 0,\n },\n 'p + p': {\n marginTop: theme.spacing(2),\n },\n }),\n text: css({\n ...theme.typography.body,\n color: theme.colors.text.secondary,\n a: css({\n color: theme.colors.text.link,\n textDecoration: 'underline',\n '&:hover': {\n textDecoration: 'none',\n },\n }),\n }),\n };\n\n return (\n <div className={cx(styles.container, className)}>\n <p className={styles.text}>\n Before you can use the {dataSourceName} data source, you must configure it below or in the config file. For\n detailed instructions,{' '}\n <a href={docsLink} target=\"_blank\" rel=\"noreferrer\">\n view the documentation\n </a>\n .\n </p>\n {hasRequiredFields && (\n <p className={styles.text}>\n <i>Fields marked with * are required</i>\n </p>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;AAUa,MAAA,qBAAA,GAAwB,CAAC,EAAE,cAAA,EAAgB,UAAU,iBAAoB,GAAA,IAAA,EAAM,WAAuB,KAAA;AACjH,EAAA,MAAM,QAAQ,SAAU,EAAA;AAExB,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,WAAW,GAAI,CAAA;AAAA,MACb,CAAG,EAAA;AAAA,QACD,MAAQ,EAAA;AAAA,OACV;AAAA,MACA,OAAS,EAAA;AAAA,QACP,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AAC5B,KACD,CAAA;AAAA,IACD,MAAM,GAAI,CAAA;AAAA,MACR,GAAG,MAAM,UAAW,CAAA,IAAA;AAAA,MACpB,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,SAAA;AAAA,MACzB,GAAG,GAAI,CAAA;AAAA,QACL,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,IAAA;AAAA,QACzB,cAAgB,EAAA,WAAA;AAAA,QAChB,SAAW,EAAA;AAAA,UACT,cAAgB,EAAA;AAAA;AAClB,OACD;AAAA,KACF;AAAA,GACH;AAEA,EAAA,4BACG,KAAI,EAAA,EAAA,SAAA,EAAW,GAAG,MAAO,CAAA,SAAA,EAAW,SAAS,CAC5C,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,GAAA,EAAA,EAAE,SAAW,EAAA,MAAA,CAAO,IAAM,EAAA,QAAA,EAAA;AAAA,MAAA,yBAAA;AAAA,MACD,cAAA;AAAA,MAAe,6FAAA;AAAA,MAChB,GAAA;AAAA,sBACvB,GAAA,CAAC,OAAE,IAAM,EAAA,QAAA,EAAU,QAAO,QAAS,EAAA,GAAA,EAAI,cAAa,QAEpD,EAAA,wBAAA,EAAA,CAAA;AAAA,MAAI;AAAA,KAEN,EAAA,CAAA;AAAA,IACC,iBAAA,wBACE,GAAE,EAAA,EAAA,SAAA,EAAW,OAAO,IACnB,EAAA,QAAA,kBAAA,GAAA,CAAC,GAAE,EAAA,EAAA,QAAA,EAAA,mCAAA,EAAiC,CACtC,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- import React__default from 'react';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { InlineField, InlineSwitch } from '@grafana/ui';
3
3
  import { config } from '@grafana/runtime';
4
4
  import '@grafana/data';
@@ -14,31 +14,35 @@ const SecureSocksProxyToggle = ({ labelWidth = 10, ...props }) => {
14
14
  }
15
15
  });
16
16
  };
17
- return config.secureSocksDSProxyEnabled && /* @__PURE__ */ React__default.createElement("div", null, /* @__PURE__ */ React__default.createElement("div", { className: "gf-form" }, /* @__PURE__ */ React__default.createElement("div", { className: "gf-form gf-form-inline" }, /* @__PURE__ */ React__default.createElement(
17
+ return config.secureSocksDSProxyEnabled && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("div", { className: "gf-form", children: /* @__PURE__ */ jsx("div", { className: "gf-form gf-form-inline", children: /* @__PURE__ */ jsx(
18
18
  InlineField,
19
19
  {
20
20
  htmlFor: "secureSocksProxyEnabled",
21
21
  label: "Secure Socks Proxy Enabled",
22
22
  labelWidth,
23
- tooltip: /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, "Proxy the datasource connection through the secure socks proxy to a different network. To learn more about configuring the datasource connection proxy,", " ", /* @__PURE__ */ React__default.createElement(
24
- "a",
23
+ tooltip: /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ "Proxy the datasource connection through the secure socks proxy to a different network. To learn more about configuring the datasource connection proxy,",
25
+ " ",
26
+ /* @__PURE__ */ jsx(
27
+ "a",
28
+ {
29
+ href: "https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/proxy/",
30
+ target: "_blank",
31
+ rel: "noopener noreferrer",
32
+ children: "click here."
33
+ }
34
+ )
35
+ ] }),
36
+ children: /* @__PURE__ */ jsx(
37
+ InlineSwitch,
25
38
  {
26
- href: "https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/proxy/",
27
- target: "_blank",
28
- rel: "noopener noreferrer"
29
- },
30
- "click here."
31
- ))
32
- },
33
- /* @__PURE__ */ React__default.createElement(
34
- InlineSwitch,
35
- {
36
- id: "secureSocksProxyEnabled",
37
- value: dataSourceConfig.jsonData.enableSecureSocksProxy,
38
- onChange: handleSwitchChange
39
- }
40
- )
41
- ))));
39
+ id: "secureSocksProxyEnabled",
40
+ value: dataSourceConfig.jsonData.enableSecureSocksProxy,
41
+ onChange: handleSwitchChange
42
+ }
43
+ )
44
+ }
45
+ ) }) }) });
42
46
  };
43
47
 
44
48
  export { SecureSocksProxyToggle };
@@ -1 +1 @@
1
- {"version":3,"file":"SecureSocksProxyToggle.js","sources":["../../../../src/components/ConfigEditor/SecureSocksProxyToggle.tsx"],"sourcesContent":["import React from 'react';\nimport { type InlineLabel as OriginalInlineLabel, InlineField, InlineSwitch } from '@grafana/ui';\nimport { config } from '@grafana/runtime';\nimport { type DataSourceSettings } from '@grafana/data';\n\ntype Props = Omit<React.ComponentProps<typeof OriginalInlineLabel>, 'children' | 'onChange'> & {\n dataSourceConfig: DataSourceSettings<any, any>;\n onChange: (config: DataSourceSettings<any, any>) => void;\n labelWidth: number;\n};\n\nexport const SecureSocksProxyToggle = ({ labelWidth = 10, ...props }: Props) => {\n const { dataSourceConfig, onChange } = props;\n const handleSwitchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({\n ...dataSourceConfig,\n jsonData: {\n ...dataSourceConfig.jsonData,\n enableSecureSocksProxy: e.target.checked,\n },\n });\n };\n\n return (\n (config as any).secureSocksDSProxyEnabled && (\n <div>\n <div className=\"gf-form\">\n <div className=\"gf-form gf-form-inline\">\n <InlineField\n htmlFor=\"secureSocksProxyEnabled\"\n label=\"Secure Socks Proxy Enabled\"\n labelWidth={labelWidth}\n tooltip={\n <>\n Proxy the datasource connection through the secure socks proxy to a different network. To learn more\n about configuring the datasource connection proxy,{' '}\n <a\n href=\"https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/proxy/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n click here.\n </a>\n </>\n }\n >\n <InlineSwitch\n id=\"secureSocksProxyEnabled\"\n value={dataSourceConfig.jsonData.enableSecureSocksProxy}\n onChange={handleSwitchChange}\n />\n </InlineField>\n </div>\n </div>\n </div>\n )\n );\n};\n"],"names":["React"],"mappings":";;;;;AAWO,MAAM,yBAAyB,CAAC,EAAE,aAAa,EAAI,EAAA,GAAG,OAAmB,KAAA;AAC9E,EAAM,MAAA,EAAE,gBAAkB,EAAA,QAAA,EAAa,GAAA,KAAA;AACvC,EAAM,MAAA,kBAAA,GAAqB,CAAC,CAA2C,KAAA;AACrE,IAAS,QAAA,CAAA;AAAA,MACP,GAAG,gBAAA;AAAA,MACH,QAAU,EAAA;AAAA,QACR,GAAG,gBAAiB,CAAA,QAAA;AAAA,QACpB,sBAAA,EAAwB,EAAE,MAAO,CAAA;AAAA;AACnC,KACD,CAAA;AAAA,GACH;AAEA,EACG,OAAA,MAAA,CAAe,yBACd,oBAAAA,cAAA,CAAA,aAAA,CAAC,KACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,SACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,wBACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,yBAAA;AAAA,MACR,KAAM,EAAA,4BAAA;AAAA,MACN,UAAA;AAAA,MACA,OAAA,kBACIA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EAAA,yJAAA,EAEmD,GACnD,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAK,EAAA,gFAAA;AAAA,UACL,MAAO,EAAA,QAAA;AAAA,UACP,GAAI,EAAA;AAAA,SAAA;AAAA,QACL;AAAA,OAGH;AAAA,KAAA;AAAA,oBAGFA,cAAA,CAAA,aAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,EAAG,EAAA,yBAAA;AAAA,QACH,KAAA,EAAO,iBAAiB,QAAS,CAAA,sBAAA;AAAA,QACjC,QAAU,EAAA;AAAA;AAAA;AACZ,GAEJ,CACF,CACF,CAAA;AAGN;;;;"}
1
+ {"version":3,"file":"SecureSocksProxyToggle.js","sources":["../../../../src/components/ConfigEditor/SecureSocksProxyToggle.tsx"],"sourcesContent":["import { type InlineLabel as OriginalInlineLabel, InlineField, InlineSwitch } from '@grafana/ui';\nimport { config } from '@grafana/runtime';\nimport { type DataSourceSettings } from '@grafana/data';\n\ntype Props = Omit<React.ComponentProps<typeof OriginalInlineLabel>, 'children' | 'onChange'> & {\n dataSourceConfig: DataSourceSettings<any, any>;\n onChange: (config: DataSourceSettings<any, any>) => void;\n labelWidth: number;\n};\n\nexport const SecureSocksProxyToggle = ({ labelWidth = 10, ...props }: Props) => {\n const { dataSourceConfig, onChange } = props;\n const handleSwitchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({\n ...dataSourceConfig,\n jsonData: {\n ...dataSourceConfig.jsonData,\n enableSecureSocksProxy: e.target.checked,\n },\n });\n };\n\n return (\n (config as any).secureSocksDSProxyEnabled && (\n <div>\n <div className=\"gf-form\">\n <div className=\"gf-form gf-form-inline\">\n <InlineField\n htmlFor=\"secureSocksProxyEnabled\"\n label=\"Secure Socks Proxy Enabled\"\n labelWidth={labelWidth}\n tooltip={\n <>\n Proxy the datasource connection through the secure socks proxy to a different network. To learn more\n about configuring the datasource connection proxy,{' '}\n <a\n href=\"https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/proxy/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n click here.\n </a>\n </>\n }\n >\n <InlineSwitch\n id=\"secureSocksProxyEnabled\"\n value={dataSourceConfig.jsonData.enableSecureSocksProxy}\n onChange={handleSwitchChange}\n />\n </InlineField>\n </div>\n </div>\n </div>\n )\n );\n};\n"],"names":[],"mappings":";;;;;AAUO,MAAM,yBAAyB,CAAC,EAAE,aAAa,EAAI,EAAA,GAAG,OAAmB,KAAA;AAC9E,EAAM,MAAA,EAAE,gBAAkB,EAAA,QAAA,EAAa,GAAA,KAAA;AACvC,EAAM,MAAA,kBAAA,GAAqB,CAAC,CAA2C,KAAA;AACrE,IAAS,QAAA,CAAA;AAAA,MACP,GAAG,gBAAA;AAAA,MACH,QAAU,EAAA;AAAA,QACR,GAAG,gBAAiB,CAAA,QAAA;AAAA,QACpB,sBAAA,EAAwB,EAAE,MAAO,CAAA;AAAA;AACnC,KACD,CAAA;AAAA,GACH;AAEA,EACG,OAAA,MAAA,CAAe,yBACd,oBAAA,GAAA,CAAC,KACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,SACb,EAAA,QAAA,kBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,wBACb,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,yBAAA;AAAA,MACR,KAAM,EAAA,4BAAA;AAAA,MACN,UAAA;AAAA,MACA,yBACI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,yJAAA;AAAA,QAEmD,GAAA;AAAA,wBACnD,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAK,EAAA,gFAAA;AAAA,YACL,MAAO,EAAA,QAAA;AAAA,YACP,GAAI,EAAA,qBAAA;AAAA,YACL,QAAA,EAAA;AAAA;AAAA;AAED,OACF,EAAA,CAAA;AAAA,MAGF,QAAA,kBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,EAAG,EAAA,yBAAA;AAAA,UACH,KAAA,EAAO,iBAAiB,QAAS,CAAA,sBAAA;AAAA,UACjC,QAAU,EAAA;AAAA;AAAA;AACZ;AAAA,GACF,EACF,GACF,CACF,EAAA,CAAA;AAGN;;;;"}
@@ -1,4 +1,5 @@
1
- import React__default, { PureComponent } from 'react';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { PureComponent } from 'react';
2
3
  import { css } from '@emotion/css';
3
4
  import { uniqueId } from 'lodash';
4
5
  import '@grafana/data';
@@ -27,43 +28,47 @@ const getCustomHeaderRowStyles = stylesFactory(() => {
27
28
  });
28
29
  const CustomHeaderRow = ({ header, onBlur, onChange, onRemove, onReset }) => {
29
30
  const styles = getCustomHeaderRowStyles();
30
- return /* @__PURE__ */ React__default.createElement("div", { className: styles.layout }, /* @__PURE__ */ React__default.createElement(
31
- LegacyForms.FormField,
32
- {
33
- label: "Header",
34
- name: "name",
35
- placeholder: "X-Custom-Header",
36
- labelWidth: 5,
37
- value: header.name || "",
38
- onChange: (e) => onChange({ ...header, name: e.target.value }),
39
- onBlur
40
- }
41
- ), /* @__PURE__ */ React__default.createElement(
42
- LegacyForms.SecretFormField,
43
- {
44
- label: "Value",
45
- "aria-label": "Value",
46
- name: "value",
47
- isConfigured: header.configured,
48
- value: header.value,
49
- labelWidth: 5,
50
- inputWidth: header.configured ? 11 : 12,
51
- placeholder: "Header Value",
52
- onReset: () => onReset(header.id),
53
- onChange: (e) => onChange({ ...header, value: e.target.value }),
54
- onBlur
55
- }
56
- ), /* @__PURE__ */ React__default.createElement(
57
- Button,
58
- {
59
- type: "button",
60
- "aria-label": "Remove header",
61
- variant: "secondary",
62
- size: "xs",
63
- onClick: (_e) => onRemove(header.id)
64
- },
65
- /* @__PURE__ */ React__default.createElement(Icon, { name: "trash-alt" })
66
- ));
31
+ return /* @__PURE__ */ jsxs("div", { className: styles.layout, children: [
32
+ /* @__PURE__ */ jsx(
33
+ LegacyForms.FormField,
34
+ {
35
+ label: "Header",
36
+ name: "name",
37
+ placeholder: "X-Custom-Header",
38
+ labelWidth: 5,
39
+ value: header.name || "",
40
+ onChange: (e) => onChange({ ...header, name: e.target.value }),
41
+ onBlur
42
+ }
43
+ ),
44
+ /* @__PURE__ */ jsx(
45
+ LegacyForms.SecretFormField,
46
+ {
47
+ label: "Value",
48
+ "aria-label": "Value",
49
+ name: "value",
50
+ isConfigured: header.configured,
51
+ value: header.value,
52
+ labelWidth: 5,
53
+ inputWidth: header.configured ? 11 : 12,
54
+ placeholder: "Header Value",
55
+ onReset: () => onReset(header.id),
56
+ onChange: (e) => onChange({ ...header, value: e.target.value }),
57
+ onBlur
58
+ }
59
+ ),
60
+ /* @__PURE__ */ jsx(
61
+ Button,
62
+ {
63
+ type: "button",
64
+ "aria-label": "Remove header",
65
+ variant: "secondary",
66
+ size: "xs",
67
+ onClick: (_e) => onRemove(header.id),
68
+ children: /* @__PURE__ */ jsx(Icon, { name: "trash-alt" })
69
+ }
70
+ )
71
+ ] });
67
72
  };
68
73
  CustomHeaderRow.displayName = "CustomHeaderRow";
69
74
  class CustomHeadersSettings extends PureComponent {
@@ -151,30 +156,34 @@ class CustomHeadersSettings extends PureComponent {
151
156
  }
152
157
  render() {
153
158
  const { headers } = this.state;
154
- return /* @__PURE__ */ React__default.createElement("div", { className: "gf-form-group" }, /* @__PURE__ */ React__default.createElement("div", { className: "gf-form" }, /* @__PURE__ */ React__default.createElement("h6", null, "Custom HTTP Headers")), /* @__PURE__ */ React__default.createElement("div", null, headers.map((header, i) => /* @__PURE__ */ React__default.createElement(
155
- CustomHeaderRow,
156
- {
157
- key: header.id,
158
- header,
159
- onChange: (h) => {
160
- this.onHeaderChange(i, h);
159
+ return /* @__PURE__ */ jsxs("div", { className: "gf-form-group", children: [
160
+ /* @__PURE__ */ jsx("div", { className: "gf-form", children: /* @__PURE__ */ jsx("h6", { children: "Custom HTTP Headers" }) }),
161
+ /* @__PURE__ */ jsx("div", { children: headers.map((header, i) => /* @__PURE__ */ jsx(
162
+ CustomHeaderRow,
163
+ {
164
+ header,
165
+ onChange: (h) => {
166
+ this.onHeaderChange(i, h);
167
+ },
168
+ onBlur: this.updateSettings,
169
+ onRemove: this.onHeaderRemove,
170
+ onReset: this.onHeaderReset
161
171
  },
162
- onBlur: this.updateSettings,
163
- onRemove: this.onHeaderRemove,
164
- onReset: this.onHeaderReset
165
- }
166
- ))), /* @__PURE__ */ React__default.createElement("div", { className: "gf-form" }, /* @__PURE__ */ React__default.createElement(
167
- Button,
168
- {
169
- variant: "secondary",
170
- icon: "plus",
171
- type: "button",
172
- onClick: (e) => {
173
- this.onHeaderAdd();
172
+ header.id
173
+ )) }),
174
+ /* @__PURE__ */ jsx("div", { className: "gf-form", children: /* @__PURE__ */ jsx(
175
+ Button,
176
+ {
177
+ variant: "secondary",
178
+ icon: "plus",
179
+ type: "button",
180
+ onClick: (e) => {
181
+ this.onHeaderAdd();
182
+ },
183
+ children: "Add header"
174
184
  }
175
- },
176
- "Add header"
177
- )));
185
+ ) })
186
+ ] });
178
187
  }
179
188
  }
180
189
 
@@ -1 +1 @@
1
- {"version":3,"file":"CustomHeadersSettings.js","sources":["../../../../src/components/CustomHeadersSettings/CustomHeadersSettings.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { type DataSourceSettings } from '@grafana/data';\nimport { stylesFactory, LegacyForms, Button, Icon } from '@grafana/ui';\n\nexport interface CustomHeader {\n id: string;\n name: string;\n value: string;\n configured: boolean;\n}\n\nexport type CustomHeaders = CustomHeader[];\n\nexport interface Props {\n dataSourceConfig: DataSourceSettings<any, any>;\n onChange: (config: DataSourceSettings) => void;\n}\n\nexport interface State {\n headers: CustomHeaders;\n}\n\ninterface CustomHeaderRowProps {\n header: CustomHeader;\n onReset: (id: string) => void;\n onRemove: (id: string) => void;\n onChange: (value: CustomHeader) => void;\n onBlur: () => void;\n}\n\nconst getCustomHeaderRowStyles = stylesFactory(() => {\n return {\n layout: css`\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n > * {\n margin-left: 4px;\n margin-bottom: 0;\n height: 100%;\n &:first-child,\n &:last-child {\n margin-left: 0;\n }\n }\n `,\n };\n});\n\nconst CustomHeaderRow = ({ header, onBlur, onChange, onRemove, onReset }: CustomHeaderRowProps) => {\n const styles = getCustomHeaderRowStyles();\n return (\n <div className={styles.layout}>\n <LegacyForms.FormField\n label=\"Header\"\n name=\"name\"\n placeholder=\"X-Custom-Header\"\n labelWidth={5}\n value={header.name || ''}\n onChange={(e) => onChange({ ...header, name: e.target.value })}\n onBlur={onBlur}\n />\n <LegacyForms.SecretFormField\n label=\"Value\"\n aria-label=\"Value\"\n name=\"value\"\n isConfigured={header.configured}\n value={header.value}\n labelWidth={5}\n inputWidth={header.configured ? 11 : 12}\n placeholder=\"Header Value\"\n onReset={() => onReset(header.id)}\n onChange={(e) => onChange({ ...header, value: e.target.value })}\n onBlur={onBlur}\n />\n <Button\n type=\"button\"\n aria-label=\"Remove header\"\n variant=\"secondary\"\n size=\"xs\"\n onClick={(_e) => onRemove(header.id)}\n >\n <Icon name=\"trash-alt\" />\n </Button>\n </div>\n );\n};\n\nCustomHeaderRow.displayName = 'CustomHeaderRow';\n\nexport class CustomHeadersSettings extends PureComponent<Props, State> {\n state: State = {\n headers: [],\n };\n\n constructor(props: Props) {\n super(props);\n const { jsonData, secureJsonData, secureJsonFields } = this.props.dataSourceConfig;\n this.state = {\n headers: Object.keys(jsonData)\n .sort()\n .filter((key) => key.startsWith('httpHeaderName'))\n .map((key, index) => {\n return {\n id: uniqueId(),\n name: jsonData[key],\n value: secureJsonData !== undefined ? secureJsonData[key] : '',\n configured: (secureJsonFields && secureJsonFields[`httpHeaderValue${index + 1}`]) || false,\n };\n }),\n };\n }\n\n updateSettings = () => {\n const { headers } = this.state;\n\n // we remove every httpHeaderName* field\n const newJsonData = Object.fromEntries(\n Object.entries(this.props.dataSourceConfig.jsonData).filter(([key, val]) => !key.startsWith('httpHeaderName'))\n );\n\n // we remove every httpHeaderValue* field\n const newSecureJsonData = Object.fromEntries(\n Object.entries(this.props.dataSourceConfig.secureJsonData || {}).filter(\n ([key, val]) => !key.startsWith('httpHeaderValue')\n )\n );\n\n // then we add the current httpHeader-fields\n for (const [index, header] of headers.entries()) {\n newJsonData[`httpHeaderName${index + 1}`] = header.name;\n if (!header.configured) {\n newSecureJsonData[`httpHeaderValue${index + 1}`] = header.value;\n }\n }\n\n this.props.onChange({\n ...this.props.dataSourceConfig,\n jsonData: newJsonData,\n secureJsonData: newSecureJsonData,\n });\n };\n\n onHeaderAdd = () => {\n this.setState((prevState) => {\n return {\n headers: [...prevState.headers, { id: uniqueId(), name: '', value: '', configured: false }],\n };\n });\n };\n\n onHeaderChange = (headerIndex: number, value: CustomHeader) => {\n this.setState(({ headers }) => {\n return {\n headers: headers.map((item, index) => {\n if (headerIndex !== index) {\n return item;\n }\n return { ...value };\n }),\n };\n });\n };\n\n onHeaderReset = (headerId: string) => {\n this.setState(({ headers }) => {\n return {\n headers: headers.map((h, i) => {\n if (h.id !== headerId) {\n return h;\n }\n return {\n ...h,\n value: '',\n configured: false,\n };\n }),\n };\n });\n };\n\n onHeaderRemove = (headerId: string) => {\n this.setState(\n ({ headers }) => ({\n headers: headers.filter((h) => h.id !== headerId),\n }),\n this.updateSettings\n );\n };\n\n render() {\n const { headers } = this.state;\n return (\n <div className={'gf-form-group'}>\n <div className=\"gf-form\">\n <h6>Custom HTTP Headers</h6>\n </div>\n <div>\n {headers.map((header, i) => (\n <CustomHeaderRow\n key={header.id}\n header={header}\n onChange={(h) => {\n this.onHeaderChange(i, h);\n }}\n onBlur={this.updateSettings}\n onRemove={this.onHeaderRemove}\n onReset={this.onHeaderReset}\n />\n ))}\n </div>\n <div className=\"gf-form\">\n <Button\n variant=\"secondary\"\n icon=\"plus\"\n type=\"button\"\n onClick={(e) => {\n this.onHeaderAdd();\n }}\n >\n Add header\n </Button>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomHeadersSettings;\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"CustomHeadersSettings.js","sources":["../../../../src/components/CustomHeadersSettings/CustomHeadersSettings.tsx"],"sourcesContent":["import { PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { type DataSourceSettings } from '@grafana/data';\nimport { stylesFactory, LegacyForms, Button, Icon } from '@grafana/ui';\n\nexport interface CustomHeader {\n id: string;\n name: string;\n value: string;\n configured: boolean;\n}\n\nexport type CustomHeaders = CustomHeader[];\n\nexport interface Props {\n dataSourceConfig: DataSourceSettings<any, any>;\n onChange: (config: DataSourceSettings) => void;\n}\n\nexport interface State {\n headers: CustomHeaders;\n}\n\ninterface CustomHeaderRowProps {\n header: CustomHeader;\n onReset: (id: string) => void;\n onRemove: (id: string) => void;\n onChange: (value: CustomHeader) => void;\n onBlur: () => void;\n}\n\nconst getCustomHeaderRowStyles = stylesFactory(() => {\n return {\n layout: css`\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n > * {\n margin-left: 4px;\n margin-bottom: 0;\n height: 100%;\n &:first-child,\n &:last-child {\n margin-left: 0;\n }\n }\n `,\n };\n});\n\nconst CustomHeaderRow = ({ header, onBlur, onChange, onRemove, onReset }: CustomHeaderRowProps) => {\n const styles = getCustomHeaderRowStyles();\n return (\n <div className={styles.layout}>\n <LegacyForms.FormField\n label=\"Header\"\n name=\"name\"\n placeholder=\"X-Custom-Header\"\n labelWidth={5}\n value={header.name || ''}\n onChange={(e) => onChange({ ...header, name: e.target.value })}\n onBlur={onBlur}\n />\n <LegacyForms.SecretFormField\n label=\"Value\"\n aria-label=\"Value\"\n name=\"value\"\n isConfigured={header.configured}\n value={header.value}\n labelWidth={5}\n inputWidth={header.configured ? 11 : 12}\n placeholder=\"Header Value\"\n onReset={() => onReset(header.id)}\n onChange={(e) => onChange({ ...header, value: e.target.value })}\n onBlur={onBlur}\n />\n <Button\n type=\"button\"\n aria-label=\"Remove header\"\n variant=\"secondary\"\n size=\"xs\"\n onClick={(_e) => onRemove(header.id)}\n >\n <Icon name=\"trash-alt\" />\n </Button>\n </div>\n );\n};\n\nCustomHeaderRow.displayName = 'CustomHeaderRow';\n\nexport class CustomHeadersSettings extends PureComponent<Props, State> {\n state: State = {\n headers: [],\n };\n\n constructor(props: Props) {\n super(props);\n const { jsonData, secureJsonData, secureJsonFields } = this.props.dataSourceConfig;\n this.state = {\n headers: Object.keys(jsonData)\n .sort()\n .filter((key) => key.startsWith('httpHeaderName'))\n .map((key, index) => {\n return {\n id: uniqueId(),\n name: jsonData[key],\n value: secureJsonData !== undefined ? secureJsonData[key] : '',\n configured: (secureJsonFields && secureJsonFields[`httpHeaderValue${index + 1}`]) || false,\n };\n }),\n };\n }\n\n updateSettings = () => {\n const { headers } = this.state;\n\n // we remove every httpHeaderName* field\n const newJsonData = Object.fromEntries(\n Object.entries(this.props.dataSourceConfig.jsonData).filter(([key, val]) => !key.startsWith('httpHeaderName'))\n );\n\n // we remove every httpHeaderValue* field\n const newSecureJsonData = Object.fromEntries(\n Object.entries(this.props.dataSourceConfig.secureJsonData || {}).filter(\n ([key, val]) => !key.startsWith('httpHeaderValue')\n )\n );\n\n // then we add the current httpHeader-fields\n for (const [index, header] of headers.entries()) {\n newJsonData[`httpHeaderName${index + 1}`] = header.name;\n if (!header.configured) {\n newSecureJsonData[`httpHeaderValue${index + 1}`] = header.value;\n }\n }\n\n this.props.onChange({\n ...this.props.dataSourceConfig,\n jsonData: newJsonData,\n secureJsonData: newSecureJsonData,\n });\n };\n\n onHeaderAdd = () => {\n this.setState((prevState) => {\n return {\n headers: [...prevState.headers, { id: uniqueId(), name: '', value: '', configured: false }],\n };\n });\n };\n\n onHeaderChange = (headerIndex: number, value: CustomHeader) => {\n this.setState(({ headers }) => {\n return {\n headers: headers.map((item, index) => {\n if (headerIndex !== index) {\n return item;\n }\n return { ...value };\n }),\n };\n });\n };\n\n onHeaderReset = (headerId: string) => {\n this.setState(({ headers }) => {\n return {\n headers: headers.map((h, i) => {\n if (h.id !== headerId) {\n return h;\n }\n return {\n ...h,\n value: '',\n configured: false,\n };\n }),\n };\n });\n };\n\n onHeaderRemove = (headerId: string) => {\n this.setState(\n ({ headers }) => ({\n headers: headers.filter((h) => h.id !== headerId),\n }),\n this.updateSettings\n );\n };\n\n render() {\n const { headers } = this.state;\n return (\n <div className={'gf-form-group'}>\n <div className=\"gf-form\">\n <h6>Custom HTTP Headers</h6>\n </div>\n <div>\n {headers.map((header, i) => (\n <CustomHeaderRow\n key={header.id}\n header={header}\n onChange={(h) => {\n this.onHeaderChange(i, h);\n }}\n onBlur={this.updateSettings}\n onRemove={this.onHeaderRemove}\n onReset={this.onHeaderReset}\n />\n ))}\n </div>\n <div className=\"gf-form\">\n <Button\n variant=\"secondary\"\n icon=\"plus\"\n type=\"button\"\n onClick={(e) => {\n this.onHeaderAdd();\n }}\n >\n Add header\n </Button>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomHeadersSettings;\n"],"names":[],"mappings":";;;;;;;;;;AAgCA,MAAM,wBAAA,GAA2B,cAAc,MAAM;AACnD,EAAO,OAAA;AAAA,IACL,MAAQ,EAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,GAcV;AACF,CAAC,CAAA;AAED,MAAM,eAAA,GAAkB,CAAC,EAAE,MAAA,EAAQ,QAAQ,QAAU,EAAA,QAAA,EAAU,SAAoC,KAAA;AACjG,EAAA,MAAM,SAAS,wBAAyB,EAAA;AACxC,EAAA,uBACG,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,MACrB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,WAAY,CAAA,SAAA;AAAA,MAAZ;AAAA,QACC,KAAM,EAAA,QAAA;AAAA,QACN,IAAK,EAAA,MAAA;AAAA,QACL,WAAY,EAAA,iBAAA;AAAA,QACZ,UAAY,EAAA,CAAA;AAAA,QACZ,KAAA,EAAO,OAAO,IAAQ,IAAA,EAAA;AAAA,QACtB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAS,CAAA,EAAE,GAAG,MAAA,EAAQ,IAAM,EAAA,CAAA,CAAE,MAAO,CAAA,KAAA,EAAO,CAAA;AAAA,QAC7D;AAAA;AAAA,KACF;AAAA,oBACA,GAAA;AAAA,MAAC,WAAY,CAAA,eAAA;AAAA,MAAZ;AAAA,QACC,KAAM,EAAA,OAAA;AAAA,QACN,YAAW,EAAA,OAAA;AAAA,QACX,IAAK,EAAA,OAAA;AAAA,QACL,cAAc,MAAO,CAAA,UAAA;AAAA,QACrB,OAAO,MAAO,CAAA,KAAA;AAAA,QACd,UAAY,EAAA,CAAA;AAAA,QACZ,UAAA,EAAY,MAAO,CAAA,UAAA,GAAa,EAAK,GAAA,EAAA;AAAA,QACrC,WAAY,EAAA,cAAA;AAAA,QACZ,OAAS,EAAA,MAAM,OAAQ,CAAA,MAAA,CAAO,EAAE,CAAA;AAAA,QAChC,QAAA,EAAU,CAAC,CAAA,KAAM,QAAS,CAAA,EAAE,GAAG,MAAA,EAAQ,KAAO,EAAA,CAAA,CAAE,MAAO,CAAA,KAAA,EAAO,CAAA;AAAA,QAC9D;AAAA;AAAA,KACF;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,QAAA;AAAA,QACL,YAAW,EAAA,eAAA;AAAA,QACX,OAAQ,EAAA,WAAA;AAAA,QACR,IAAK,EAAA,IAAA;AAAA,QACL,OAAS,EAAA,CAAC,EAAO,KAAA,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,QAEnC,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAK,WAAY,EAAA;AAAA;AAAA;AACzB,GACF,EAAA,CAAA;AAEJ,CAAA;AAEA,eAAA,CAAgB,WAAc,GAAA,iBAAA;AAEvB,MAAM,8BAA8B,aAA4B,CAAA;AAAA,EAKrE,YAAY,KAAc,EAAA;AACxB,IAAA,KAAA,CAAM,KAAK,CAAA;AALb,IAAe,aAAA,CAAA,IAAA,EAAA,OAAA,EAAA;AAAA,MACb,SAAS;AAAC,KACZ,CAAA;AAoBA,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiB,MAAM;AACrB,MAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,IAAK,CAAA,KAAA;AAGzB,MAAA,MAAM,cAAc,MAAO,CAAA,WAAA;AAAA,QACzB,OAAO,OAAQ,CAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,CAAiB,QAAQ,CAAE,CAAA,MAAA,CAAO,CAAC,CAAC,KAAK,GAAG,CAAA,KAAM,CAAC,GAAI,CAAA,UAAA,CAAW,gBAAgB,CAAC;AAAA,OAC/G;AAGA,MAAA,MAAM,oBAAoB,MAAO,CAAA,WAAA;AAAA,QAC/B,MAAA,CAAO,QAAQ,IAAK,CAAA,KAAA,CAAM,iBAAiB,cAAkB,IAAA,EAAE,CAAE,CAAA,MAAA;AAAA,UAC/D,CAAC,CAAC,GAAK,EAAA,GAAG,MAAM,CAAC,GAAA,CAAI,WAAW,iBAAiB;AAAA;AACnD,OACF;AAGA,MAAA,KAAA,MAAW,CAAC,KAAO,EAAA,MAAM,CAAK,IAAA,OAAA,CAAQ,SAAW,EAAA;AAC/C,QAAA,WAAA,CAAY,CAAiB,cAAA,EAAA,KAAA,GAAQ,CAAC,CAAA,CAAE,IAAI,MAAO,CAAA,IAAA;AACnD,QAAI,IAAA,CAAC,OAAO,UAAY,EAAA;AACtB,UAAA,iBAAA,CAAkB,CAAkB,eAAA,EAAA,KAAA,GAAQ,CAAC,CAAA,CAAE,IAAI,MAAO,CAAA,KAAA;AAAA;AAC5D;AAGF,MAAA,IAAA,CAAK,MAAM,QAAS,CAAA;AAAA,QAClB,GAAG,KAAK,KAAM,CAAA,gBAAA;AAAA,QACd,QAAU,EAAA,WAAA;AAAA,QACV,cAAgB,EAAA;AAAA,OACjB,CAAA;AAAA,KACH,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,aAAA,EAAc,MAAM;AAClB,MAAK,IAAA,CAAA,QAAA,CAAS,CAAC,SAAc,KAAA;AAC3B,QAAO,OAAA;AAAA,UACL,OAAS,EAAA,CAAC,GAAG,SAAA,CAAU,SAAS,EAAE,EAAA,EAAI,QAAS,EAAA,EAAG,MAAM,EAAI,EAAA,KAAA,EAAO,EAAI,EAAA,UAAA,EAAY,OAAO;AAAA,SAC5F;AAAA,OACD,CAAA;AAAA,KACH,CAAA;AAEA,IAAiB,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,CAAC,aAAqB,KAAwB,KAAA;AAC7D,MAAA,IAAA,CAAK,QAAS,CAAA,CAAC,EAAE,OAAA,EAAc,KAAA;AAC7B,QAAO,OAAA;AAAA,UACL,OAAS,EAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAM,KAAU,KAAA;AACpC,YAAA,IAAI,gBAAgB,KAAO,EAAA;AACzB,cAAO,OAAA,IAAA;AAAA;AAET,YAAO,OAAA,EAAE,GAAG,KAAM,EAAA;AAAA,WACnB;AAAA,SACH;AAAA,OACD,CAAA;AAAA,KACH,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,EAAgB,CAAC,QAAqB,KAAA;AACpC,MAAA,IAAA,CAAK,QAAS,CAAA,CAAC,EAAE,OAAA,EAAc,KAAA;AAC7B,QAAO,OAAA;AAAA,UACL,OAAS,EAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,GAAG,CAAM,KAAA;AAC7B,YAAI,IAAA,CAAA,CAAE,OAAO,QAAU,EAAA;AACrB,cAAO,OAAA,CAAA;AAAA;AAET,YAAO,OAAA;AAAA,cACL,GAAG,CAAA;AAAA,cACH,KAAO,EAAA,EAAA;AAAA,cACP,UAAY,EAAA;AAAA,aACd;AAAA,WACD;AAAA,SACH;AAAA,OACD,CAAA;AAAA,KACH,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiB,CAAC,QAAqB,KAAA;AACrC,MAAK,IAAA,CAAA,QAAA;AAAA,QACH,CAAC,EAAE,OAAA,EAAe,MAAA;AAAA,UAChB,SAAS,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,QAAQ;AAAA,SAClD,CAAA;AAAA,QACA,IAAK,CAAA;AAAA,OACP;AAAA,KACF,CAAA;AA3FE,IAAA,MAAM,EAAE,QAAU,EAAA,cAAA,EAAgB,gBAAiB,EAAA,GAAI,KAAK,KAAM,CAAA,gBAAA;AAClE,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,SAAS,MAAO,CAAA,IAAA,CAAK,QAAQ,CAC1B,CAAA,IAAA,GACA,MAAO,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,WAAW,gBAAgB,CAAC,EAChD,GAAI,CAAA,CAAC,KAAK,KAAU,KAAA;AACnB,QAAO,OAAA;AAAA,UACL,IAAI,QAAS,EAAA;AAAA,UACb,IAAA,EAAM,SAAS,GAAG,CAAA;AAAA,UAClB,KAAO,EAAA,cAAA,KAAmB,SAAY,GAAA,cAAA,CAAe,GAAG,CAAI,GAAA,EAAA;AAAA,UAC5D,YAAa,gBAAoB,IAAA,gBAAA,CAAiB,kBAAkB,KAAQ,GAAA,CAAC,EAAE,CAAM,IAAA;AAAA,SACvF;AAAA,OACD;AAAA,KACL;AAAA;AACF,EA+EA,MAAS,GAAA;AACP,IAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,IAAK,CAAA,KAAA;AACzB,IACE,uBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,eACd,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAI,SAAU,EAAA,SAAA,EACb,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAG,iCAAmB,CACzB,EAAA,CAAA;AAAA,0BACC,KACE,EAAA,EAAA,QAAA,EAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,QAAQ,CACpB,qBAAA,GAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UAEC,MAAA;AAAA,UACA,QAAA,EAAU,CAAC,CAAM,KAAA;AACf,YAAK,IAAA,CAAA,cAAA,CAAe,GAAG,CAAC,CAAA;AAAA,WAC1B;AAAA,UACA,QAAQ,IAAK,CAAA,cAAA;AAAA,UACb,UAAU,IAAK,CAAA,cAAA;AAAA,UACf,SAAS,IAAK,CAAA;AAAA,SAAA;AAAA,QAPT,MAAO,CAAA;AAAA,OASf,CACH,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,SACb,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,WAAA;AAAA,UACR,IAAK,EAAA,MAAA;AAAA,UACL,IAAK,EAAA,QAAA;AAAA,UACL,OAAA,EAAS,CAAC,CAAM,KAAA;AACd,YAAA,IAAA,CAAK,WAAY,EAAA;AAAA,WACnB;AAAA,UACD,QAAA,EAAA;AAAA;AAAA,OAGH,EAAA;AAAA,KACF,EAAA,CAAA;AAAA;AAGN;;;;"}
@@ -1,4 +1,5 @@
1
- import React__default, { useState, useEffect } from 'react';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useEffect } from 'react';
2
3
  import { css } from '@emotion/css';
3
4
  import '@grafana/data';
4
5
  import { stylesFactory, Button, DataLinkInput, LegacyForms } from '@grafana/ui';
@@ -31,100 +32,114 @@ const DataLink = (props) => {
31
32
  [field]: event.currentTarget.value
32
33
  });
33
34
  };
34
- return /* @__PURE__ */ React__default.createElement("div", { className }, /* @__PURE__ */ React__default.createElement("div", { className: styles.firstRow + " gf-form" }, /* @__PURE__ */ React__default.createElement(
35
- FormField,
36
- {
37
- className: styles.nameField,
38
- labelWidth: 6,
39
- inputWidth: null,
40
- label: "Field",
41
- type: "text",
42
- value: value.field,
43
- tooltip: "Can be exact field name or a regex pattern that will match on the field name.",
44
- onChange: handleChange("field")
45
- }
46
- ), /* @__PURE__ */ React__default.createElement(
47
- Button,
48
- {
49
- variant: "destructive",
50
- title: "Remove field",
51
- icon: "times",
52
- onClick: (event) => {
53
- event.preventDefault();
54
- onDelete();
55
- }
56
- }
57
- )), /* @__PURE__ */ React__default.createElement("div", { className: "gf-form" }, /* @__PURE__ */ React__default.createElement(
58
- FormField,
59
- {
60
- className: styles.nameField,
61
- inputWidth: null,
62
- label: "Label",
63
- type: "text",
64
- value: value.label,
65
- onChange: handleChange("label"),
66
- tooltip: "Use to provide a meaningful label to the data matched in the regex"
67
- }
68
- ), /* @__PURE__ */ React__default.createElement(
69
- FormField,
70
- {
71
- className: styles.regexField,
72
- inputWidth: null,
73
- label: "Regex",
74
- type: "text",
75
- value: value.matcherRegex,
76
- onChange: handleChange("matcherRegex"),
77
- tooltip: "Use to parse and capture some part of the log message. You can use the captured groups in the template."
78
- }
79
- )), /* @__PURE__ */ React__default.createElement("div", { className: "gf-form" }, /* @__PURE__ */ React__default.createElement(
80
- FormField,
81
- {
82
- label: showInternalLink ? "Query" : "URL",
83
- labelWidth: 6,
84
- inputEl: /* @__PURE__ */ React__default.createElement(
85
- DataLinkInput,
35
+ return /* @__PURE__ */ jsxs("div", { className, children: [
36
+ /* @__PURE__ */ jsxs("div", { className: styles.firstRow + " gf-form", children: [
37
+ /* @__PURE__ */ jsx(
38
+ FormField,
86
39
  {
87
- placeholder: showInternalLink ? "${__value.raw}" : "http://example.com/${__value.raw}",
88
- value: value.url || "",
89
- onChange: (newValue) => onChange({
90
- ...value,
91
- url: newValue
92
- }),
93
- suggestions
40
+ className: styles.nameField,
41
+ labelWidth: 6,
42
+ inputWidth: null,
43
+ label: "Field",
44
+ type: "text",
45
+ value: value.field,
46
+ tooltip: "Can be exact field name or a regex pattern that will match on the field name.",
47
+ onChange: handleChange("field")
94
48
  }
95
49
  ),
96
- className: css`
50
+ /* @__PURE__ */ jsx(
51
+ Button,
52
+ {
53
+ variant: "destructive",
54
+ title: "Remove field",
55
+ icon: "times",
56
+ onClick: (event) => {
57
+ event.preventDefault();
58
+ onDelete();
59
+ }
60
+ }
61
+ )
62
+ ] }),
63
+ /* @__PURE__ */ jsxs("div", { className: "gf-form", children: [
64
+ /* @__PURE__ */ jsx(
65
+ FormField,
66
+ {
67
+ className: styles.nameField,
68
+ inputWidth: null,
69
+ label: "Label",
70
+ type: "text",
71
+ value: value.label,
72
+ onChange: handleChange("label"),
73
+ tooltip: "Use to provide a meaningful label to the data matched in the regex"
74
+ }
75
+ ),
76
+ /* @__PURE__ */ jsx(
77
+ FormField,
78
+ {
79
+ className: styles.regexField,
80
+ inputWidth: null,
81
+ label: "Regex",
82
+ type: "text",
83
+ value: value.matcherRegex,
84
+ onChange: handleChange("matcherRegex"),
85
+ tooltip: "Use to parse and capture some part of the log message. You can use the captured groups in the template."
86
+ }
87
+ )
88
+ ] }),
89
+ /* @__PURE__ */ jsx("div", { className: "gf-form", children: /* @__PURE__ */ jsx(
90
+ FormField,
91
+ {
92
+ label: showInternalLink ? "Query" : "URL",
93
+ labelWidth: 6,
94
+ inputEl: /* @__PURE__ */ jsx(
95
+ DataLinkInput,
96
+ {
97
+ placeholder: showInternalLink ? "${__value.raw}" : "http://example.com/${__value.raw}",
98
+ value: value.url || "",
99
+ onChange: (newValue) => onChange({
100
+ ...value,
101
+ url: newValue
102
+ }),
103
+ suggestions
104
+ }
105
+ ),
106
+ className: css`
97
107
  width: 100%;
98
108
  `
99
- }
100
- )), /* @__PURE__ */ React__default.createElement("div", { className: styles.row }, /* @__PURE__ */ React__default.createElement(
101
- Switch,
102
- {
103
- labelClass: "width-6",
104
- label: "Internal link",
105
- checked: showInternalLink,
106
- onChange: () => {
107
- if (showInternalLink) {
108
- onChange({
109
- ...value,
110
- datasourceUid: undefined
111
- });
112
- }
113
- setShowInternalLink(!showInternalLink);
114
109
  }
115
- }
116
- ), showInternalLink && /* @__PURE__ */ React__default.createElement(
117
- DataSourcePicker,
118
- {
119
- onChange: (ds) => {
120
- onChange({
121
- ...value,
122
- datasourceUid: ds.uid
123
- });
124
- },
125
- current: value.datasourceUid
126
- }
127
- )));
110
+ ) }),
111
+ /* @__PURE__ */ jsxs("div", { className: styles.row, children: [
112
+ /* @__PURE__ */ jsx(
113
+ Switch,
114
+ {
115
+ labelClass: "width-6",
116
+ label: "Internal link",
117
+ checked: showInternalLink,
118
+ onChange: () => {
119
+ if (showInternalLink) {
120
+ onChange({
121
+ ...value,
122
+ datasourceUid: undefined
123
+ });
124
+ }
125
+ setShowInternalLink(!showInternalLink);
126
+ }
127
+ }
128
+ ),
129
+ showInternalLink && /* @__PURE__ */ jsx(
130
+ DataSourcePicker,
131
+ {
132
+ onChange: (ds) => {
133
+ onChange({
134
+ ...value,
135
+ datasourceUid: ds.uid
136
+ });
137
+ },
138
+ current: value.datasourceUid
139
+ }
140
+ )
141
+ ] })
142
+ ] });
128
143
  };
129
144
  function useInternalLink(datasourceUid) {
130
145
  const [showInternalLink, setShowInternalLink] = useState(!!datasourceUid);