@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,8 +1,11 @@
1
- import React__default, { useState, useId, useCallback } from 'react';
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useState, useId, useCallback } from 'react';
2
3
  import { useCopyToClipboard } from 'react-use';
3
4
  import '@grafana/data';
4
5
  import { ConfirmModal } from './ConfirmModal.js';
5
6
  import { DatasetSelector } from './DatasetSelector.js';
7
+ import { CatalogSelector } from './CatalogSelector.js';
8
+ import { SchemaSelector } from './SchemaSelector.js';
6
9
  import { TableSelector } from './TableSelector.js';
7
10
  import { InlineSwitch, RadioButtonGroup } from '@grafana/ui';
8
11
  import { EditorMode, QUERY_FORMAT_OPTIONS, QueryFormat } from './types.js';
@@ -23,6 +26,7 @@ function QueryHeader({
23
26
  db,
24
27
  defaultDataset,
25
28
  enableDatasets,
29
+ enableCatalogs,
26
30
  query,
27
31
  queryRowFilter,
28
32
  onChange,
@@ -36,6 +40,7 @@ function QueryHeader({
36
40
  const [showConfirm, setShowConfirm] = useState(false);
37
41
  const toRawSql = getRawSqlFn(db);
38
42
  const htmlId = useId();
43
+ const catalogsEnabled = enableCatalogs != null ? enableCatalogs : db.disableCatalogs === false;
39
44
  const onEditorModeChange = useCallback(
40
45
  (newEditorMode) => {
41
46
  if (editorMode === EditorMode.Code) {
@@ -63,6 +68,33 @@ function QueryHeader({
63
68
  };
64
69
  onChange(next);
65
70
  };
71
+ const onCatalogChange = (catalog) => {
72
+ if (catalog === query.catalog) {
73
+ return;
74
+ }
75
+ const next = {
76
+ ...query,
77
+ catalog: catalog || undefined,
78
+ schema: undefined,
79
+ table: undefined,
80
+ sql: undefined,
81
+ rawSql: ""
82
+ };
83
+ onChange(next);
84
+ };
85
+ const onSchemaChange = (schema) => {
86
+ if (schema === query.schema) {
87
+ return;
88
+ }
89
+ const next = {
90
+ ...query,
91
+ schema: schema || undefined,
92
+ table: undefined,
93
+ sql: undefined,
94
+ rawSql: ""
95
+ };
96
+ onChange(next);
97
+ };
66
98
  const onTableChange = (e) => {
67
99
  if (e.value === query.table) {
68
100
  return;
@@ -75,100 +107,145 @@ function QueryHeader({
75
107
  };
76
108
  onChange(next);
77
109
  };
78
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(EditorHeader, null, /* @__PURE__ */ React__default.createElement(
79
- InlineSelect,
80
- {
81
- label: "Format",
82
- value: query.format,
83
- placeholder: "Select format",
84
- menuShouldPortal: true,
85
- onChange: onFormatChange,
86
- options: QUERY_FORMAT_OPTIONS
87
- }
88
- ), editorMode === EditorMode.Builder && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
89
- InlineSwitch,
90
- {
91
- id: `sql-filter-${htmlId}`,
92
- label: "Filter",
93
- transparent: true,
94
- showLabel: true,
95
- value: queryRowFilter.filter,
96
- onChange: (ev) => ev.target instanceof HTMLInputElement && onQueryRowChange({ ...queryRowFilter, filter: ev.target.checked })
97
- }
98
- ), /* @__PURE__ */ React__default.createElement(
99
- InlineSwitch,
100
- {
101
- id: `sql-group-${htmlId}`,
102
- label: "Group",
103
- transparent: true,
104
- showLabel: true,
105
- value: queryRowFilter.group,
106
- onChange: (ev) => ev.target instanceof HTMLInputElement && onQueryRowChange({ ...queryRowFilter, group: ev.target.checked })
107
- }
108
- ), /* @__PURE__ */ React__default.createElement(
109
- InlineSwitch,
110
- {
111
- id: `sql-order-${htmlId}`,
112
- label: "Order",
113
- transparent: true,
114
- showLabel: true,
115
- value: queryRowFilter.order,
116
- onChange: (ev) => ev.target instanceof HTMLInputElement && onQueryRowChange({ ...queryRowFilter, order: ev.target.checked })
117
- }
118
- ), /* @__PURE__ */ React__default.createElement(
119
- InlineSwitch,
120
- {
121
- id: `sql-preview-${htmlId}`,
122
- label: "Preview",
123
- transparent: true,
124
- showLabel: true,
125
- value: queryRowFilter.preview,
126
- onChange: (ev) => ev.target instanceof HTMLInputElement && onQueryRowChange({ ...queryRowFilter, preview: ev.target.checked })
127
- }
128
- )), /* @__PURE__ */ React__default.createElement(FlexItem, { grow: 1 }), /* @__PURE__ */ React__default.createElement(RunQueryButton, { queryInvalid: !isQueryRunnable, onClick: () => onRunQuery() }), /* @__PURE__ */ React__default.createElement(RadioButtonGroup, { options: editorModes, size: "sm", value: editorMode, onChange: onEditorModeChange }), /* @__PURE__ */ React__default.createElement(
129
- ConfirmModal,
130
- {
131
- isOpen: showConfirm,
132
- onCopy: () => {
133
- setShowConfirm(false);
134
- copyToClipboard(query.rawSql);
135
- onChange({
136
- ...query,
137
- rawSql: toRawSql(query),
138
- editorMode: EditorMode.Builder
139
- });
140
- },
141
- onDiscard: () => {
142
- setShowConfirm(false);
143
- onChange({
144
- ...query,
145
- rawSql: toRawSql(query),
146
- editorMode: EditorMode.Builder
147
- });
148
- },
149
- onCancel: () => setShowConfirm(false)
150
- }
151
- )), editorMode === EditorMode.Builder && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Space, { v: 0.5 }), /* @__PURE__ */ React__default.createElement(EditorRow, null, enableDatasets === true && /* @__PURE__ */ React__default.createElement(EditorField, { label: labels.get("dataset") || "Dataset", width: 25 }, /* @__PURE__ */ React__default.createElement(
152
- DatasetSelector,
153
- {
154
- db,
155
- inputId: `sql-dataset-${htmlId}`,
156
- dataset: defaultDataset,
157
- value: query.dataset === undefined ? null : query.dataset,
158
- onChange: onDatasetChange
159
- }
160
- )), /* @__PURE__ */ React__default.createElement(EditorField, { label: "Table", width: 25 }, /* @__PURE__ */ React__default.createElement(
161
- TableSelector,
162
- {
163
- db,
164
- inputId: `sql-table-${htmlId}`,
165
- dataset: query.dataset || defaultDataset,
166
- query,
167
- value: query.table === undefined ? null : query.table,
168
- onChange: onTableChange,
169
- applyDefault: true
170
- }
171
- )))));
110
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
111
+ /* @__PURE__ */ jsxs(EditorHeader, { children: [
112
+ /* @__PURE__ */ jsx(
113
+ InlineSelect,
114
+ {
115
+ label: "Format",
116
+ value: query.format,
117
+ placeholder: "Select format",
118
+ menuShouldPortal: true,
119
+ onChange: onFormatChange,
120
+ options: QUERY_FORMAT_OPTIONS
121
+ }
122
+ ),
123
+ editorMode === EditorMode.Builder && /* @__PURE__ */ jsxs(Fragment, { children: [
124
+ /* @__PURE__ */ jsx(
125
+ InlineSwitch,
126
+ {
127
+ id: `sql-filter-${htmlId}`,
128
+ label: "Filter",
129
+ transparent: true,
130
+ showLabel: true,
131
+ value: queryRowFilter.filter,
132
+ onChange: (ev) => ev.target instanceof HTMLInputElement && onQueryRowChange({ ...queryRowFilter, filter: ev.target.checked })
133
+ }
134
+ ),
135
+ /* @__PURE__ */ jsx(
136
+ InlineSwitch,
137
+ {
138
+ id: `sql-group-${htmlId}`,
139
+ label: "Group",
140
+ transparent: true,
141
+ showLabel: true,
142
+ value: queryRowFilter.group,
143
+ onChange: (ev) => ev.target instanceof HTMLInputElement && onQueryRowChange({ ...queryRowFilter, group: ev.target.checked })
144
+ }
145
+ ),
146
+ /* @__PURE__ */ jsx(
147
+ InlineSwitch,
148
+ {
149
+ id: `sql-order-${htmlId}`,
150
+ label: "Order",
151
+ transparent: true,
152
+ showLabel: true,
153
+ value: queryRowFilter.order,
154
+ onChange: (ev) => ev.target instanceof HTMLInputElement && onQueryRowChange({ ...queryRowFilter, order: ev.target.checked })
155
+ }
156
+ ),
157
+ /* @__PURE__ */ jsx(
158
+ InlineSwitch,
159
+ {
160
+ id: `sql-preview-${htmlId}`,
161
+ label: "Preview",
162
+ transparent: true,
163
+ showLabel: true,
164
+ value: queryRowFilter.preview,
165
+ onChange: (ev) => ev.target instanceof HTMLInputElement && onQueryRowChange({ ...queryRowFilter, preview: ev.target.checked })
166
+ }
167
+ )
168
+ ] }),
169
+ /* @__PURE__ */ jsx(FlexItem, { grow: 1 }),
170
+ /* @__PURE__ */ jsx(RunQueryButton, { queryInvalid: !isQueryRunnable, onClick: () => onRunQuery() }),
171
+ /* @__PURE__ */ jsx(RadioButtonGroup, { options: editorModes, size: "sm", value: editorMode, onChange: onEditorModeChange }),
172
+ /* @__PURE__ */ jsx(
173
+ ConfirmModal,
174
+ {
175
+ isOpen: showConfirm,
176
+ onCopy: () => {
177
+ setShowConfirm(false);
178
+ copyToClipboard(query.rawSql);
179
+ onChange({
180
+ ...query,
181
+ rawSql: toRawSql(query),
182
+ editorMode: EditorMode.Builder
183
+ });
184
+ },
185
+ onDiscard: () => {
186
+ setShowConfirm(false);
187
+ onChange({
188
+ ...query,
189
+ rawSql: toRawSql(query),
190
+ editorMode: EditorMode.Builder
191
+ });
192
+ },
193
+ onCancel: () => setShowConfirm(false)
194
+ }
195
+ )
196
+ ] }),
197
+ editorMode === EditorMode.Builder && /* @__PURE__ */ jsxs(Fragment, { children: [
198
+ /* @__PURE__ */ jsx(Space, { v: 0.5 }),
199
+ /* @__PURE__ */ jsxs(EditorRow, { children: [
200
+ enableDatasets === true && !catalogsEnabled && /* @__PURE__ */ jsx(EditorField, { label: labels.get("dataset") || "Dataset", width: 25, children: /* @__PURE__ */ jsx(
201
+ DatasetSelector,
202
+ {
203
+ db,
204
+ inputId: `sql-dataset-${htmlId}`,
205
+ dataset: defaultDataset,
206
+ value: query.dataset === undefined ? null : query.dataset,
207
+ onChange: onDatasetChange
208
+ }
209
+ ) }),
210
+ catalogsEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
211
+ /* @__PURE__ */ jsx(EditorField, { label: labels.get("catalog") || "Catalog", width: 25, children: /* @__PURE__ */ jsx(
212
+ CatalogSelector,
213
+ {
214
+ db,
215
+ inputId: `sql-catalog-${htmlId}`,
216
+ value: query.catalog === undefined ? null : query.catalog,
217
+ onChange: onCatalogChange
218
+ }
219
+ ) }),
220
+ /* @__PURE__ */ jsx(EditorField, { label: labels.get("schema") || "Schema", width: 25, children: /* @__PURE__ */ jsx(
221
+ SchemaSelector,
222
+ {
223
+ db,
224
+ inputId: `sql-schema-${htmlId}`,
225
+ catalog: query.catalog,
226
+ value: query.schema === undefined ? null : query.schema,
227
+ onChange: onSchemaChange
228
+ }
229
+ ) })
230
+ ] }),
231
+ /* @__PURE__ */ jsx(EditorField, { label: "Table", width: 25, children: /* @__PURE__ */ jsx(
232
+ TableSelector,
233
+ {
234
+ db,
235
+ inputId: `sql-table-${htmlId}`,
236
+ dataset: catalogsEnabled ? undefined : query.dataset || defaultDataset,
237
+ catalog: catalogsEnabled ? query.catalog : undefined,
238
+ schema: catalogsEnabled ? query.schema : undefined,
239
+ query,
240
+ value: query.table === undefined ? null : query.table,
241
+ onChange: onTableChange,
242
+ enableCatalogs: catalogsEnabled,
243
+ applyDefault: true
244
+ }
245
+ ) })
246
+ ] })
247
+ ] })
248
+ ] });
172
249
  }
