@grafana/plugin-ui 0.17.0 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +13105 -7657
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +852 -542
- package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js +3 -3
- package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js.map +1 -1
- package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +23 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js +27 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +61 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/WizardLayout.js +89 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/WizardLayout.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js +75 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js +262 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js +354 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/formInterpreter.js +93 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/formInterpreter.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js +254 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js +106 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js +52 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js +32 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FieldInput.js +110 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FieldInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +112 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js +140 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +201 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PrimitiveInputs.js +103 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PrimitiveInputs.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js +72 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +94 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/fieldUtils.js +138 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/fieldUtils.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/layoutParts.js +82 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/layoutParts.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js +30 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js +128 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js.map +1 -0
- package/dist/esm/components/DataLinks/DataLink.js +2 -2
- package/dist/esm/components/DataLinks/DataLinks.js +2 -2
- package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +7 -7
- package/dist/esm/components/DatePicker/styles.js +2 -2
- package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
- package/dist/esm/components/QueryEditor/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
- package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
- package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
- package/dist/esm/components/QueryEditor/Space.js +2 -2
- package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +2 -2
- package/dist/esm/components/SQLEditor/utils/LinkedToken.js +8 -8
- package/dist/esm/datasource/SqlDatasource.js +11 -11
- package/dist/esm/index.d.ts +852 -542
- package/dist/esm/index.js +9 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/immutable/dist/immutable.es.js +11 -11
- package/dist/esm/node_modules/immutable/dist/immutable.es.js.map +1 -1
- package/dist/esm/node_modules/react-hook-form/dist/index.esm.js +2798 -0
- package/dist/esm/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
- package/dist/esm/node_modules/rxjs/dist/esm5/internal/util/isFunction.js +2 -2
- package/dist/esm/node_modules/rxjs/dist/esm5/internal/util/isFunction.js.map +1 -1
- package/dist/esm/schema/utils/dsconfig.js +97 -0
- package/dist/esm/schema/utils/dsconfig.js.map +1 -0
- package/dist/esm/schema/utils/llm.js +54 -0
- package/dist/esm/schema/utils/llm.js.map +1 -0
- package/dist/esm/schema/utils/provisioning.js +2 -2
- package/dist/esm/schema/utils/provisioning.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { parseDependsOn, formKey, evaluateDependsOn, getWatchedValue } from '../config.js';
|
|
2
|
+
import { evaluateCelExpression } from '../cel.js';
|
|
3
|
+
import { SECURE_FIELD_CONFIGURED } from '../datasource.js';
|
|
4
|
+
|
|
5
|
+
function evaluateEffectCondition(when, fieldValue) {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
const m = when.match(/^value\s*(==|!=)\s*(?:'([^']*)'|"([^"]*)"|(.+))$/);
|
|
8
|
+
if (!m) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
const op = m[1];
|
|
12
|
+
let target = (_b = (_a = m[2]) != null ? _a : m[3]) != null ? _b : m[4];
|
|
13
|
+
if (target === "true") {
|
|
14
|
+
target = true;
|
|
15
|
+
} else if (target === "false") {
|
|
16
|
+
target = false;
|
|
17
|
+
} else if (typeof target === "string" && /^-?\d+(\.\d+)?$/.test(target)) {
|
|
18
|
+
target = Number(target);
|
|
19
|
+
}
|
|
20
|
+
const eq = String(fieldValue) === String(target);
|
|
21
|
+
return op === "==" ? eq : !eq;
|
|
22
|
+
}
|
|
23
|
+
function isFieldRequired(field, watchedValues, fieldById, celContext) {
|
|
24
|
+
if (field.required) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
if (field.requiredWhen) {
|
|
28
|
+
if (celContext) {
|
|
29
|
+
return evaluateCelExpression(field.requiredWhen, celContext);
|
|
30
|
+
}
|
|
31
|
+
const parsed = parseDependsOn(field.requiredWhen);
|
|
32
|
+
if (parsed) {
|
|
33
|
+
const depField = fieldById.get(parsed.field);
|
|
34
|
+
const depKey = depField ? formKey(depField) : parsed.field;
|
|
35
|
+
return evaluateDependsOn(parsed, getWatchedValue(watchedValues, depKey));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
function buildValidationRules(field, required) {
|
|
41
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
42
|
+
const rules = {};
|
|
43
|
+
const label = (_a = field.label) != null ? _a : field.key;
|
|
44
|
+
if (required) {
|
|
45
|
+
if (field.target === "secureJsonData") {
|
|
46
|
+
rules.validate = (value) => {
|
|
47
|
+
if (value === SECURE_FIELD_CONFIGURED) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
if (!value || value === "") {
|
|
51
|
+
return `${label} is required`;
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
};
|
|
55
|
+
} else {
|
|
56
|
+
rules.required = `${label} is required`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (field.valueType === "array" && ((_b = field.item) == null ? void 0 : _b.valueType) === "object" && ((_c = field.item.fields) == null ? void 0 : _c.length)) {
|
|
60
|
+
const requiredItemFields = field.item.fields.filter((f) => f.required);
|
|
61
|
+
if (requiredItemFields.length > 0) {
|
|
62
|
+
const existingValidate = rules.validate;
|
|
63
|
+
rules.validate = (value) => {
|
|
64
|
+
var _a2;
|
|
65
|
+
if (existingValidate) {
|
|
66
|
+
const r = existingValidate(value);
|
|
67
|
+
if (r !== true) {
|
|
68
|
+
return r;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!Array.isArray(value)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
const itemErrors = {};
|
|
75
|
+
for (let i = 0; i < value.length; i++) {
|
|
76
|
+
const item = value[i];
|
|
77
|
+
const missing = [];
|
|
78
|
+
for (const rf of requiredItemFields) {
|
|
79
|
+
const v = item[rf.key];
|
|
80
|
+
if (v === void 0 || v === null || v === "") {
|
|
81
|
+
missing.push((_a2 = rf.label) != null ? _a2 : rf.key);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (missing.length > 0) {
|
|
85
|
+
itemErrors[i] = `${missing.join(", ")} required`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (Object.keys(itemErrors).length === 0) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
return `__ITEM_ERRORS__${JSON.stringify(itemErrors)}`;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (field.validations) {
|
|
96
|
+
for (const v of field.validations) {
|
|
97
|
+
switch (v.type) {
|
|
98
|
+
case "pattern":
|
|
99
|
+
rules.pattern = {
|
|
100
|
+
value: new RegExp(v.pattern),
|
|
101
|
+
message: (_d = v.message) != null ? _d : `Invalid ${label}`
|
|
102
|
+
};
|
|
103
|
+
break;
|
|
104
|
+
case "range":
|
|
105
|
+
if (v.min !== void 0) {
|
|
106
|
+
rules.min = { value: v.min, message: (_e = v.message) != null ? _e : `Minimum value is ${v.min}` };
|
|
107
|
+
}
|
|
108
|
+
if (v.max !== void 0) {
|
|
109
|
+
rules.max = { value: v.max, message: (_f = v.message) != null ? _f : `Maximum value is ${v.max}` };
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case "length":
|
|
113
|
+
if (v.min !== void 0) {
|
|
114
|
+
rules.minLength = { value: v.min, message: (_g = v.message) != null ? _g : `Minimum length is ${v.min}` };
|
|
115
|
+
}
|
|
116
|
+
if (v.max !== void 0) {
|
|
117
|
+
rules.maxLength = { value: v.max, message: (_h = v.message) != null ? _h : `Maximum length is ${v.max}` };
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return rules;
|
|
124
|
+
}
|
|
125
|
+
const ITEM_ERRORS_PREFIX = "__ITEM_ERRORS__";
|
|
126
|
+
function parseItemErrors(errorMessage) {
|
|
127
|
+
if (!errorMessage || !errorMessage.startsWith(ITEM_ERRORS_PREFIX)) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
return JSON.parse(errorMessage.slice(ITEM_ERRORS_PREFIX.length));
|
|
132
|
+
} catch (e) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export { buildValidationRules, evaluateEffectCondition, isFieldRequired, parseItemErrors };
|
|
138
|
+
//# sourceMappingURL=fieldUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldUtils.js","sources":["../../../../../../src/components/ConfigEditor/DatasourceConfigWizard/inputs/fieldUtils.ts"],"sourcesContent":["import { parseDependsOn, evaluateDependsOn, formKey, getWatchedValue } from '../config';\nimport { evaluateCelExpression } from '../cel';\nimport { SECURE_FIELD_CONFIGURED } from '../datasource';\nimport type { ConfigField } from '../../../../schema/schema';\n\n/**\n * Evaluate an effect's `when` condition against a field value.\n * Supports: \"value == 'literal'\", \"value == true\", \"value != 'literal'\"\n * The keyword `value` refers to the current value of the source field.\n */\nexport function evaluateEffectCondition(when: string, fieldValue: unknown): boolean {\n const m = when.match(/^value\\s*(==|!=)\\s*(?:'([^']*)'|\"([^\"]*)\"|(.+))$/);\n if (!m) {\n return false;\n }\n const op = m[1];\n let target: unknown = m[2] ?? m[3] ?? m[4];\n if (target === 'true') {\n target = true;\n } else if (target === 'false') {\n target = false;\n } else if (typeof target === 'string' && /^-?\\d+(\\.\\d+)?$/.test(target)) {\n target = Number(target);\n }\n\n const eq = String(fieldValue) === String(target);\n return op === '==' ? eq : !eq;\n}\n\n/**\n * Evaluate whether a field is currently required, considering both the static\n * `required` flag and the conditional `requiredWhen` expression.\n */\nexport function isFieldRequired(\n field: ConfigField,\n watchedValues: Record<string, unknown>,\n fieldById: Map<string, ConfigField>,\n celContext?: Record<string, unknown>\n): boolean {\n if (field.required) {\n return true;\n }\n if (field.requiredWhen) {\n // Use CEL evaluation if context is available (supports compound expressions)\n if (celContext) {\n return evaluateCelExpression(field.requiredWhen, celContext);\n }\n // Fallback to simple parser for backward compatibility\n const parsed = parseDependsOn(field.requiredWhen);\n if (parsed) {\n const depField = fieldById.get(parsed.field);\n const depKey = depField ? formKey(depField) : parsed.field;\n return evaluateDependsOn(parsed, getWatchedValue(watchedValues, depKey));\n }\n }\n return false;\n}\n\nexport function buildValidationRules(field: ConfigField, required: boolean) {\n const rules: Record<string, unknown> = {};\n const label = field.label ?? field.key;\n\n if (required) {\n if (field.target === 'secureJsonData') {\n rules.validate = (value: unknown) => {\n if (value === SECURE_FIELD_CONFIGURED) {\n return true;\n }\n if (!value || value === '') {\n return `${label} is required`;\n }\n return true;\n };\n } else {\n rules.required = `${label} is required`;\n }\n }\n\n // Validate required item fields inside object arrays.\n // Returns a JSON-encoded map of {itemIndex: \"message\"} so ObjectArrayEditor\n // can render errors inline per item. react-hook-form treats any non-true\n // string as an error message.\n if (field.valueType === 'array' && field.item?.valueType === 'object' && field.item.fields?.length) {\n const requiredItemFields = field.item.fields.filter((f) => f.required);\n if (requiredItemFields.length > 0) {\n const existingValidate = rules.validate as ((v: unknown) => true | string) | undefined;\n rules.validate = (value: unknown) => {\n if (existingValidate) {\n const r = existingValidate(value);\n if (r !== true) {\n return r;\n }\n }\n if (!Array.isArray(value)) {\n return true;\n }\n const itemErrors: Record<number, string> = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i] as Record<string, unknown>;\n const missing: string[] = [];\n for (const rf of requiredItemFields) {\n const v = item[rf.key];\n if (v === undefined || v === null || v === '') {\n missing.push(rf.label ?? rf.key);\n }\n }\n if (missing.length > 0) {\n itemErrors[i] = `${missing.join(', ')} required`;\n }\n }\n if (Object.keys(itemErrors).length === 0) {\n return true;\n }\n // Encode as JSON so ObjectArrayEditor can parse and show per-item\n return `__ITEM_ERRORS__${JSON.stringify(itemErrors)}`;\n };\n }\n }\n\n if (field.validations) {\n for (const v of field.validations) {\n switch (v.type) {\n case 'pattern':\n rules.pattern = {\n value: new RegExp(v.pattern),\n message: v.message ?? `Invalid ${label}`,\n };\n break;\n case 'range':\n if (v.min !== undefined) {\n rules.min = { value: v.min, message: v.message ?? `Minimum value is ${v.min}` };\n }\n if (v.max !== undefined) {\n rules.max = { value: v.max, message: v.message ?? `Maximum value is ${v.max}` };\n }\n break;\n case 'length':\n if (v.min !== undefined) {\n rules.minLength = { value: v.min, message: v.message ?? `Minimum length is ${v.min}` };\n }\n if (v.max !== undefined) {\n rules.maxLength = { value: v.max, message: v.message ?? `Maximum length is ${v.max}` };\n }\n break;\n }\n }\n }\n\n return rules;\n}\nconst ITEM_ERRORS_PREFIX = '__ITEM_ERRORS__';\n\n/**\n * Parse a per-item error message encoded by buildValidationRules.\n * Returns a map of item index → error message, or null if not an item error.\n */\nexport function parseItemErrors(errorMessage: string | undefined): Record<number, string> | null {\n if (!errorMessage || !errorMessage.startsWith(ITEM_ERRORS_PREFIX)) {\n return null;\n }\n try {\n return JSON.parse(errorMessage.slice(ITEM_ERRORS_PREFIX.length));\n } catch {\n return null;\n }\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Alert, LinkButton, Button } from '@grafana/ui';
|
|
3
|
+
import { formKey } from './config.js';
|
|
4
|
+
import { SchemaField } from './SchemaField.js';
|
|
5
|
+
import { AuthorizationHeaderField } from './inputs/AuthorizationHeaderField.js';
|
|
6
|
+
|
|
7
|
+
function GroupFields({
|
|
8
|
+
group,
|
|
9
|
+
form,
|
|
10
|
+
dsUid,
|
|
11
|
+
showAuthHeaders
|
|
12
|
+
}) {
|
|
13
|
+
const {
|
|
14
|
+
control,
|
|
15
|
+
errors,
|
|
16
|
+
watchedValues,
|
|
17
|
+
fieldById,
|
|
18
|
+
celContext,
|
|
19
|
+
setValue,
|
|
20
|
+
isFieldVisible,
|
|
21
|
+
isFieldDisabled,
|
|
22
|
+
httpHeadersField,
|
|
23
|
+
submitting,
|
|
24
|
+
readOnly
|
|
25
|
+
} = form;
|
|
26
|
+
const allDisabled = submitting || readOnly;
|
|
27
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, group.fields.filter(isFieldVisible).map((field) => /* @__PURE__ */ React.createElement(
|
|
28
|
+
SchemaField,
|
|
29
|
+
{
|
|
30
|
+
key: formKey(field),
|
|
31
|
+
field,
|
|
32
|
+
control,
|
|
33
|
+
errors,
|
|
34
|
+
disabled: allDisabled || isFieldDisabled(field),
|
|
35
|
+
dsUid,
|
|
36
|
+
watchedValues,
|
|
37
|
+
fieldById,
|
|
38
|
+
celContext,
|
|
39
|
+
setValue
|
|
40
|
+
}
|
|
41
|
+
)), showAuthHeaders && httpHeadersField && /* @__PURE__ */ React.createElement(
|
|
42
|
+
AuthorizationHeaderField,
|
|
43
|
+
{
|
|
44
|
+
headersFieldKey: formKey(httpHeadersField),
|
|
45
|
+
control,
|
|
46
|
+
disabled: allDisabled
|
|
47
|
+
}
|
|
48
|
+
));
|
|
49
|
+
}
|
|
50
|
+
function FormFooter({
|
|
51
|
+
form,
|
|
52
|
+
schema,
|
|
53
|
+
dsUid,
|
|
54
|
+
dsName,
|
|
55
|
+
onRetest,
|
|
56
|
+
healthError,
|
|
57
|
+
renderActions,
|
|
58
|
+
saveDisabled,
|
|
59
|
+
className
|
|
60
|
+
}) {
|
|
61
|
+
const { readOnly, submitting, submitError } = form;
|
|
62
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, submitError && /* @__PURE__ */ React.createElement(Alert, { severity: "error", title: "Error" }, submitError), /* @__PURE__ */ React.createElement("div", { className }, readOnly ? /* @__PURE__ */ React.createElement(Button, { variant: "primary", size: "sm", icon: "sync", onClick: onRetest, type: "button" }, "Test") : /* @__PURE__ */ React.createElement(Button, { variant: "primary", size: "sm", disabled: saveDisabled, type: "submit" }, submitting ? "Saving\u2026" : "Save & Test"), healthError && (renderActions == null ? void 0 : renderActions({ dsUid, dsName, dsType: schema.pluginType, healthError }))));
|
|
63
|
+
}
|
|
64
|
+
function FetchErrorState({
|
|
65
|
+
error,
|
|
66
|
+
dsUid,
|
|
67
|
+
buttonClassName
|
|
68
|
+
}) {
|
|
69
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Alert, { severity: "error", title: "Failed to load configuration" }, error), /* @__PURE__ */ React.createElement("div", { className: buttonClassName }, /* @__PURE__ */ React.createElement(
|
|
70
|
+
LinkButton,
|
|
71
|
+
{
|
|
72
|
+
variant: "secondary",
|
|
73
|
+
size: "sm",
|
|
74
|
+
icon: "external-link-alt",
|
|
75
|
+
href: `/connections/datasources/edit/${dsUid}`
|
|
76
|
+
},
|
|
77
|
+
"Open datasource settings"
|
|
78
|
+
)));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { FetchErrorState, FormFooter, GroupFields };
|
|
82
|
+
//# sourceMappingURL=layoutParts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layoutParts.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/layoutParts.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react';\nimport { Alert, Button, LinkButton } from '@grafana/ui';\nimport type { DatasourceConfigSchema } from '../../../schema/schema';\nimport { formKey, type ResolvedGroup } from './config';\nimport type { useDatasourceConfigForm } from './hooks/useDatasourceConfigForm';\nimport { SchemaField } from './SchemaField';\nimport { AuthorizationHeaderField } from './inputs/AuthorizationHeaderField';\n\ntype ConfigForm = ReturnType<typeof useDatasourceConfigForm>;\n\ntype RenderActions = (props: { dsUid: string; dsName: string; dsType: string; healthError?: string }) => ReactNode;\n\n/**\n * Renders the visible fields of a single group plus the optional Authorization\n * header editor. Shared by both the tab and wizard layouts so the field-render\n * contract lives in exactly one place.\n *\n * `showAuthHeaders` is passed in (rather than derived here) because the two\n * layouts intentionally use different predicates for when to show it.\n */\nexport function GroupFields({\n group,\n form,\n dsUid,\n showAuthHeaders,\n}: {\n group: ResolvedGroup;\n form: ConfigForm;\n dsUid: string;\n showAuthHeaders: boolean;\n}) {\n const {\n control,\n errors,\n watchedValues,\n fieldById,\n celContext,\n setValue,\n isFieldVisible,\n isFieldDisabled,\n httpHeadersField,\n submitting,\n readOnly,\n } = form;\n const allDisabled = submitting || readOnly;\n\n return (\n <>\n {group.fields.filter(isFieldVisible).map((field) => (\n <SchemaField\n key={formKey(field)}\n field={field}\n control={control}\n errors={errors}\n disabled={allDisabled || isFieldDisabled(field)}\n dsUid={dsUid}\n watchedValues={watchedValues}\n fieldById={fieldById}\n celContext={celContext}\n setValue={setValue}\n />\n ))}\n\n {showAuthHeaders && httpHeadersField && (\n <AuthorizationHeaderField\n headersFieldKey={formKey(httpHeadersField)}\n control={control}\n disabled={allDisabled}\n />\n )}\n </>\n );\n}\n\n/**\n * Submit-error alert plus the Save/Test action row. `saveDisabled` and\n * `className` differ per layout (the wizard also gates on step validity and\n * uses its own button container).\n */\nexport function FormFooter({\n form,\n schema,\n dsUid,\n dsName,\n onRetest,\n healthError,\n renderActions,\n saveDisabled,\n className,\n}: {\n form: ConfigForm;\n schema: DatasourceConfigSchema;\n dsUid: string;\n dsName: string;\n onRetest?: () => void;\n healthError?: string;\n renderActions?: RenderActions;\n saveDisabled: boolean;\n className: string;\n}) {\n const { readOnly, submitting, submitError } = form;\n\n return (\n <>\n {submitError && (\n <Alert severity=\"error\" title=\"Error\">\n {submitError}\n </Alert>\n )}\n\n <div className={className}>\n {readOnly ? (\n <Button variant=\"primary\" size=\"sm\" icon=\"sync\" onClick={onRetest} type=\"button\">\n Test\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" disabled={saveDisabled} type=\"submit\">\n {submitting ? 'Saving…' : 'Save & Test'}\n </Button>\n )}\n {healthError && renderActions?.({ dsUid, dsName, dsType: schema.pluginType, healthError })}\n </div>\n </>\n );\n}\n\n/**\n * \"Failed to load configuration\" state with a link to the native datasource\n * settings page. The outer container class differs per layout, so callers wrap\n * this; `buttonClassName` styles the link row.\n */\nexport function FetchErrorState({\n error,\n dsUid,\n buttonClassName,\n}: {\n error: string;\n dsUid: string;\n buttonClassName: string;\n}) {\n return (\n <>\n <Alert severity=\"error\" title=\"Failed to load configuration\">\n {error}\n </Alert>\n <div className={buttonClassName}>\n <LinkButton\n variant=\"secondary\"\n size=\"sm\"\n icon=\"external-link-alt\"\n href={`/connections/datasources/edit/${dsUid}`}\n >\n Open datasource settings\n </LinkButton>\n </div>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { getDataSourceSrv } from '@grafana/runtime';
|
|
2
|
+
|
|
3
|
+
let pluginNameCache = null;
|
|
4
|
+
function buildPluginNameCache() {
|
|
5
|
+
var _a;
|
|
6
|
+
if (pluginNameCache) {
|
|
7
|
+
return pluginNameCache;
|
|
8
|
+
}
|
|
9
|
+
const map = /* @__PURE__ */ new Map();
|
|
10
|
+
try {
|
|
11
|
+
const list = getDataSourceSrv().getList();
|
|
12
|
+
for (const ds of list) {
|
|
13
|
+
if (((_a = ds.meta) == null ? void 0 : _a.name) && ds.type && !map.has(ds.type)) {
|
|
14
|
+
map.set(ds.type, ds.meta.name);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
} catch (ex) {
|
|
18
|
+
console.error(ex);
|
|
19
|
+
}
|
|
20
|
+
pluginNameCache = map;
|
|
21
|
+
return map;
|
|
22
|
+
}
|
|
23
|
+
function resolvePluginName(pluginType) {
|
|
24
|
+
var _a;
|
|
25
|
+
const cache = buildPluginNameCache();
|
|
26
|
+
return (_a = cache.get(pluginType)) != null ? _a : pluginType;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { resolvePluginName };
|
|
30
|
+
//# sourceMappingURL=resolvePluginName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvePluginName.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.ts"],"sourcesContent":["import { getDataSourceSrv } from '@grafana/runtime';\n\nlet pluginNameCache: Map<string, string> | null = null;\n\nfunction buildPluginNameCache(): Map<string, string> {\n if (pluginNameCache) {\n return pluginNameCache;\n }\n const map = new Map<string, string>();\n try {\n const list = getDataSourceSrv().getList();\n for (const ds of list) {\n if (ds.meta?.name && ds.type && !map.has(ds.type)) {\n map.set(ds.type, ds.meta.name);\n }\n }\n } catch (ex) {\n console.error(ex);\n }\n pluginNameCache = map;\n return map;\n}\n\nexport function resolvePluginName(pluginType: string): string {\n const cache = buildPluginNameCache();\n return cache.get(pluginType) ?? pluginType;\n}\n"],"names":[],"mappings":";;AAEA,IAAI,eAAA,GAA8C,IAAA;AAElD,SAAS,oBAAA,GAA4C;AAJrD,EAAA,IAAA,EAAA;AAKE,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,eAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,gBAAA,EAAiB,CAAE,OAAA,EAAQ;AACxC,IAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,MAAA,IAAA,CAAA,CAAI,EAAA,GAAA,EAAA,CAAG,IAAA,KAAH,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAS,IAAA,KAAQ,EAAA,CAAG,IAAA,IAAQ,CAAC,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,IAAI,CAAA,EAAG;AACjD,QAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,SAAS,EAAA,EAAI;AACX,IAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,EAClB;AACA,EAAA,eAAA,GAAkB,GAAA;AAClB,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,kBAAkB,UAAA,EAA4B;AAvB9D,EAAA,IAAA,EAAA;AAwBE,EAAA,MAAM,QAAQ,oBAAA,EAAqB;AACnC,EAAA,OAAA,CAAO,EAAA,GAAA,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,KAApB,IAAA,GAAA,EAAA,GAAyB,UAAA;AAClC;;;;"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { css } from '@emotion/css';
|
|
2
|
+
|
|
3
|
+
const overlayStyle = (theme) => ({
|
|
4
|
+
position: "absolute",
|
|
5
|
+
inset: 0,
|
|
6
|
+
display: "flex",
|
|
7
|
+
alignItems: "center",
|
|
8
|
+
justifyContent: "center",
|
|
9
|
+
gap: theme.spacing(1),
|
|
10
|
+
background: theme.colors.background.secondary,
|
|
11
|
+
borderRadius: theme.shape.radius.default,
|
|
12
|
+
zIndex: 1,
|
|
13
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
14
|
+
color: theme.colors.text.primary,
|
|
15
|
+
opacity: 0.95
|
|
16
|
+
});
|
|
17
|
+
const readOnlyBannerStyle = (theme) => ({
|
|
18
|
+
display: "inline-flex",
|
|
19
|
+
alignItems: "center",
|
|
20
|
+
gap: theme.spacing(0.5),
|
|
21
|
+
padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
|
|
22
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
23
|
+
color: theme.colors.text.secondary,
|
|
24
|
+
backgroundColor: theme.colors.background.secondary,
|
|
25
|
+
borderRadius: theme.shape.radius.default,
|
|
26
|
+
border: `1px solid ${theme.colors.border.weak}`
|
|
27
|
+
});
|
|
28
|
+
const getWizardStyles = (theme) => ({
|
|
29
|
+
container: css({
|
|
30
|
+
position: "relative",
|
|
31
|
+
display: "flex",
|
|
32
|
+
flexDirection: "column",
|
|
33
|
+
gap: theme.spacing(1),
|
|
34
|
+
padding: theme.spacing(1.5),
|
|
35
|
+
backgroundColor: theme.colors.background.secondary,
|
|
36
|
+
borderRadius: theme.shape.radius.default,
|
|
37
|
+
border: `1px solid ${theme.colors.border.weak}`,
|
|
38
|
+
overflow: "hidden"
|
|
39
|
+
}),
|
|
40
|
+
overlay: css(overlayStyle(theme)),
|
|
41
|
+
readOnlyBanner: css(readOnlyBannerStyle(theme)),
|
|
42
|
+
navBar: css({
|
|
43
|
+
display: "flex",
|
|
44
|
+
alignItems: "center",
|
|
45
|
+
justifyContent: "space-between"
|
|
46
|
+
}),
|
|
47
|
+
navTitle: css({
|
|
48
|
+
display: "inline-flex",
|
|
49
|
+
alignItems: "center",
|
|
50
|
+
gap: theme.spacing(0.5),
|
|
51
|
+
fontSize: theme.typography.body.fontSize,
|
|
52
|
+
fontWeight: theme.typography.fontWeightBold,
|
|
53
|
+
color: theme.colors.text.primary
|
|
54
|
+
}),
|
|
55
|
+
stepCount: css({
|
|
56
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
57
|
+
fontWeight: theme.typography.fontWeightRegular,
|
|
58
|
+
color: theme.colors.text.secondary
|
|
59
|
+
}),
|
|
60
|
+
navActions: css({
|
|
61
|
+
display: "flex",
|
|
62
|
+
alignItems: "center",
|
|
63
|
+
gap: theme.spacing(0.25)
|
|
64
|
+
}),
|
|
65
|
+
form: css({
|
|
66
|
+
display: "flex",
|
|
67
|
+
flexDirection: "column",
|
|
68
|
+
gap: theme.spacing(0.75)
|
|
69
|
+
}),
|
|
70
|
+
buttons: css({
|
|
71
|
+
display: "flex",
|
|
72
|
+
gap: theme.spacing(1),
|
|
73
|
+
paddingTop: theme.spacing(0.25)
|
|
74
|
+
})
|
|
75
|
+
});
|
|
76
|
+
const getFieldStyles = (theme) => ({
|
|
77
|
+
fieldRow: css({
|
|
78
|
+
display: "grid",
|
|
79
|
+
gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
|
|
80
|
+
gap: theme.spacing(0.75),
|
|
81
|
+
alignItems: "start"
|
|
82
|
+
}),
|
|
83
|
+
fieldRowCenter: css({
|
|
84
|
+
display: "grid",
|
|
85
|
+
gridTemplateColumns: "minmax(80px, 1fr) minmax(0, 2fr)",
|
|
86
|
+
gap: theme.spacing(0.75),
|
|
87
|
+
alignItems: "center",
|
|
88
|
+
padding: `${theme.spacing(0.5)} 0`
|
|
89
|
+
}),
|
|
90
|
+
fieldLabelRow: css({
|
|
91
|
+
display: "flex",
|
|
92
|
+
alignItems: "center",
|
|
93
|
+
gap: theme.spacing(0.5),
|
|
94
|
+
paddingTop: theme.spacing(0.5)
|
|
95
|
+
}),
|
|
96
|
+
fieldLabelRowCompact: css({
|
|
97
|
+
display: "flex",
|
|
98
|
+
alignItems: "center",
|
|
99
|
+
gap: theme.spacing(0.5)
|
|
100
|
+
}),
|
|
101
|
+
fieldLabel: css({
|
|
102
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
103
|
+
fontWeight: theme.typography.fontWeightMedium,
|
|
104
|
+
color: theme.colors.text.primary
|
|
105
|
+
}),
|
|
106
|
+
fieldRequired: css({
|
|
107
|
+
color: theme.colors.error.text,
|
|
108
|
+
marginLeft: 2
|
|
109
|
+
}),
|
|
110
|
+
fieldInfoIcon: css({
|
|
111
|
+
color: theme.colors.text.disabled,
|
|
112
|
+
cursor: "help",
|
|
113
|
+
flexShrink: 0
|
|
114
|
+
}),
|
|
115
|
+
fieldInputCol: css({
|
|
116
|
+
display: "flex",
|
|
117
|
+
flexDirection: "column",
|
|
118
|
+
gap: theme.spacing(0.25),
|
|
119
|
+
minWidth: 0
|
|
120
|
+
}),
|
|
121
|
+
fieldError: css({
|
|
122
|
+
fontSize: theme.typography.bodySmall.fontSize,
|
|
123
|
+
color: theme.colors.error.text
|
|
124
|
+
})
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
export { getFieldStyles, getWizardStyles };
|
|
128
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/styles.ts"],"sourcesContent":["import { css } from '@emotion/css';\nimport type { GrafanaTheme2 } from '@grafana/data';\n\n/** Centered saving/loading overlay. Identical in tab and wizard layouts. */\nconst overlayStyle = (theme: GrafanaTheme2) =>\n ({\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1),\n background: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n zIndex: 1,\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.text.primary,\n opacity: 0.95,\n }) as const;\n\n/** \"Read-only — managed externally\" banner. Tab layout adds a marginBottom. */\nconst readOnlyBannerStyle = (theme: GrafanaTheme2) =>\n ({\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.text.secondary,\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n }) as const;\n\nexport const getWizardStyles = (theme: GrafanaTheme2) => ({\n container: css({\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n padding: theme.spacing(1.5),\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n overflow: 'hidden',\n }),\n overlay: css(overlayStyle(theme)),\n readOnlyBanner: css(readOnlyBannerStyle(theme)),\n navBar: css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }),\n navTitle: css({\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n fontSize: theme.typography.body.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n color: theme.colors.text.primary,\n }),\n stepCount: css({\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightRegular,\n color: theme.colors.text.secondary,\n }),\n navActions: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.25),\n }),\n form: css({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.75),\n }),\n buttons: css({\n display: 'flex',\n gap: theme.spacing(1),\n paddingTop: theme.spacing(0.25),\n }),\n});\n\n// Field-level styles shared by SchemaField and AuthorizationHeaderField, which\n// render in both the tab and wizard layouts (hence not tied to either one).\nexport const getFieldStyles = (theme: GrafanaTheme2) => ({\n fieldRow: css({\n display: 'grid',\n gridTemplateColumns: 'minmax(80px, 1fr) minmax(0, 2fr)',\n gap: theme.spacing(0.75),\n alignItems: 'start',\n }),\n fieldRowCenter: css({\n display: 'grid',\n gridTemplateColumns: 'minmax(80px, 1fr) minmax(0, 2fr)',\n gap: theme.spacing(0.75),\n alignItems: 'center',\n padding: `${theme.spacing(0.5)} 0`,\n }),\n fieldLabelRow: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n paddingTop: theme.spacing(0.5),\n }),\n fieldLabelRowCompact: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n }),\n fieldLabel: css({\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n color: theme.colors.text.primary,\n }),\n fieldRequired: css({\n color: theme.colors.error.text,\n marginLeft: 2,\n }),\n fieldInfoIcon: css({\n color: theme.colors.text.disabled,\n cursor: 'help',\n flexShrink: 0,\n }),\n fieldInputCol: css({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.25),\n minWidth: 0,\n }),\n fieldError: css({\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.error.text,\n }),\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { usePrevious } from 'react-use';
|
|
|
6
6
|
import { DataSourcePicker } from '../DataSourcePicker/DataSourcePicker.js';
|
|
7
7
|
|
|
8
8
|
const { FormField, Switch } = LegacyForms;
|
|
9
|
-
const getStyles$
|
|
9
|
+
const getStyles$u = stylesFactory(() => ({
|
|
10
10
|
firstRow: css`
|
|
11
11
|
display: flex;
|
|
12
12
|
`,
|
|
@@ -23,7 +23,7 @@ const getStyles$p = stylesFactory(() => ({
|
|
|
23
23
|
}));
|
|
24
24
|
const DataLink = (props) => {
|
|
25
25
|
const { value, onChange, onDelete, suggestions, className } = props;
|
|
26
|
-
const styles = getStyles$
|
|
26
|
+
const styles = getStyles$u();
|
|
27
27
|
const [showInternalLink, setShowInternalLink] = useInternalLink(value.datasourceUid);
|
|
28
28
|
const handleChange = (field) => (event) => {
|
|
29
29
|
onChange({
|
|
@@ -4,7 +4,7 @@ import { useTheme2, Button } from '@grafana/ui';
|
|
|
4
4
|
import { VariableOrigin, DataLinkBuiltInVars } from '@grafana/data';
|
|
5
5
|
import { DataLink } from './DataLink.js';
|
|
6
6
|
|
|
7
|
-
const getStyles$
|
|
7
|
+
const getStyles$t = (theme) => ({
|
|
8
8
|
infoText: css`
|
|
9
9
|
padding-bottom: ${theme.v1.spacing.md};
|
|
10
10
|
color: ${theme.v1.colors.textWeak};
|
|
@@ -16,7 +16,7 @@ const getStyles$o = (theme) => ({
|
|
|
16
16
|
const DataLinks = (props) => {
|
|
17
17
|
const { value, onChange } = props;
|
|
18
18
|
const theme = useTheme2();
|
|
19
|
-
const styles = getStyles$
|
|
19
|
+
const styles = getStyles$t(theme);
|
|
20
20
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("h3", { className: "page-heading" }, "Data links"), /* @__PURE__ */ React.createElement("div", { className: styles.infoText }, "Add links to existing fields. Links will be shown in log row details next to the field value."), /* @__PURE__ */ React.createElement("div", { className: "gf-form-group" }, value && value.map((field, index) => {
|
|
21
21
|
return /* @__PURE__ */ React.createElement(
|
|
22
22
|
DataLink,
|
|
@@ -5,15 +5,15 @@ import { selectors } from '@grafana/e2e-selectors';
|
|
|
5
5
|
import { isUnsignedPluginSignature, PluginSignatureBadge } from '../Plugins/PluginSignatureBadge.js';
|
|
6
6
|
import { getDataSourceSrv } from '@grafana/runtime';
|
|
7
7
|
|
|
8
|
-
var __defProp$
|
|
9
|
-
var __defNormalProp$
|
|
10
|
-
var __publicField$
|
|
8
|
+
var __defProp$6 = Object.defineProperty;
|
|
9
|
+
var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
+
var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
11
11
|
class DataSourcePicker extends PureComponent {
|
|
12
12
|
constructor(props) {
|
|
13
13
|
super(props);
|
|
14
|
-
__publicField$
|
|
15
|
-
__publicField$
|
|
16
|
-
__publicField$
|
|
14
|
+
__publicField$6(this, "dataSourceSrv", getDataSourceSrv());
|
|
15
|
+
__publicField$6(this, "state", {});
|
|
16
|
+
__publicField$6(this, "onChange", (item) => {
|
|
17
17
|
const dsSettings = this.dataSourceSrv.getInstanceSettings(item.value);
|
|
18
18
|
if (dsSettings) {
|
|
19
19
|
this.props.onChange(dsSettings);
|
|
@@ -93,7 +93,7 @@ class DataSourcePicker extends PureComponent {
|
|
|
93
93
|
));
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
|
-
__publicField$
|
|
96
|
+
__publicField$6(DataSourcePicker, "defaultProps", {
|
|
97
97
|
autoFocus: false,
|
|
98
98
|
openMenuOnFocus: false,
|
|
99
99
|
placeholder: "Select datasource"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import '@grafana/data';
|
|
2
2
|
import { css } from '@emotion/css';
|
|
3
3
|
|
|
4
|
-
const getStyles$
|
|
4
|
+
const getStyles$w = (theme) => {
|
|
5
5
|
const containerBorder = theme.isDark ? theme.v1.palette.dark9 : theme.v1.palette.gray5;
|
|
6
6
|
return {
|
|
7
7
|
container: css`
|
|
@@ -149,5 +149,5 @@ const getBodyStyles = (theme) => {
|
|
|
149
149
|
};
|
|
150
150
|
};
|
|
151
151
|
|
|
152
|
-
export { getBodyStyles, getStyles$
|
|
152
|
+
export { getBodyStyles, getStyles$w as getStyles };
|
|
153
153
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css } from '@emotion/css';
|
|
2
2
|
|
|
3
|
-
function getStyles$
|
|
3
|
+
function getStyles$v() {
|
|
4
4
|
return {
|
|
5
5
|
input: css({
|
|
6
6
|
/* hides the native Calendar picker icon given when using type=date */
|
|
@@ -12,5 +12,5 @@ function getStyles$q() {
|
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export { getStyles$
|
|
15
|
+
export { getStyles$v as getStyles };
|
|
16
16
|
//# sourceMappingURL=styles.js.map
|
|
@@ -6,12 +6,12 @@ import { useStyles2, ReactUtils, Tooltip, Icon, Space, Field } from '@grafana/ui
|
|
|
6
6
|
const EditorField$1 = (props) => {
|
|
7
7
|
var _a;
|
|
8
8
|
const { label, optional, tooltip, tooltipInteractive, children, width, ...fieldProps } = props;
|
|
9
|
-
const styles = useStyles2(getStyles$
|
|
9
|
+
const styles = useStyles2(getStyles$q, width);
|
|
10
10
|
const childInputId = (fieldProps == null ? void 0 : fieldProps.htmlFor) || ((_a = ReactUtils) == null ? void 0 : _a.getChildId(children));
|
|
11
11
|
const labelEl = /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("label", { className: styles.label, htmlFor: childInputId }, label, optional && /* @__PURE__ */ React.createElement("span", { className: styles.optional }, " - optional"), tooltip && /* @__PURE__ */ React.createElement(Tooltip, { placement: "top", content: tooltip, theme: "info", interactive: tooltipInteractive }, /* @__PURE__ */ React.createElement(Icon, { tabIndex: 0, name: "info-circle", size: "sm", className: styles.icon }))), /* @__PURE__ */ React.createElement(Space, { v: 0.5 }));
|
|
12
12
|
return /* @__PURE__ */ React.createElement("div", { className: styles.root }, /* @__PURE__ */ React.createElement(Field, { className: styles.field, label: labelEl, ...fieldProps }, children));
|
|
13
13
|
};
|
|
14
|
-
const getStyles$
|
|
14
|
+
const getStyles$q = (theme, width) => {
|
|
15
15
|
return {
|
|
16
16
|
root: css({
|
|
17
17
|
minWidth: theme.spacing(width != null ? width : 0)
|
|
@@ -4,10 +4,10 @@ import '@grafana/data';
|
|
|
4
4
|
import { useStyles2 } from '@grafana/ui';
|
|
5
5
|
|
|
6
6
|
const EditorHeader = ({ children }) => {
|
|
7
|
-
const styles = useStyles2(getStyles$
|
|
7
|
+
const styles = useStyles2(getStyles$r);
|
|
8
8
|
return /* @__PURE__ */ React.createElement("div", { className: styles.root }, children);
|
|
9
9
|
};
|
|
10
|
-
const getStyles$
|
|
10
|
+
const getStyles$r = (theme) => ({
|
|
11
11
|
root: css({
|
|
12
12
|
display: "flex",
|
|
13
13
|
flexWrap: "wrap",
|
|
@@ -5,10 +5,10 @@ import { useStyles2 } from '@grafana/ui';
|
|
|
5
5
|
import { EditorStack } from './EditorStack.js';
|
|
6
6
|
|
|
7
7
|
const EditorRow$1 = ({ children }) => {
|
|
8
|
-
const styles = useStyles2(getStyles$
|
|
8
|
+
const styles = useStyles2(getStyles$p);
|
|
9
9
|
return /* @__PURE__ */ React.createElement("div", { className: styles.root }, /* @__PURE__ */ React.createElement(EditorStack, { gap: 2 }, children));
|
|
10
10
|
};
|
|
11
|
-
const getStyles$
|
|
11
|
+
const getStyles$p = (theme) => {
|
|
12
12
|
return {
|
|
13
13
|
root: css({
|
|
14
14
|
padding: theme.spacing(1),
|
|
@@ -3,10 +3,10 @@ import { css } from '@emotion/css';
|
|
|
3
3
|
import { Switch } from '@grafana/ui';
|
|
4
4
|
|
|
5
5
|
const EditorSwitch = (props) => {
|
|
6
|
-
const styles = getStyles$
|
|
6
|
+
const styles = getStyles$o();
|
|
7
7
|
return /* @__PURE__ */ React.createElement("div", { className: styles.switch }, /* @__PURE__ */ React.createElement(Switch, { ...props }));
|
|
8
8
|
};
|
|
9
|
-
const getStyles$
|
|
9
|
+
const getStyles$o = () => {
|
|
10
10
|
return {
|
|
11
11
|
switch: css({
|
|
12
12
|
display: "flex",
|
|
@@ -3,7 +3,7 @@ import { cx, css } from '@emotion/css';
|
|
|
3
3
|
import { useStyles2 } from '@grafana/ui';
|
|
4
4
|
|
|
5
5
|
const InputGroup = ({ children }) => {
|
|
6
|
-
const styles = useStyles2(getStyles$
|
|
6
|
+
const styles = useStyles2(getStyles$s);
|
|
7
7
|
const modifiedChildren = Children.map(children, (child) => {
|
|
8
8
|
if (isValidElement(child) && child.props.invalid) {
|
|
9
9
|
return cloneElement(child, { className: cx(child.props.className, styles.invalidChild) });
|
|
@@ -21,7 +21,7 @@ const borderPriority = [
|
|
|
21
21
|
"focused"
|
|
22
22
|
// highest priority
|
|
23
23
|
];
|
|
24
|
-
const getStyles$
|
|
24
|
+
const getStyles$s = () => ({
|
|
25
25
|
root: css({
|
|
26
26
|
display: "flex",
|
|
27
27
|
// Style the direct children of the component
|
|
@@ -4,10 +4,10 @@ import '@grafana/data';
|
|
|
4
4
|
import { useStyles2 } from '@grafana/ui';
|
|
5
5
|
|
|
6
6
|
const Space = ({ v = 0, h = 0, layout = "block" }) => {
|
|
7
|
-
const styles = useStyles2(getStyles$
|
|
7
|
+
const styles = useStyles2(getStyles$n, v, h, layout);
|
|
8
8
|
return /* @__PURE__ */ React.createElement("span", { className: cx(styles.wrapper) });
|
|
9
9
|
};
|
|
10
|
-
const getStyles$
|
|
10
|
+
const getStyles$n = (theme, v, h, layout) => ({
|
|
11
11
|
wrapper: css([
|
|
12
12
|
{
|
|
13
13
|
paddingRight: theme.spacing(h != null ? h : 0),
|