173
250
 
174
251
  export { QueryHeader };
@@ -1 +1 @@
1
- {"version":3,"file":"QueryHeader.js","sources":["../../../../src/components/QueryEditor/QueryHeader.tsx"],"sourcesContent":["import React, { useCallback, useState, useId } from 'react';\nimport { useCopyToClipboard } from 'react-use';\n\nimport { type SelectableValue } from '@grafana/data';\n\nimport { ConfirmModal } from './ConfirmModal';\nimport { DatasetSelector } from './DatasetSelector';\nimport { TableSelector } from './TableSelector';\nimport { InlineSwitch, RadioButtonGroup } from '@grafana/ui';\nimport { type QueryWithDefaults } from './defaults';\nimport { EditorField } from './EditorField';\nimport { EditorHeader } from './EditorHeader';\nimport { EditorRow } from './EditorRow';\nimport { FlexItem } from './FlexItem';\nimport { InlineSelect } from './InlineSelect';\nimport { Space } from './Space';\nimport { RunQueryButton } from './RunQueryButton';\nimport { type DB, type SQLQuery, type QueryRowFilter, EditorMode, QueryFormat, QUERY_FORMAT_OPTIONS } from './types';\nimport { getRawSqlFn } from './utils/sql.utils';\n\ninterface QueryHeaderProps {\n db: DB;\n defaultDataset: string;\n enableDatasets: boolean;\n query: QueryWithDefaults;\n onChange: (query: SQLQuery) => void;\n onRunQuery: () => void;\n onQueryRowChange: (queryRowFilter: QueryRowFilter) => void;\n queryRowFilter: QueryRowFilter;\n isQueryRunnable: boolean;\n labels?: Map<string, string>;\n}\n\nconst editorModes = [\n { label: 'Builder', value: EditorMode.Builder },\n { label: 'Code', value: EditorMode.Code },\n];\n\nexport function QueryHeader({\n db,\n defaultDataset,\n enableDatasets,\n query,\n queryRowFilter,\n onChange,\n onRunQuery,\n onQueryRowChange,\n isQueryRunnable,\n labels = new Map([['dataset', 'Dataset']]),\n}: QueryHeaderProps) {\n const { editorMode } = query;\n const [_, copyToClipboard] = useCopyToClipboard();\n const [showConfirm, setShowConfirm] = useState(false);\n const toRawSql = getRawSqlFn(db);\n const htmlId = useId();\n\n const onEditorModeChange = useCallback(\n (newEditorMode: EditorMode) => {\n if (editorMode === EditorMode.Code) {\n setShowConfirm(true);\n return;\n }\n onChange({ ...query, editorMode: newEditorMode });\n },\n [editorMode, onChange, query]\n );\n\n const onFormatChange = (e: SelectableValue) => {\n const next = { ...query, format: e.value !== undefined ? e.value : QueryFormat.Table };\n onChange(next);\n };\n\n const onDatasetChange = (e: SelectableValue) => {\n if (e.value === query.dataset) {\n return;\n }\n\n const next = {\n ...query,\n dataset: e.value,\n table: undefined,\n sql: undefined,\n rawSql: '',\n };\n\n onChange(next);\n };\n\n const onTableChange = (e: SelectableValue) => {\n if (e.value === query.table) {\n return;\n }\n\n const next: SQLQuery = {\n ...query,\n table: e.value,\n sql: undefined,\n rawSql: '',\n };\n onChange(next);\n };\n\n return (\n <>\n <EditorHeader>\n <InlineSelect\n label=\"Format\"\n value={query.format}\n placeholder=\"Select format\"\n menuShouldPortal\n onChange={onFormatChange}\n options={QUERY_FORMAT_OPTIONS}\n />\n {editorMode === EditorMode.Builder && (\n <>\n <InlineSwitch\n id={`sql-filter-${htmlId}`}\n label=\"Filter\"\n transparent={true}\n showLabel={true}\n value={queryRowFilter.filter}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement &&\n onQueryRowChange({ ...queryRowFilter, filter: ev.target.checked })\n }\n />\n\n <InlineSwitch\n id={`sql-group-${htmlId}`}\n label=\"Group\"\n transparent={true}\n showLabel={true}\n value={queryRowFilter.group}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement &&\n onQueryRowChange({ ...queryRowFilter, group: ev.target.checked })\n }\n />\n\n <InlineSwitch\n id={`sql-order-${htmlId}`}\n label=\"Order\"\n transparent={true}\n showLabel={true}\n value={queryRowFilter.order}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement &&\n onQueryRowChange({ ...queryRowFilter, order: ev.target.checked })\n }\n />\n\n <InlineSwitch\n id={`sql-preview-${htmlId}`}\n label=\"Preview\"\n transparent={true}\n showLabel={true}\n value={queryRowFilter.preview}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement &&\n onQueryRowChange({ ...queryRowFilter, preview: ev.target.checked })\n }\n />\n </>\n )}\n\n <FlexItem grow={1} />\n\n <RunQueryButton queryInvalid={!isQueryRunnable} onClick={() => onRunQuery()} />\n\n <RadioButtonGroup options={editorModes} size=\"sm\" value={editorMode} onChange={onEditorModeChange} />\n\n <ConfirmModal\n isOpen={showConfirm}\n onCopy={() => {\n setShowConfirm(false);\n copyToClipboard(query.rawSql!);\n onChange({\n ...query,\n rawSql: toRawSql(query),\n editorMode: EditorMode.Builder,\n });\n }}\n onDiscard={() => {\n setShowConfirm(false);\n onChange({\n ...query,\n rawSql: toRawSql(query),\n editorMode: EditorMode.Builder,\n });\n }}\n onCancel={() => setShowConfirm(false)}\n />\n </EditorHeader>\n\n {editorMode === EditorMode.Builder && (\n <>\n <Space v={0.5} />\n\n <EditorRow>\n {enableDatasets === true && (\n <EditorField label={labels.get('dataset') || 'Dataset'} width={25}>\n <DatasetSelector\n db={db}\n inputId={`sql-dataset-${htmlId}`}\n dataset={defaultDataset}\n value={query.dataset === undefined ? null : query.dataset}\n onChange={onDatasetChange}\n />\n </EditorField>\n )}\n\n <EditorField label=\"Table\" width={25}>\n <TableSelector\n db={db}\n inputId={`sql-table-${htmlId}`}\n dataset={query.dataset || defaultDataset}\n query={query}\n value={query.table === undefined ? null : query.table}\n onChange={onTableChange}\n applyDefault\n />\n </EditorField>\n </EditorRow>\n </>\n )}\n </>\n );\n}\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;AAiCA,MAAM,WAAc,GAAA;AAAA,EAClB,EAAE,KAAA,EAAO,SAAW,EAAA,KAAA,EAAO,WAAW,OAAQ,EAAA;AAAA,EAC9C,EAAE,KAAA,EAAO,MAAQ,EAAA,KAAA,EAAO,WAAW,IAAK;AAC1C,CAAA;AAEO,SAAS,WAAY,CAAA;AAAA,EAC1B,EAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA,uBAAa,GAAI,CAAA,CAAC,CAAC,SAAW,EAAA,SAAS,CAAC,CAAC;AAC3C,CAAqB,EAAA;AACnB,EAAM,MAAA,EAAE,YAAe,GAAA,KAAA;AACvB,EAAA,MAAM,CAAC,CAAA,EAAG,eAAe,CAAA,GAAI,kBAAmB,EAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAM,MAAA,QAAA,GAAW,YAAY,EAAE,CAAA;AAC/B,EAAA,MAAM,SAAS,KAAM,EAAA;AAErB,EAAA,MAAM,kBAAqB,GAAA,WAAA;AAAA,IACzB,CAAC,aAA8B,KAAA;AAC7B,MAAI,IAAA,UAAA,KAAe,WAAW,IAAM,EAAA;AAClC,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA;AAAA;AAEF,MAAA,QAAA,CAAS,EAAE,GAAG,KAAO,EAAA,UAAA,EAAY,eAAe,CAAA;AAAA,KAClD;AAAA,IACA,CAAC,UAAY,EAAA,QAAA,EAAU,KAAK;AAAA,GAC9B;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,CAAuB,KAAA;AAC7C,IAAM,MAAA,IAAA,GAAO,EAAE,GAAG,KAAO,EAAA,MAAA,EAAQ,CAAE,CAAA,KAAA,KAAU,SAAY,GAAA,CAAA,CAAE,KAAQ,GAAA,WAAA,CAAY,KAAM,EAAA;AACrF,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,GACf;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,CAAuB,KAAA;AAC9C,IAAI,IAAA,CAAA,CAAE,KAAU,KAAA,KAAA,CAAM,OAAS,EAAA;AAC7B,MAAA;AAAA;AAGF,IAAA,MAAM,IAAO,GAAA;AAAA,MACX,GAAG,KAAA;AAAA,MACH,SAAS,CAAE,CAAA,KAAA;AAAA,MACX,KAAO,EAAA,SAAA;AAAA,MACP,GAAK,EAAA,SAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACV;AAEA,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,GACf;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,CAAuB,KAAA;AAC5C,IAAI,IAAA,CAAA,CAAE,KAAU,KAAA,KAAA,CAAM,KAAO,EAAA;AAC3B,MAAA;AAAA;AAGF,IAAA,MAAM,IAAiB,GAAA;AAAA,MACrB,GAAG,KAAA;AAAA,MACH,OAAO,CAAE,CAAA,KAAA;AAAA,MACT,GAAK,EAAA,SAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACV;AACA,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,GACf;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,+CACG,YACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,QAAA;AAAA,MACN,OAAO,KAAM,CAAA,MAAA;AAAA,MACb,WAAY,EAAA,eAAA;AAAA,MACZ,gBAAgB,EAAA,IAAA;AAAA,MAChB,QAAU,EAAA,cAAA;AAAA,MACV,OAAS,EAAA;AAAA;AAAA,GAEV,EAAA,UAAA,KAAe,UAAW,CAAA,OAAA,oBAEvBA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,cAAc,MAAM,CAAA,CAAA;AAAA,MACxB,KAAM,EAAA,QAAA;AAAA,MACN,WAAa,EAAA,IAAA;AAAA,MACb,SAAW,EAAA,IAAA;AAAA,MACX,OAAO,cAAe,CAAA,MAAA;AAAA,MACtB,QAAU,EAAA,CAAC,EACT,KAAA,EAAA,CAAG,kBAAkB,gBACrB,IAAA,gBAAA,CAAiB,EAAE,GAAG,cAAgB,EAAA,MAAA,EAAQ,EAAG,CAAA,MAAA,CAAO,SAAS;AAAA;AAAA,GAIrE,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,aAAa,MAAM,CAAA,CAAA;AAAA,MACvB,KAAM,EAAA,OAAA;AAAA,MACN,WAAa,EAAA,IAAA;AAAA,MACb,SAAW,EAAA,IAAA;AAAA,MACX,OAAO,cAAe,CAAA,KAAA;AAAA,MACtB,QAAU,EAAA,CAAC,EACT,KAAA,EAAA,CAAG,kBAAkB,gBACrB,IAAA,gBAAA,CAAiB,EAAE,GAAG,cAAgB,EAAA,KAAA,EAAO,EAAG,CAAA,MAAA,CAAO,SAAS;AAAA;AAAA,GAIpE,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,aAAa,MAAM,CAAA,CAAA;AAAA,MACvB,KAAM,EAAA,OAAA;AAAA,MACN,WAAa,EAAA,IAAA;AAAA,MACb,SAAW,EAAA,IAAA;AAAA,MACX,OAAO,cAAe,CAAA,KAAA;AAAA,MACtB,QAAU,EAAA,CAAC,EACT,KAAA,EAAA,CAAG,kBAAkB,gBACrB,IAAA,gBAAA,CAAiB,EAAE,GAAG,cAAgB,EAAA,KAAA,EAAO,EAAG,CAAA,MAAA,CAAO,SAAS;AAAA;AAAA,GAIpE,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,eAAe,MAAM,CAAA,CAAA;AAAA,MACzB,KAAM,EAAA,SAAA;AAAA,MACN,WAAa,EAAA,IAAA;AAAA,MACb,SAAW,EAAA,IAAA;AAAA,MACX,OAAO,cAAe,CAAA,OAAA;AAAA,MACtB,QAAU,EAAA,CAAC,EACT,KAAA,EAAA,CAAG,kBAAkB,gBACrB,IAAA,gBAAA,CAAiB,EAAE,GAAG,cAAgB,EAAA,OAAA,EAAS,EAAG,CAAA,MAAA,CAAO,SAAS;AAAA;AAAA,GAGxE,CAGF,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAS,EAAA,EAAA,IAAA,EAAM,CAAG,EAAA,CAAA,kBAElBA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,YAAc,EAAA,CAAC,eAAiB,EAAA,OAAA,EAAS,MAAM,UAAA,EAAc,EAAA,CAAA,kBAE5EA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAiB,OAAS,EAAA,WAAA,EAAa,IAAK,EAAA,IAAA,EAAK,KAAO,EAAA,UAAA,EAAY,QAAU,EAAA,kBAAA,EAAoB,CAEnG,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,WAAA;AAAA,MACR,QAAQ,MAAM;AACZ,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,eAAA,CAAgB,MAAM,MAAO,CAAA;AAC7B,QAAS,QAAA,CAAA;AAAA,UACP,GAAG,KAAA;AAAA,UACH,MAAA,EAAQ,SAAS,KAAK,CAAA;AAAA,UACtB,YAAY,UAAW,CAAA;AAAA,SACxB,CAAA;AAAA,OACH;AAAA,MACA,WAAW,MAAM;AACf,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAS,QAAA,CAAA;AAAA,UACP,GAAG,KAAA;AAAA,UACH,MAAA,EAAQ,SAAS,KAAK,CAAA;AAAA,UACtB,YAAY,UAAW,CAAA;AAAA,SACxB,CAAA;AAAA,OACH;AAAA,MACA,QAAA,EAAU,MAAM,cAAA,CAAe,KAAK;AAAA;AAAA,GAExC,CAEC,EAAA,UAAA,KAAe,UAAW,CAAA,OAAA,gGAEtBA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,CAAG,EAAA,GAAA,EAAK,CAEf,kBAAAA,cAAA,CAAA,aAAA,CAAC,iBACE,cAAmB,KAAA,IAAA,oBACjBA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,KAAO,EAAA,MAAA,CAAO,IAAI,SAAS,CAAA,IAAK,SAAW,EAAA,KAAA,EAAO,EAC7D,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,OAAA,EAAS,eAAe,MAAM,CAAA,CAAA;AAAA,MAC9B,OAAS,EAAA,cAAA;AAAA,MACT,KAAO,EAAA,KAAA,CAAM,OAAY,KAAA,SAAA,GAAY,OAAO,KAAM,CAAA,OAAA;AAAA,MAClD,QAAU,EAAA;AAAA;AAAA,GAEd,CAGF,kBAAAA,cAAA,CAAA,aAAA,CAAC,eAAY,KAAM,EAAA,OAAA,EAAQ,OAAO,EAChC,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,OAAA,EAAS,aAAa,MAAM,CAAA,CAAA;AAAA,MAC5B,OAAA,EAAS,MAAM,OAAW,IAAA,cAAA;AAAA,MAC1B,KAAA;AAAA,MACA,KAAO,EAAA,KAAA,CAAM,KAAU,KAAA,SAAA,GAAY,OAAO,KAAM,CAAA,KAAA;AAAA,MAChD,QAAU,EAAA,aAAA;AAAA,MACV,YAAY,EAAA;AAAA;AAAA,GAEhB,CACF,CACF,CAEJ,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"QueryHeader.js","sources":["../../../../src/components/QueryEditor/QueryHeader.tsx"],"sourcesContent":["import { useCallback, useState, useId } from 'react';\nimport { useCopyToClipboard } from 'react-use';\n\nimport { type SelectableValue } from '@grafana/data';\n\nimport { ConfirmModal } from './ConfirmModal';\nimport { DatasetSelector } from './DatasetSelector';\nimport { CatalogSelector } from './CatalogSelector';\nimport { SchemaSelector } from './SchemaSelector';\nimport { TableSelector } from './TableSelector';\nimport { InlineSwitch, RadioButtonGroup } from '@grafana/ui';\nimport { type QueryWithDefaults } from './defaults';\nimport { EditorField } from './EditorField';\nimport { EditorHeader } from './EditorHeader';\nimport { EditorRow } from './EditorRow';\nimport { FlexItem } from './FlexItem';\nimport { InlineSelect } from './InlineSelect';\nimport { Space } from './Space';\nimport { RunQueryButton } from './RunQueryButton';\nimport { type DB, type SQLQuery, type QueryRowFilter, EditorMode, QueryFormat, QUERY_FORMAT_OPTIONS } from './types';\nimport { getRawSqlFn } from './utils/sql.utils';\n\ninterface QueryHeaderProps {\n db: DB;\n defaultDataset: string;\n enableDatasets: boolean;\n enableCatalogs?: boolean;\n query: QueryWithDefaults;\n onChange: (query: SQLQuery) => void;\n onRunQuery: () => void;\n onQueryRowChange: (queryRowFilter: QueryRowFilter) => void;\n queryRowFilter: QueryRowFilter;\n isQueryRunnable: boolean;\n labels?: Map<string, string>;\n}\n\nconst editorModes = [\n { label: 'Builder', value: EditorMode.Builder },\n { label: 'Code', value: EditorMode.Code },\n];\n\nexport function QueryHeader({\n db,\n defaultDataset,\n enableDatasets,\n enableCatalogs,\n query,\n queryRowFilter,\n onChange,\n onRunQuery,\n onQueryRowChange,\n isQueryRunnable,\n labels = new Map([['dataset', 'Dataset']]),\n}: QueryHeaderProps) {\n const { editorMode } = query;\n const [_, copyToClipboard] = useCopyToClipboard();\n const [showConfirm, setShowConfirm] = useState(false);\n const toRawSql = getRawSqlFn(db);\n const htmlId = useId();\n\n // Derive enableCatalogs from db.disableCatalogs when not explicitly provided\n // Catalogs are disabled by default (when disableCatalogs is undefined or true)\n const catalogsEnabled = enableCatalogs ?? db.disableCatalogs === false;\n\n const onEditorModeChange = useCallback(\n (newEditorMode: EditorMode) => {\n if (editorMode === EditorMode.Code) {\n setShowConfirm(true);\n return;\n }\n onChange({ ...query, editorMode: newEditorMode });\n },\n [editorMode, onChange, query]\n );\n\n const onFormatChange = (e: SelectableValue) => {\n const next = { ...query, format: e.value !== undefined ? e.value : QueryFormat.Table };\n onChange(next);\n };\n\n const onDatasetChange = (e: SelectableValue) => {\n if (e.value === query.dataset) {\n return;\n }\n\n const next = {\n ...query,\n dataset: e.value,\n table: undefined,\n sql: undefined,\n rawSql: '',\n };\n\n onChange(next);\n };\n\n const onCatalogChange = (catalog: string | null) => {\n if (catalog === query.catalog) {\n return;\n }\n\n const next: SQLQuery = {\n ...query,\n catalog: catalog || undefined,\n schema: undefined,\n table: undefined,\n sql: undefined,\n rawSql: '',\n };\n onChange(next);\n };\n\n const onSchemaChange = (schema: string | null) => {\n if (schema === query.schema) {\n return;\n }\n\n const next: SQLQuery = {\n ...query,\n schema: schema || undefined,\n table: undefined,\n sql: undefined,\n rawSql: '',\n };\n onChange(next);\n };\n\n const onTableChange = (e: SelectableValue) => {\n if (e.value === query.table) {\n return;\n }\n\n const next: SQLQuery = {\n ...query,\n table: e.value,\n sql: undefined,\n rawSql: '',\n };\n onChange(next);\n };\n\n return (\n <>\n <EditorHeader>\n <InlineSelect\n label=\"Format\"\n value={query.format}\n placeholder=\"Select format\"\n menuShouldPortal\n onChange={onFormatChange}\n options={QUERY_FORMAT_OPTIONS}\n />\n {editorMode === EditorMode.Builder && (\n <>\n <InlineSwitch\n id={`sql-filter-${htmlId}`}\n label=\"Filter\"\n transparent={true}\n showLabel={true}\n value={queryRowFilter.filter}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement &&\n onQueryRowChange({ ...queryRowFilter, filter: ev.target.checked })\n }\n />\n\n <InlineSwitch\n id={`sql-group-${htmlId}`}\n label=\"Group\"\n transparent={true}\n showLabel={true}\n value={queryRowFilter.group}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement &&\n onQueryRowChange({ ...queryRowFilter, group: ev.target.checked })\n }\n />\n\n <InlineSwitch\n id={`sql-order-${htmlId}`}\n label=\"Order\"\n transparent={true}\n showLabel={true}\n value={queryRowFilter.order}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement &&\n onQueryRowChange({ ...queryRowFilter, order: ev.target.checked })\n }\n />\n\n <InlineSwitch\n id={`sql-preview-${htmlId}`}\n label=\"Preview\"\n transparent={true}\n showLabel={true}\n value={queryRowFilter.preview}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement &&\n onQueryRowChange({ ...queryRowFilter, preview: ev.target.checked })\n }\n />\n </>\n )}\n\n <FlexItem grow={1} />\n\n <RunQueryButton queryInvalid={!isQueryRunnable} onClick={() => onRunQuery()} />\n\n <RadioButtonGroup options={editorModes} size=\"sm\" value={editorMode} onChange={onEditorModeChange} />\n\n <ConfirmModal\n isOpen={showConfirm}\n onCopy={() => {\n setShowConfirm(false);\n copyToClipboard(query.rawSql!);\n onChange({\n ...query,\n rawSql: toRawSql(query),\n editorMode: EditorMode.Builder,\n });\n }}\n onDiscard={() => {\n setShowConfirm(false);\n onChange({\n ...query,\n rawSql: toRawSql(query),\n editorMode: EditorMode.Builder,\n });\n }}\n onCancel={() => setShowConfirm(false)}\n />\n </EditorHeader>\n\n {editorMode === EditorMode.Builder && (\n <>\n <Space v={0.5} />\n\n <EditorRow>\n {enableDatasets === true && !catalogsEnabled && (\n <EditorField label={labels.get('dataset') || 'Dataset'} width={25}>\n <DatasetSelector\n db={db}\n inputId={`sql-dataset-${htmlId}`}\n dataset={defaultDataset}\n value={query.dataset === undefined ? null : query.dataset}\n onChange={onDatasetChange}\n />\n </EditorField>\n )}\n\n {catalogsEnabled && (\n <>\n <EditorField label={labels.get('catalog') || 'Catalog'} width={25}>\n <CatalogSelector\n db={db}\n inputId={`sql-catalog-${htmlId}`}\n value={query.catalog === undefined ? null : query.catalog}\n onChange={onCatalogChange}\n />\n </EditorField>\n\n <EditorField label={labels.get('schema') || 'Schema'} width={25}>\n <SchemaSelector\n db={db}\n inputId={`sql-schema-${htmlId}`}\n catalog={query.catalog}\n value={query.schema === undefined ? null : query.schema}\n onChange={onSchemaChange}\n />\n </EditorField>\n </>\n )}\n\n <EditorField label=\"Table\" width={25}>\n <TableSelector\n db={db}\n inputId={`sql-table-${htmlId}`}\n dataset={catalogsEnabled ? undefined : query.dataset || defaultDataset}\n catalog={catalogsEnabled ? query.catalog : undefined}\n schema={catalogsEnabled ? query.schema : undefined}\n query={query}\n value={query.table === undefined ? null : query.table}\n onChange={onTableChange}\n enableCatalogs={catalogsEnabled}\n applyDefault\n />\n </EditorField>\n </EditorRow>\n </>\n )}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React__default from 'react';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { Tooltip, Button } from '@grafana/ui';
3
3
 
4
4
  const RunQueryButton = ({
@@ -14,7 +14,7 @@ const RunQueryButton = ({
14
14
  if (queryRunning) {
15
15
  icon = "fa fa-spinner";
16
16
  }
17
- const RunButton = /* @__PURE__ */ React__default.createElement(
17
+ const RunButton = /* @__PURE__ */ jsx(
18
18
  Button,
19
19
  {
20
20
  "aria-label": ariaLabel,
@@ -23,18 +23,22 @@ const RunQueryButton = ({
23
23
  icon,
24
24
  disabled: disabled || queryRunning,
25
25
  onClick,
26
- "data-testid": dataTestId
27
- },
28
- "Run query"
26
+ "data-testid": dataTestId,
27
+ children: "Run query"
28
+ }
29
29
  );
30
- return queryInvalid ? /* @__PURE__ */ React__default.createElement(
30
+ return queryInvalid ? /* @__PURE__ */ jsx(
31
31
  Tooltip,
32
32
  {
33
33
  theme: "error",
34
34
  placement: "top",
35
- content: invalidQueryTooltip != null ? invalidQueryTooltip : /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, "Your query is invalid. Check below for details. ", /* @__PURE__ */ React__default.createElement("br", null), "However, you can still run this query.")
36
- },
37
- RunButton
35
+ content: invalidQueryTooltip != null ? invalidQueryTooltip : /* @__PURE__ */ jsxs(Fragment, { children: [
36
+ "Your query is invalid. Check below for details. ",
37
+ /* @__PURE__ */ jsx("br", {}),
38
+ "However, you can still run this query."
39
+ ] }),
40
+ children: RunButton
41
+ }
38
42
  ) : RunButton;
39
43
  };
40
44
 
@@ -1 +1 @@
1
- {"version":3,"file":"RunQueryButton.js","sources":["../../../../src/components/QueryEditor/RunQueryButton.tsx"],"sourcesContent":["import React from 'react';\nimport { Button, type IconName, type PopoverContent, Tooltip } from '@grafana/ui';\n\ntype RunQueryButtonProps = {\n ariaLabel?: string;\n queryInvalid?: boolean;\n invalidQueryTooltip?: PopoverContent;\n disabled?: boolean;\n queryRunning?: boolean;\n onClick: () => void;\n dataTestId?: string;\n};\n\nexport const RunQueryButton = ({\n ariaLabel = 'Query editor Run button',\n queryRunning = false,\n queryInvalid = false,\n invalidQueryTooltip,\n disabled = false,\n onClick,\n dataTestId,\n}: RunQueryButtonProps) => {\n let icon: IconName | undefined = queryInvalid ? 'exclamation-triangle' : undefined;\n if (queryRunning) {\n icon = 'fa fa-spinner';\n }\n\n const RunButton = (\n <Button\n aria-label={ariaLabel}\n size=\"sm\"\n variant=\"secondary\"\n icon={icon}\n disabled={disabled || queryRunning}\n onClick={onClick}\n data-testid={dataTestId}\n >\n Run query\n </Button>\n );\n\n return queryInvalid ? (\n <Tooltip\n theme=\"error\"\n placement=\"top\"\n content={\n invalidQueryTooltip ?? (\n <>\n Your query is invalid. Check below for details. <br />\n However, you can still run this query.\n </>\n )\n }\n >\n {RunButton}\n </Tooltip>\n ) : (\n RunButton\n );\n};\n"],"names":["React"],"mappings":";;;AAaO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,SAAY,GAAA,yBAAA;AAAA,EACZ,YAAe,GAAA,KAAA;AAAA,EACf,YAAe,GAAA,KAAA;AAAA,EACf,mBAAA;AAAA,EACA,QAAW,GAAA,KAAA;AAAA,EACX,OAAA;AAAA,EACA;AACF,CAA2B,KAAA;AACzB,EAAI,IAAA,IAAA,GAA6B,eAAe,sBAAyB,GAAA,SAAA;AACzE,EAAA,IAAI,YAAc,EAAA;AAChB,IAAO,IAAA,GAAA,eAAA;AAAA;AAGT,EAAA,MAAM,SACJ,mBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,YAAY,EAAA,SAAA;AAAA,MACZ,IAAK,EAAA,IAAA;AAAA,MACL,OAAQ,EAAA,WAAA;AAAA,MACR,IAAA;AAAA,MACA,UAAU,QAAY,IAAA,YAAA;AAAA,MACtB,OAAA;AAAA,MACA,aAAa,EAAA;AAAA,KAAA;AAAA,IACd;AAAA,GAED;AAGF,EAAA,OAAO,YACL,mBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,OAAA;AAAA,MACN,SAAU,EAAA,KAAA;AAAA,MACV,SACE,mBACE,IAAA,IAAA,GAAA,mBAAA,mBAAAA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EAAE,oEACiDA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,GAAE,wCAExD;AAAA,KAAA;AAAA,IAIH;AAAA,GAGH,GAAA,SAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"RunQueryButton.js","sources":["../../../../src/components/QueryEditor/RunQueryButton.tsx"],"sourcesContent":["import { Button, type IconName, type PopoverContent, Tooltip } from '@grafana/ui';\n\ntype RunQueryButtonProps = {\n ariaLabel?: string;\n queryInvalid?: boolean;\n invalidQueryTooltip?: PopoverContent;\n disabled?: boolean;\n queryRunning?: boolean;\n onClick: () => void;\n dataTestId?: string;\n};\n\nexport const RunQueryButton = ({\n ariaLabel = 'Query editor Run button',\n queryRunning = false,\n queryInvalid = false,\n invalidQueryTooltip,\n disabled = false,\n onClick,\n dataTestId,\n}: RunQueryButtonProps) => {\n let icon: IconName | undefined = queryInvalid ? 'exclamation-triangle' : undefined;\n if (queryRunning) {\n icon = 'fa fa-spinner';\n }\n\n const RunButton = (\n <Button\n aria-label={ariaLabel}\n size=\"sm\"\n variant=\"secondary\"\n icon={icon}\n disabled={disabled || queryRunning}\n onClick={onClick}\n data-testid={dataTestId}\n >\n Run query\n </Button>\n );\n\n return queryInvalid ? (\n <Tooltip\n theme=\"error\"\n placement=\"top\"\n content={\n invalidQueryTooltip ?? (\n <>\n Your query is invalid. Check below for details. <br />\n However, you can still run this query.\n </>\n )\n }\n >\n {RunButton}\n </Tooltip>\n ) : (\n RunButton\n );\n};\n"],"names":[],"mappings":";;;AAYO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,SAAY,GAAA,yBAAA;AAAA,EACZ,YAAe,GAAA,KAAA;AAAA,EACf,YAAe,GAAA,KAAA;AAAA,EACf,mBAAA;AAAA,EACA,QAAW,GAAA,KAAA;AAAA,EACX,OAAA;AAAA,EACA;AACF,CAA2B,KAAA;AACzB,EAAI,IAAA,IAAA,GAA6B,eAAe,sBAAyB,GAAA,SAAA;AACzE,EAAA,IAAI,YAAc,EAAA;AAChB,IAAO,IAAA,GAAA,eAAA;AAAA;AAGT,EAAA,MAAM,SACJ,mBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,YAAY,EAAA,SAAA;AAAA,MACZ,IAAK,EAAA,IAAA;AAAA,MACL,OAAQ,EAAA,WAAA;AAAA,MACR,IAAA;AAAA,MACA,UAAU,QAAY,IAAA,YAAA;AAAA,MACtB,OAAA;AAAA,MACA,aAAa,EAAA,UAAA;AAAA,MACd,QAAA,EAAA;AAAA;AAAA,GAED;AAGF,EAAA,OAAO,YACL,mBAAA,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,OAAA;AAAA,MACN,SAAU,EAAA,KAAA;AAAA,MACV,OAAA,EACE,oEACI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,kDAAA;AAAA,4BACiD,IAAG,EAAA,EAAA,CAAA;AAAA,QAAE;AAAA,OAExD,EAAA,CAAA;AAAA,MAIH,QAAA,EAAA;AAAA;AAAA,GAGH,GAAA,SAAA;AAEJ;;;;"}
@@ -0,0 +1,56 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useCallback, useEffect } from 'react';
3
+ import { Select } from '@grafana/ui';
4
+ import '@grafana/data';
5
+ import './types.js';
6
+
7
+ const SchemaSelector = ({ db, inputId, catalog, value, onChange }) => {
8
+ const [schemas, setSchemas] = useState([]);
9
+ const [isLoading, setIsLoading] = useState(false);
10
+ const loadSchemas = useCallback(async () => {
11
+ if (!db.schemas || !catalog) {
12
+ setSchemas([]);
13
+ return;
14
+ }
15
+ setIsLoading(true);
16
+ try {
17
+ const schemaList = await db.schemas(catalog);
18
+ const schemaOptions = schemaList.map((schema) => ({
19
+ label: schema,
20
+ value: schema
21
+ }));
22
+ setSchemas(schemaOptions);
23
+ } catch (error) {
24
+ console.error("Error loading schemas:", error);
25
+ setSchemas([]);
26
+ } finally {
27
+ setIsLoading(false);
28
+ }
29
+ }, [db, catalog]);
30
+ useEffect(() => {
31
+ loadSchemas();
32
+ }, [db, catalog, loadSchemas]);
33
+ const handleChange = (selectable) => {
34
+ onChange((selectable == null ? undefined : selectable.value) || null);
35
+ };
36
+ const selectedValue = schemas.find((schema) => schema.value === value) || null;
37
+ const isDisabled = isLoading || !catalog;
38
+ return /* @__PURE__ */ jsx(
39
+ Select,
40
+ {
41
+ inputId,
42
+ options: schemas,
43
+ value: selectedValue,
44
+ onChange: handleChange,
45
+ isLoading,
46
+ placeholder: "Select schema",
47
+ isClearable: true,
48
+ allowCustomValue: true,
49
+ disabled: isDisabled,
50
+ menuShouldPortal: true
51
+ }
52
+ );
53
+ };
54
+
55
+ export { SchemaSelector };
56
+ //# sourceMappingURL=SchemaSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaSelector.js","sources":["../../../../src/components/QueryEditor/SchemaSelector.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { Select } from '@grafana/ui';\nimport { type SelectableValue } from '@grafana/data';\nimport { type DB } from './types';\n\nexport interface SchemaSelectorProps {\n db: DB;\n inputId?: string;\n catalog?: string;\n value: string | null;\n onChange: (schema: string | null) => void;\n}\n\nexport const SchemaSelector = ({ db, inputId, catalog, value, onChange }: SchemaSelectorProps) => {\n const [schemas, setSchemas] = useState<Array<SelectableValue<string>>>([]);\n const [isLoading, setIsLoading] = useState(false);\n\n const loadSchemas = useCallback(async () => {\n if (!db.schemas || !catalog) {\n setSchemas([]);\n return;\n }\n\n setIsLoading(true);\n try {\n const schemaList = await db.schemas(catalog);\n const schemaOptions = schemaList.map((schema: string) => ({\n label: schema,\n value: schema,\n }));\n setSchemas(schemaOptions);\n } catch (error) {\n console.error('Error loading schemas:', error);\n setSchemas([]);\n } finally {\n setIsLoading(false);\n }\n }, [db, catalog]);\n\n useEffect(() => {\n loadSchemas();\n }, [db, catalog, loadSchemas]);\n\n const handleChange = (selectable: SelectableValue<string>) => {\n onChange(selectable?.value || null);\n };\n\n const selectedValue = schemas.find((schema) => schema.value === value) || null;\n\n const isDisabled = isLoading || !catalog;\n\n return (\n <Select\n inputId={inputId}\n options={schemas}\n value={selectedValue}\n onChange={handleChange}\n isLoading={isLoading}\n placeholder=\"Select schema\"\n isClearable\n allowCustomValue\n disabled={isDisabled}\n menuShouldPortal={true}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AAaa,MAAA,cAAA,GAAiB,CAAC,EAAE,EAAA,EAAI,SAAS,OAAS,EAAA,KAAA,EAAO,UAAoC,KAAA;AAChG,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAyC,EAAE,CAAA;AACzE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAM,MAAA,WAAA,GAAc,YAAY,YAAY;AAC1C,IAAA,IAAI,CAAC,EAAA,CAAG,OAAW,IAAA,CAAC,OAAS,EAAA;AAC3B,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA;AAAA;AAGF,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAI,IAAA;AACF,MAAA,MAAM,UAAa,GAAA,MAAM,EAAG,CAAA,OAAA,CAAQ,OAAO,CAAA;AAC3C,MAAA,MAAM,aAAgB,GAAA,UAAA,CAAW,GAAI,CAAA,CAAC,MAAoB,MAAA;AAAA,QACxD,KAAO,EAAA,MAAA;AAAA,QACP,KAAO,EAAA;AAAA,OACP,CAAA,CAAA;AACF,MAAA,UAAA,CAAW,aAAa,CAAA;AAAA,aACjB,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,UAAA,CAAW,EAAE,CAAA;AAAA,KACb,SAAA;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA;AACpB,GACC,EAAA,CAAC,EAAI,EAAA,OAAO,CAAC,CAAA;AAEhB,EAAA,SAAA,CAAU,MAAM;AACd,IAAY,WAAA,EAAA;AAAA,GACX,EAAA,CAAC,EAAI,EAAA,OAAA,EAAS,WAAW,CAAC,CAAA;AAE7B,EAAM,MAAA,YAAA,GAAe,CAAC,UAAwC,KAAA;AAC5D,IAAS,QAAA,CAAA,CAAA,UAAA,IAAA,IAAA,GAAA,SAAA,GAAA,UAAA,CAAY,UAAS,IAAI,CAAA;AAAA,GACpC;AAEA,EAAM,MAAA,aAAA,GAAgB,QAAQ,IAAK,CAAA,CAAC,WAAW,MAAO,CAAA,KAAA,KAAU,KAAK,CAAK,IAAA,IAAA;AAE1E,EAAM,MAAA,UAAA,GAAa,aAAa,CAAC,OAAA;AAEjC,EACE,uBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,OAAS,EAAA,OAAA;AAAA,MACT,KAAO,EAAA,aAAA;AAAA,MACP,QAAU,EAAA,YAAA;AAAA,MACV,SAAA;AAAA,MACA,WAAY,EAAA,eAAA;AAAA,MACZ,WAAW,EAAA,IAAA;AAAA,MACX,gBAAgB,EAAA,IAAA;AAAA,MAChB,QAAU,EAAA,UAAA;AAAA,MACV,gBAAkB,EAAA;AAAA;AAAA,GACpB;AAEJ;;;;"}
@@ -1,12 +1,12 @@
1
+ import { jsx } from 'react/jsx-runtime';
1
2
  import { css, cx } from '@emotion/css';
2
- import React__default from 'react';
3
3
  import '@grafana/data';
4
4
  import { stylesFactory, useTheme2 } from '@grafana/ui';
5
5
 
6
6
  const Space = (props) => {
7
7
  const theme = useTheme2();
8
8
  const styles = getStyles(theme, props);
9
- return /* @__PURE__ */ React__default.createElement("span", { className: cx(styles.wrapper) });
9
+ return /* @__PURE__ */ jsx("span", { className: cx(styles.wrapper) });
10
10
  };
11
11
  Space.defaultProps = {
12
12
  v: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"Space.js","sources":["../../../../src/components/QueryEditor/Space.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2, stylesFactory } from '@grafana/ui';\n\nexport interface SpaceProps {\n v?: number;\n h?: number;\n layout?: 'block' | 'inline';\n}\n\nexport const Space = (props: SpaceProps) => {\n const theme = useTheme2();\n const styles = getStyles(theme, props);\n\n return <span className={cx(styles.wrapper)} />;\n};\n\nSpace.defaultProps = {\n v: 0,\n h: 0,\n layout: 'block',\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, props: SpaceProps) => ({\n wrapper: css([\n {\n paddingRight: theme.spacing(props.h ?? 0),\n paddingBottom: theme.spacing(props.v ?? 0),\n },\n props.layout === 'inline' && {\n display: 'inline-block',\n },\n props.layout === 'block' && {\n display: 'block',\n },\n ]),\n}));\n"],"names":[],"mappings":";;;;;AAYa,MAAA,KAAA,GAAQ,CAAC,KAAsB,KAAA;AAC1C,EAAA,MAAM,QAAQ,SAAU,EAAA;AACxB,EAAM,MAAA,MAAA,GAAS,SAAU,CAAA,KAAA,EAAO,KAAK,CAAA;AAErC,EAAA,oDAAQ,MAAK,EAAA,EAAA,SAAA,EAAW,EAAG,CAAA,MAAA,CAAO,OAAO,CAAG,EAAA,CAAA;AAC9C;AAEA,KAAA,CAAM,YAAe,GAAA;AAAA,EACnB,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,MAAQ,EAAA;AACV,CAAA;AAEA,MAAM,SAAY,GAAA,aAAA,CAAc,CAAC,KAAA,EAAsB,KAAmB,KAAA;AAzB1E,EAAA,IAAA,EAAA,EAAA,EAAA;AAyB8E,EAAA,OAAA;AAAA,IAC5E,SAAS,GAAI,CAAA;AAAA,MACX;AAAA,QACE,cAAc,KAAM,CAAA,OAAA,CAAA,CAAQ,EAAM,GAAA,KAAA,CAAA,CAAA,KAAN,YAAW,CAAC,CAAA;AAAA,QACxC,eAAe,KAAM,CAAA,OAAA,CAAA,CAAQ,EAAM,GAAA,KAAA,CAAA,CAAA,KAAN,YAAW,CAAC;AAAA,OAC3C;AAAA,MACA,KAAA,CAAM,WAAW,QAAY,IAAA;AAAA,QAC3B,OAAS,EAAA;AAAA,OACX;AAAA,MACA,KAAA,CAAM,WAAW,OAAW,IAAA;AAAA,QAC1B,OAAS,EAAA;AAAA;AACX,KACD;AAAA,GACH;AAAA,CAAE,CAAA;;;;"}
1
+ {"version":3,"file":"Space.js","sources":["../../../../src/components/QueryEditor/Space.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2, stylesFactory } from '@grafana/ui';\n\nexport interface SpaceProps {\n v?: number;\n h?: number;\n layout?: 'block' | 'inline';\n}\n\nexport const Space = (props: SpaceProps) => {\n const theme = useTheme2();\n const styles = getStyles(theme, props);\n\n return <span className={cx(styles.wrapper)} />;\n};\n\nSpace.defaultProps = {\n v: 0,\n h: 0,\n layout: 'block',\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, props: SpaceProps) => ({\n wrapper: css([\n {\n paddingRight: theme.spacing(props.h ?? 0),\n paddingBottom: theme.spacing(props.v ?? 0),\n },\n props.layout === 'inline' && {\n display: 'inline-block',\n },\n props.layout === 'block' && {\n display: 'block',\n },\n ]),\n}));\n"],"names":[],"mappings":";;;;;AAWa,MAAA,KAAA,GAAQ,CAAC,KAAsB,KAAA;AAC1C,EAAA,MAAM,QAAQ,SAAU,EAAA;AACxB,EAAM,MAAA,MAAA,GAAS,SAAU,CAAA,KAAA,EAAO,KAAK,CAAA;AAErC,EAAA,2BAAQ,MAAK,EAAA,EAAA,SAAA,EAAW,EAAG,CAAA,MAAA,CAAO,OAAO,CAAG,EAAA,CAAA;AAC9C;AAEA,KAAA,CAAM,YAAe,GAAA;AAAA,EACnB,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,MAAQ,EAAA;AACV,CAAA;AAEA,MAAM,SAAY,GAAA,aAAA,CAAc,CAAC,KAAA,EAAsB,KAAmB,KAAA;AAxB1E,EAAA,IAAA,EAAA,EAAA,EAAA;AAwB8E,EAAA,OAAA;AAAA,IAC5E,SAAS,GAAI,CAAA;AAAA,MACX;AAAA,QACE,cAAc,KAAM,CAAA,OAAA,CAAA,CAAQ,EAAM,GAAA,KAAA,CAAA,CAAA,KAAN,YAAW,CAAC,CAAA;AAAA,QACxC,eAAe,KAAM,CAAA,OAAA,CAAA,CAAQ,EAAM,GAAA,KAAA,CAAA,CAAA,KAAN,YAAW,CAAC;AAAA,OAC3C;AAAA,MACA,KAAA,CAAM,WAAW,QAAY,IAAA;AAAA,QAC3B,OAAS,EAAA;AAAA,OACX;AAAA,MACA,KAAA,CAAM,WAAW,OAAW,IAAA;AAAA,QAC1B,OAAS,EAAA;AAAA;AACX,KACD;AAAA,GACH;AAAA,CAAE,CAAA;;;;"}
@@ -1,24 +1,38 @@
1
- import React__default from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { useAsync } from 'react-use';
3
3
  import { toOption } from '@grafana/data';
4
4
  import { Select } from '@grafana/ui';
5
5
  import './types.js';
6
6
  import 'lodash';
7
7
 
8
- const TableSelector = ({ db, dataset, value, className, onChange, inputId }) => {
8
+ const TableSelector = ({
9
+ db,
10
+ dataset,
11
+ catalog,
12
+ schema,
13
+ value,
14
+ className,
15
+ onChange,
16
+ inputId,
17
+ enableCatalogs
18
+ }) => {
9
19
  const state = useAsync(async () => {
10
- if (!dataset) {
20
+ if (!dataset && !catalog) {
11
21
  return [];
12
22
  }
13
- const tables = await db.tables(dataset);
23
+ if (enableCatalogs && (!catalog || !schema)) {
24
+ return [];
25
+ }
26
+ const tables = await db.tables(dataset, catalog, schema);
14
27
  return tables.map(toOption);
15
- }, [dataset]);
16
- return /* @__PURE__ */ React__default.createElement(
28
+ }, [dataset, catalog, schema, enableCatalogs]);
29
+ const isDisabled = state.loading || enableCatalogs && (!catalog || !schema);
30
+ return /* @__PURE__ */ jsx(
17
31
  Select,
18
32
  {
19
33
  inputId,
20
34
  className,
21
- disabled: state.loading,
35
+ disabled: isDisabled,
22
36
  "aria-label": "Table selector",
23
37
  value,
24
38
  options: state.value,
@@ -1 +1 @@
1
- {"version":3,"file":"TableSelector.js","sources":["../../../../src/components/QueryEditor/TableSelector.tsx"],"sourcesContent":["import React from 'react';\nimport { useAsync } from 'react-use';\n\nimport { type SelectableValue, toOption } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport { type DB, type ResourceSelectorProps } from './types';\nimport { type QueryWithDefaults } from './defaults';\n\ninterface TableSelectorProps extends ResourceSelectorProps {\n db: DB;\n dataset: string;\n value: string | null;\n query: QueryWithDefaults;\n onChange: (v: SelectableValue) => void;\n inputId?: string;\n}\n\nexport const TableSelector = ({ db, dataset, value, className, onChange, inputId }: TableSelectorProps) => {\n const state = useAsync(async () => {\n if (!dataset) {\n return [];\n }\n\n const tables = await db.tables(dataset);\n return tables.map(toOption);\n }, [dataset]);\n\n return (\n <Select\n inputId={inputId}\n className={className}\n disabled={state.loading}\n aria-label=\"Table selector\"\n value={value}\n options={state.value}\n onChange={onChange}\n isLoading={state.loading}\n menuShouldPortal={true}\n placeholder={state.loading ? 'Loading tables' : 'Select table'}\n />\n );\n};\n"],"names":["React"],"mappings":";;;;;;;AAiBa,MAAA,aAAA,GAAgB,CAAC,EAAE,EAAA,EAAI,SAAS,KAAO,EAAA,SAAA,EAAW,QAAU,EAAA,OAAA,EAAkC,KAAA;AACzG,EAAM,MAAA,KAAA,GAAQ,SAAS,YAAY;AACjC,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAO,EAAC;AAAA;AAGV,IAAA,MAAM,MAAS,GAAA,MAAM,EAAG,CAAA,MAAA,CAAO,OAAO,CAAA;AACtC,IAAO,OAAA,MAAA,CAAO,IAAI,QAAQ,CAAA;AAAA,GAC5B,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAU,KAAM,CAAA,OAAA;AAAA,MAChB,YAAW,EAAA,gBAAA;AAAA,MACX,KAAA;AAAA,MACA,SAAS,KAAM,CAAA,KAAA;AAAA,MACf,QAAA;AAAA,MACA,WAAW,KAAM,CAAA,OAAA;AAAA,MACjB,gBAAkB,EAAA,IAAA;AAAA,MAClB,WAAA,EAAa,KAAM,CAAA,OAAA,GAAU,gBAAmB,GAAA;AAAA;AAAA,GAClD;AAEJ;;;;"}
1
+ {"version":3,"file":"TableSelector.js","sources":["../../../../src/components/QueryEditor/TableSelector.tsx"],"sourcesContent":["import { useAsync } from 'react-use';\n\nimport { type SelectableValue, toOption } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport { type DB, type ResourceSelectorProps } from './types';\nimport { type QueryWithDefaults } from './defaults';\n\ninterface TableSelectorProps extends ResourceSelectorProps {\n db: DB;\n dataset?: string;\n catalog?: string;\n schema?: string;\n value: string | null;\n query: QueryWithDefaults;\n onChange: (v: SelectableValue) => void;\n inputId?: string;\n enableCatalogs?: boolean;\n}\n\nexport const TableSelector = ({\n db,\n dataset,\n catalog,\n schema,\n value,\n className,\n onChange,\n inputId,\n enableCatalogs,\n}: TableSelectorProps) => {\n const state = useAsync(async () => {\n if (!dataset && !catalog) {\n return [];\n }\n\n // When catalogs are enabled, we need both catalog and schema to load tables\n if (enableCatalogs && (!catalog || !schema)) {\n return [];\n }\n\n const tables = await db.tables(dataset, catalog, schema);\n return tables.map(toOption);\n }, [dataset, catalog, schema, enableCatalogs]);\n\n // Determine if the selector should be disabled\n const isDisabled = state.loading || (enableCatalogs && (!catalog || !schema));\n\n return (\n <Select\n inputId={inputId}\n className={className}\n disabled={isDisabled}\n aria-label=\"Table selector\"\n value={value}\n options={state.value}\n onChange={onChange}\n isLoading={state.loading}\n menuShouldPortal={true}\n placeholder={state.loading ? 'Loading tables' : 'Select table'}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAmBO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,EAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAA0B,KAAA;AACxB,EAAM,MAAA,KAAA,GAAQ,SAAS,YAAY;AACjC,IAAI,IAAA,CAAC,OAAW,IAAA,CAAC,OAAS,EAAA;AACxB,MAAA,OAAO,EAAC;AAAA;AAIV,IAAA,IAAI,cAAmB,KAAA,CAAC,OAAW,IAAA,CAAC,MAAS,CAAA,EAAA;AAC3C,MAAA,OAAO,EAAC;AAAA;AAGV,IAAA,MAAM,SAAS,MAAM,EAAA,CAAG,MAAO,CAAA,OAAA,EAAS,SAAS,MAAM,CAAA;AACvD,IAAO,OAAA,MAAA,CAAO,IAAI,QAAQ,CAAA;AAAA,KACzB,CAAC,OAAA,EAAS,OAAS,EAAA,MAAA,EAAQ,cAAc,CAAC,CAAA;AAG7C,EAAA,MAAM,aAAa,KAAM,CAAA,OAAA,IAAY,cAAmB,KAAA,CAAC,WAAW,CAAC,MAAA,CAAA;AAErE,EACE,uBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAU,EAAA,UAAA;AAAA,MACV,YAAW,EAAA,gBAAA;AAAA,MACX,KAAA;AAAA,MACA,SAAS,KAAM,CAAA,KAAA;AAAA,MACf,QAAA;AAAA,MACA,WAAW,KAAM,CAAA,OAAA;AAAA,MACjB,gBAAkB,EAAA,IAAA;AAAA,MAClB,WAAA,EAAa,KAAM,CAAA,OAAA,GAAU,gBAAmB,GAAA;AAAA;AAAA,GAClD;AAEJ;;;;"}
@@ -1,4 +1,5 @@
1
- import React__default, { useRef, useEffect, useCallback } from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useRef, useEffect, useCallback } from 'react';
2
3
  import '../types.js';
3
4
  import { formatSQL } from '../utils/formatSQL.js';
4
5
  import { SQLEditor } from '../../SQLEditor/components/SQLEditor.js';
@@ -23,16 +24,16 @@ function QueryEditorRaw({ children, onChange, query, width, height, completionPr
23
24
  },
24
25
  [onChange]
25
26
  );
26
- return /* @__PURE__ */ React__default.createElement(
27
+ return /* @__PURE__ */ jsx(
27
28
  SQLEditor,
28
29
  {
29
30
  width,
30
31
  height,
31
32
  query: query.rawSql,
32
33
  onChange: onRawQueryChange,
33
- language: { id: "sql", completionProvider, formatter: formatSQL }
34
- },
35
- children
34
+ language: { id: "sql", completionProvider, formatter: formatSQL },
35
+ children
36
+ }
36
37
  );
37
38
  }
38
39
 
@@ -1 +1 @@
1
- {"version":3,"file":"QueryEditorRaw.js","sources":["../../../../../src/components/QueryEditor/query-editor-raw/QueryEditorRaw.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\n\nimport { type SQLQuery } from '../types';\n\nimport { formatSQL } from '../utils/formatSQL';\nimport { type LanguageCompletionProvider, SQLEditor } from '../../SQLEditor';\n\ntype Props = {\n query: SQLQuery;\n onChange: (value: SQLQuery, processQuery: boolean) => void;\n children?: (props: { formatQuery: () => void }) => React.ReactNode;\n width?: number;\n height?: number;\n completionProvider: LanguageCompletionProvider;\n};\n\nexport function QueryEditorRaw({ children, onChange, query, width, height, completionProvider }: Props) {\n // We need to pass query via ref to SQLEditor as onChange is executed via monacoEditor.onDidChangeModelContent callback, not onChange property\n const queryRef = useRef<SQLQuery>(query);\n useEffect(() => {\n queryRef.current = query;\n }, [query]);\n\n const onRawQueryChange = useCallback(\n (rawSql: string, processQuery: boolean) => {\n const newQuery = {\n ...queryRef.current,\n rawQuery: true,\n rawSql,\n };\n onChange(newQuery, processQuery);\n },\n [onChange]\n );\n\n return (\n <SQLEditor\n width={width}\n height={height}\n query={query.rawSql!}\n onChange={onRawQueryChange}\n language={{ id: 'sql', completionProvider, formatter: formatSQL }}\n >\n {children}\n </SQLEditor>\n );\n}\n"],"names":["React"],"mappings":";;;;;;;;;AAgBgB,SAAA,cAAA,CAAe,EAAE,QAAU,EAAA,QAAA,EAAU,OAAO,KAAO,EAAA,MAAA,EAAQ,oBAA6B,EAAA;AAEtG,EAAM,MAAA,QAAA,GAAW,OAAiB,KAAK,CAAA;AACvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAU,GAAA,KAAA;AAAA,GACrB,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CAAC,QAAgB,YAA0B,KAAA;AACzC,MAAA,MAAM,QAAW,GAAA;AAAA,QACf,GAAG,QAAS,CAAA,OAAA;AAAA,QACZ,QAAU,EAAA,IAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,QAAA,CAAS,UAAU,YAAY,CAAA;AAAA,KACjC;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAO,KAAM,CAAA,MAAA;AAAA,MACb,QAAU,EAAA,gBAAA;AAAA,MACV,UAAU,EAAE,EAAA,EAAI,KAAO,EAAA,kBAAA,EAAoB,WAAW,SAAU;AAAA,KAAA;AAAA,IAE/D;AAAA,GACH;AAEJ;;;;"}
1
+ {"version":3,"file":"QueryEditorRaw.js","sources":["../../../../../src/components/QueryEditor/query-editor-raw/QueryEditorRaw.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { type SQLQuery } from '../types';\n\nimport { formatSQL } from '../utils/formatSQL';\nimport { type LanguageCompletionProvider, SQLEditor } from '../../SQLEditor';\n\ntype Props = {\n query: SQLQuery;\n onChange: (value: SQLQuery, processQuery: boolean) => void;\n children?: (props: { formatQuery: () => void }) => React.ReactNode;\n width?: number;\n height?: number;\n completionProvider: LanguageCompletionProvider;\n};\n\nexport function QueryEditorRaw({ children, onChange, query, width, height, completionProvider }: Props) {\n // We need to pass query via ref to SQLEditor as onChange is executed via monacoEditor.onDidChangeModelContent callback, not onChange property\n const queryRef = useRef<SQLQuery>(query);\n useEffect(() => {\n queryRef.current = query;\n }, [query]);\n\n const onRawQueryChange = useCallback(\n (rawSql: string, processQuery: boolean) => {\n const newQuery = {\n ...queryRef.current,\n rawQuery: true,\n rawSql,\n };\n onChange(newQuery, processQuery);\n },\n [onChange]\n );\n\n return (\n <SQLEditor\n width={width}\n height={height}\n query={query.rawSql!}\n onChange={onRawQueryChange}\n language={{ id: 'sql', completionProvider, formatter: formatSQL }}\n >\n {children}\n </SQLEditor>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAgBgB,SAAA,cAAA,CAAe,EAAE,QAAU,EAAA,QAAA,EAAU,OAAO,KAAO,EAAA,MAAA,EAAQ,oBAA6B,EAAA;AAEtG,EAAM,MAAA,QAAA,GAAW,OAAiB,KAAK,CAAA;AACvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAU,GAAA,KAAA;AAAA,GACrB,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CAAC,QAAgB,YAA0B,KAAA;AACzC,MAAA,MAAM,QAAW,GAAA;AAAA,QACf,GAAG,QAAS,CAAA,OAAA;AAAA,QACZ,QAAU,EAAA,IAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,QAAA,CAAS,UAAU,YAAY,CAAA;AAAA,KACjC;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAO,KAAM,CAAA,MAAA;AAAA,MACb,QAAU,EAAA,gBAAA;AAAA,MACV,UAAU,EAAE,EAAA,EAAI,KAAO,EAAA,kBAAA,EAAoB,WAAW,SAAU,EAAA;AAAA,MAE/D;AAAA;AAAA,GACH;AAEJ;;;;"}