Chore: auto mark up some areas for translations (#102711)
* auto markup users/variables/visualization features * mark up transformers feature * betterer + translations * markup trails * mark up service accounts + translations + betterer * undo ServiceAccountProfileRow change for now * dedupe a little
This commit is contained in:
+57
-357
@@ -5108,79 +5108,30 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/ServiceAccountPage.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/ServiceAccountPermissions.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/ServiceAccountTable.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/ServiceAccountsListPage.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/components/CreateTokenModal.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "9"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/components/ServiceAccountProfile.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/components/ServiceAccountProfileRow.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/components/ServiceAccountRoleRow.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/components/ServiceAccountTokensTable.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/components/ServiceAccountsListItem.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/state/reducers.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
@@ -5255,24 +5206,14 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
|
||||
],
|
||||
"public/app/features/trails/Breakdown/AddToFiltersGraphAction.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/trails/Breakdown/BreakdownSearchScene.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/trails/Breakdown/LabelBreakdownScene.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/trails/Breakdown/SearchInput.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/trails/Breakdown/SortByScene.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/trails/Breakdown/types.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
@@ -5284,73 +5225,33 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/trails/DataTrailCard.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/features/trails/DataTrailSettings.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/trails/DataTrailsHistory.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/trails/MetricScene.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/trails/MetricSelect/MetricSelectScene.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"]
|
||||
],
|
||||
"public/app/features/trails/MetricsHeader.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||
],
|
||||
"public/app/features/trails/RelatedLogs/RelatedLogsScene.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/trails/TrailStore/utils.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/trails/banners/NativeHistogramBanner.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"]
|
||||
],
|
||||
"public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||
],
|
||||
"public/app/features/transformers/FilterByValueTransformer/ValueMatchers/BasicMatcherEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/FilterByValueTransformer/ValueMatchers/NoopMatcherEditor.tsx:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/FilterByValueTransformer/ValueMatchers/RangeMatcherEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
|
||||
],
|
||||
"public/app/features/transformers/FilterByValueTransformer/ValueMatchers/RegexMatcherEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/FilterByValueTransformer/ValueMatchers/types.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||
@@ -5364,8 +5265,7 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/calculateHeatmap/editor/AxisEditor.tsx:5381": [
|
||||
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/calculateHeatmap/editor/helper.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
@@ -5374,61 +5274,24 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "Do not use any type assertions.", "1"]
|
||||
],
|
||||
"public/app/features/transformers/configFromQuery/ConfigFromQueryTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx:5381": [
|
||||
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
|
||||
[0, 0, 0, "Do not use any type assertions.", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
|
||||
[0, 0, 0, "Do not use any type assertions.", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"]
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/index.ts:5381": [
|
||||
[0, 0, 0, "Do not re-export imported variable (\`CalculateFieldTransformerEditor\`)", "0"],
|
||||
[0, 0, 0, "Do not re-export imported variable (\`calculateFieldTransformRegistryItem\`)", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
],
|
||||
"public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
@@ -5439,121 +5302,55 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "7"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "8"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "9"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "10"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "11"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "12"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "13"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "14"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "15"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "16"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "9"]
|
||||
],
|
||||
"public/app/features/transformers/editors/EnumMappingEditor.tsx:5381": [
|
||||
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
|
||||
[0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"]
|
||||
[0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/EnumMappingRow.tsx:5381": [
|
||||
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "\'@grafana/runtime/src/services\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"]
|
||||
[0, 0, 0, "\'@grafana/runtime/src/services\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/FormatStringTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/GroupByTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"]
|
||||
],
|
||||
"public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/HistogramTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
],
|
||||
"public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"]
|
||||
],
|
||||
"public/app/features/transformers/editors/LimitTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/MergeTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
],
|
||||
"public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/ReduceTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"]
|
||||
],
|
||||
"public/app/features/transformers/editors/RenameByRegexTransformer.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/SortByTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/TransposeTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"]
|
||||
],
|
||||
"public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
@@ -5566,19 +5363,11 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "7"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "8"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "9"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "10"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "11"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "12"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "13"]
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
|
||||
],
|
||||
"public/app/features/transformers/extractFields/components/JSONPathEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/transformers/extractFields/extractFields.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
@@ -5592,11 +5381,7 @@ exports[`better eslint`] = {
|
||||
],
|
||||
"public/app/features/transformers/fieldToConfigMapping/FieldToConfigMappingEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "Do not use any type assertions.", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"]
|
||||
[0, 0, 0, "Do not use any type assertions.", "1"]
|
||||
],
|
||||
"public/app/features/transformers/fieldToConfigMapping/fieldToConfigMapping.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
@@ -5610,12 +5395,7 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "7"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "9"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"]
|
||||
],
|
||||
"public/app/features/transformers/lookupGazetteer/FieldLookupTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
@@ -5630,28 +5410,11 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"]
|
||||
],
|
||||
"public/app/features/transformers/prepareTimeSeries/PrepareTimeSeriesEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "9"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "10"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "11"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "12"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "13"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "14"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "15"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/features/transformers/prepareTimeSeries/prepareTimeSeries.test.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
@@ -5661,12 +5424,7 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
|
||||
],
|
||||
"public/app/features/transformers/regression/regressionEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/transformers/spatial/optionsHelper.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
@@ -5683,30 +5441,18 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Do not use any type assertions.", "3"]
|
||||
],
|
||||
"public/app/features/transformers/timeSeriesTable/TimeSeriesTableTransformEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/users/TokenRevokedModal.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"]
|
||||
],
|
||||
"public/app/features/users/UsersActionBar.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||
],
|
||||
"public/app/features/variables/adapters.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
|
||||
],
|
||||
"public/app/features/variables/adhoc/picker/AdHocFilter.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
],
|
||||
"public/app/features/variables/adhoc/picker/AdHocFilterKey.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
@@ -5722,46 +5468,24 @@ exports[`better eslint`] = {
|
||||
"public/app/features/variables/datasource/actions.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
"public/app/features/variables/editor/ConfirmDeleteModal.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/variables/editor/LegacyVariableQueryEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/variables/editor/VariableEditorContainer.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "Do not use any type assertions.", "1"]
|
||||
],
|
||||
"public/app/features/variables/editor/VariableEditorEditor.tsx:5381": [
|
||||
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "9"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "10"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
|
||||
],
|
||||
"public/app/features/variables/editor/VariableEditorList.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "4"]
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"]
|
||||
],
|
||||
"public/app/features/variables/editor/VariableEditorListRow.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "4"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "5"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "6"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "7"]
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"]
|
||||
],
|
||||
"public/app/features/variables/editor/getVariableQueryEditor.tsx:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||
@@ -5787,24 +5511,15 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "6"]
|
||||
],
|
||||
"public/app/features/variables/inspect/VariableUsagesButton.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
],
|
||||
"public/app/features/variables/inspect/VariablesDependenciesButton.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/variables/inspect/VariablesUnknownButton.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/variables/inspect/VariablesUnknownTable.tsx:5381": [
|
||||
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
|
||||
[0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||
],
|
||||
"public/app/features/variables/inspect/utils.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
@@ -5827,21 +5542,13 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Do not re-export imported variable (\`./OptionsPicker/OptionsPicker\`)", "0"]
|
||||
],
|
||||
"public/app/features/variables/pickers/shared/VariableOptions.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"]
|
||||
],
|
||||
"public/app/features/variables/query/QueryVariableEditor.tsx:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
|
||||
],
|
||||
"public/app/features/variables/query/QueryVariableRefreshSelect.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
|
||||
],
|
||||
"public/app/features/variables/query/QueryVariableSortSelect.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/variables/query/VariableQueryRunner.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
|
||||
@@ -5921,10 +5628,6 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "7"]
|
||||
],
|
||||
"public/app/features/variables/textbox/TextBoxVariableEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/features/variables/types.ts:5381": [
|
||||
[0, 0, 0, "Do not re-export imported variable (\`@grafana/data\`)", "0"],
|
||||
[0, 0, 0, "Do not re-export imported variable (\`VariableModel\`)", "1"],
|
||||
@@ -5947,9 +5650,6 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/features/visualization/data-hover/DataHoverView.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/plugins/datasource/alertmanager/DataSource.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
|
||||
@@ -6,6 +6,7 @@ import { NavModelItem, getTimeZone } from '@grafana/data';
|
||||
import { Button, ConfirmModal, IconButton, Stack } from '@grafana/ui';
|
||||
import { Page } from 'app/core/components/Page/Page';
|
||||
import { contextSrv } from 'app/core/core';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
import { AccessControlAction, ApiKey, ServiceAccountDTO, StoreState } from 'app/types';
|
||||
|
||||
import { ServiceAccountPermissions } from './ServiceAccountPermissions';
|
||||
@@ -143,7 +144,9 @@ export const ServiceAccountPageUnconnected = ({
|
||||
onClick={showDeleteServiceAccountModal(true)}
|
||||
disabled={!contextSrv.hasPermission(AccessControlAction.ServiceAccountsDelete)}
|
||||
>
|
||||
Delete service account
|
||||
<Trans i18nKey="serviceaccounts.service-account-page-unconnected.delete-service-account">
|
||||
Delete service account
|
||||
</Trans>
|
||||
</Button>
|
||||
{serviceAccount.isDisabled ? (
|
||||
<Button
|
||||
@@ -152,7 +155,9 @@ export const ServiceAccountPageUnconnected = ({
|
||||
onClick={handleServiceAccountEnable}
|
||||
disabled={!ableToWrite}
|
||||
>
|
||||
Enable service account
|
||||
<Trans i18nKey="serviceaccounts.service-account-page-unconnected.enable-service-account">
|
||||
Enable service account
|
||||
</Trans>
|
||||
</Button>
|
||||
) : (
|
||||
<Button
|
||||
@@ -161,7 +166,9 @@ export const ServiceAccountPageUnconnected = ({
|
||||
onClick={showDisableServiceAccountModal(true)}
|
||||
disabled={!ableToWrite}
|
||||
>
|
||||
Disable service account
|
||||
<Trans i18nKey="serviceaccounts.service-account-page-unconnected.disable-service-account">
|
||||
Disable service account
|
||||
</Trans>
|
||||
</Button>
|
||||
)}
|
||||
</Stack>
|
||||
@@ -180,7 +187,9 @@ export const ServiceAccountPageUnconnected = ({
|
||||
<ServiceAccountProfile serviceAccount={serviceAccount} timeZone={timezone} onChange={onProfileChange} />
|
||||
)}
|
||||
<Stack justifyContent="space-between" height="auto">
|
||||
<h3>Tokens</h3>
|
||||
<h3>
|
||||
<Trans i18nKey="serviceaccounts.service-account-page-unconnected.tokens">Tokens</Trans>
|
||||
</h3>
|
||||
{!serviceAccount.isExternal && (
|
||||
<Button
|
||||
onClick={() => setIsTokenModalOpen(true)}
|
||||
@@ -188,7 +197,9 @@ export const ServiceAccountPageUnconnected = ({
|
||||
key="add-service-account-token"
|
||||
icon="plus"
|
||||
>
|
||||
Add service account token
|
||||
<Trans i18nKey="serviceaccounts.service-account-page-unconnected.add-service-account-token">
|
||||
Add service account token
|
||||
</Trans>
|
||||
</Button>
|
||||
)}
|
||||
</Stack>
|
||||
@@ -207,7 +218,10 @@ export const ServiceAccountPageUnconnected = ({
|
||||
|
||||
<ConfirmModal
|
||||
isOpen={isDeleteModalOpen}
|
||||
title="Delete service account"
|
||||
title={t(
|
||||
'serviceaccounts.service-account-page-unconnected.title-delete-service-account',
|
||||
'Delete service account'
|
||||
)}
|
||||
body="Are you sure you want to delete this service account?"
|
||||
confirmText="Delete service account"
|
||||
onConfirm={handleServiceAccountDelete}
|
||||
@@ -215,7 +229,10 @@ export const ServiceAccountPageUnconnected = ({
|
||||
/>
|
||||
<ConfirmModal
|
||||
isOpen={isDisableModalOpen}
|
||||
title="Disable service account"
|
||||
title={t(
|
||||
'serviceaccounts.service-account-page-unconnected.title-disable-service-account',
|
||||
'Disable service account'
|
||||
)}
|
||||
body="Are you sure you want to disable this service account?"
|
||||
confirmText="Disable service account"
|
||||
onConfirm={handleServiceAccountDisable}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Permissions } from 'app/core/components/AccessControl';
|
||||
import { t } from 'app/core/internationalization';
|
||||
import { contextSrv } from 'app/core/services/context_srv';
|
||||
|
||||
import { AccessControlAction, ServiceAccountDTO } from '../../types';
|
||||
@@ -15,7 +16,7 @@ export const ServiceAccountPermissions = (props: ServiceAccountPermissionsProps)
|
||||
|
||||
return (
|
||||
<Permissions
|
||||
title="Permissions"
|
||||
title={t('serviceaccounts.service-account-permissions.title-permissions', 'Permissions')}
|
||||
addPermissionTitle="Add permission"
|
||||
buttonLabel="Add permission"
|
||||
resource="serviceaccounts"
|
||||
|
||||
@@ -15,6 +15,7 @@ import {
|
||||
} from '@grafana/ui';
|
||||
import { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker';
|
||||
import { contextSrv } from 'app/core/core';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
import { AccessControlAction, OrgRole, Role, ServiceAccountDTO } from 'app/types';
|
||||
|
||||
import { OrgRolePicker } from '../admin/OrgRolePicker';
|
||||
@@ -186,7 +187,7 @@ const getRoleCell = (
|
||||
)
|
||||
) : (
|
||||
<OrgRolePicker
|
||||
aria-label="Role"
|
||||
aria-label={t('serviceaccounts.get-role-cell.aria-label-role', 'Role')}
|
||||
value={value}
|
||||
disabled={original.isExternal || !canUpdateRole || original.isDisabled}
|
||||
onChange={(newRole) => onRoleChange(newRole, original)}
|
||||
@@ -210,17 +211,17 @@ const getActionsCell = (
|
||||
<Stack alignItems="center" justifyContent="flex-end">
|
||||
{contextSrv.hasPermission(AccessControlAction.ServiceAccountsWrite) && !original.tokens && (
|
||||
<Button onClick={() => onAddTokenClick(original)} disabled={original.isDisabled}>
|
||||
Add token
|
||||
<Trans i18nKey="serviceaccounts.get-actions-cell.add-token">Add token</Trans>
|
||||
</Button>
|
||||
)}
|
||||
{contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsWrite, original) &&
|
||||
(original.isDisabled ? (
|
||||
<Button variant="secondary" size="md" onClick={() => onEnable(original)}>
|
||||
Enable
|
||||
<Trans i18nKey="serviceaccounts.get-actions-cell.enable">Enable</Trans>
|
||||
</Button>
|
||||
) : (
|
||||
<Button variant="secondary" size="md" onClick={() => onDisable(original)}>
|
||||
Disable
|
||||
<Trans i18nKey="serviceaccounts.get-actions-cell.disable">Disable</Trans>
|
||||
</Button>
|
||||
))}
|
||||
|
||||
|
||||
@@ -197,7 +197,9 @@ export const ServiceAccountsListPageUnconnected = ({
|
||||
<>
|
||||
{!noServiceAccountsCreated && contextSrv.hasPermission(AccessControlAction.ServiceAccountsCreate) && (
|
||||
<LinkButton href="org/serviceaccounts/create" variant="primary">
|
||||
Add service account
|
||||
<Trans i18nKey="serviceaccounts.service-accounts-list-page-unconnected.add-service-account">
|
||||
Add service account
|
||||
</Trans>
|
||||
</LinkButton>
|
||||
)}
|
||||
</>
|
||||
@@ -208,7 +210,10 @@ export const ServiceAccountsListPageUnconnected = ({
|
||||
<InlineField grow>
|
||||
<FilterInput
|
||||
className={styles.filterInput}
|
||||
placeholder="Search service account by name"
|
||||
placeholder={t(
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.placeholder-search-service-account-by-name',
|
||||
'Search service account by name'
|
||||
)}
|
||||
value={query}
|
||||
onChange={onQueryChange}
|
||||
/>
|
||||
@@ -277,13 +282,19 @@ export const ServiceAccountsListPageUnconnected = ({
|
||||
: ''
|
||||
}?`}
|
||||
confirmText="Delete"
|
||||
title="Delete service account"
|
||||
title={t(
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.title-delete-service-account',
|
||||
'Delete service account'
|
||||
)}
|
||||
onConfirm={onServiceAccountRemove}
|
||||
onDismiss={onRemoveModalClose}
|
||||
/>
|
||||
<ConfirmModal
|
||||
isOpen={isDisableModalOpen}
|
||||
title="Disable service account"
|
||||
title={t(
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.title-disable-service-account',
|
||||
'Disable service account'
|
||||
)}
|
||||
body={`Are you sure you want to disable '${currentServiceAccount.name}'?`}
|
||||
confirmText="Disable service account"
|
||||
onConfirm={onDisable}
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
RadioButtonGroup,
|
||||
useStyles2,
|
||||
} from '@grafana/ui';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
const EXPIRATION_OPTIONS = [
|
||||
{ label: 'No expiration', value: false },
|
||||
@@ -88,8 +89,11 @@ export const CreateTokenModal = ({ isOpen, token, serviceAccountLogin, onCreateT
|
||||
{!token ? (
|
||||
<div>
|
||||
<Field
|
||||
label="Display name"
|
||||
description="Name to easily identify the token"
|
||||
label={t('serviceaccounts.create-token-modal.label-display-name', 'Display name')}
|
||||
description={t(
|
||||
'serviceaccounts.create-token-modal.description-name-to-easily-identify-the-token',
|
||||
'Name to easily identify the token'
|
||||
)}
|
||||
// for now this is required
|
||||
// need to make this optional in backend as well
|
||||
required={true}
|
||||
@@ -103,7 +107,7 @@ export const CreateTokenModal = ({ isOpen, token, serviceAccountLogin, onCreateT
|
||||
}}
|
||||
/>
|
||||
</Field>
|
||||
<Field label="Expiration">
|
||||
<Field label={t('serviceaccounts.create-token-modal.label-expiration', 'Expiration')}>
|
||||
<RadioButtonGroup
|
||||
options={EXPIRATION_OPTIONS}
|
||||
value={isWithExpirationDate}
|
||||
@@ -112,7 +116,7 @@ export const CreateTokenModal = ({ isOpen, token, serviceAccountLogin, onCreateT
|
||||
/>
|
||||
</Field>
|
||||
{isWithExpirationDate && (
|
||||
<Field label="Expiration date">
|
||||
<Field label={t('serviceaccounts.create-token-modal.label-expiration-date', 'Expiration date')}>
|
||||
<DatePickerWithInput
|
||||
onChange={onExpirationDateChange}
|
||||
value={newTokenExpirationDate}
|
||||
@@ -124,14 +128,14 @@ export const CreateTokenModal = ({ isOpen, token, serviceAccountLogin, onCreateT
|
||||
)}
|
||||
<Modal.ButtonRow>
|
||||
<Button onClick={onGenerateToken} disabled={isWithExpirationDate && !isExpirationDateValid}>
|
||||
Generate token
|
||||
<Trans i18nKey="serviceaccounts.create-token-modal.generate-token">Generate token</Trans>
|
||||
</Button>
|
||||
</Modal.ButtonRow>
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
<Field
|
||||
label="Token"
|
||||
label={t('serviceaccounts.create-token-modal.label-token', 'Token')}
|
||||
description="Copy the token now as you will not be able to see it again. Losing a token requires creating a new one."
|
||||
>
|
||||
<div className={styles.modalTokenRow}>
|
||||
@@ -143,16 +147,18 @@ export const CreateTokenModal = ({ isOpen, token, serviceAccountLogin, onCreateT
|
||||
icon="copy"
|
||||
getText={() => token}
|
||||
>
|
||||
Copy clipboard
|
||||
<Trans i18nKey="serviceaccounts.create-token-modal.copy-clipboard">Copy to clipboard</Trans>
|
||||
</ClipboardButton>
|
||||
</div>
|
||||
</Field>
|
||||
<Modal.ButtonRow>
|
||||
<ClipboardButton variant="primary" getText={() => token} onClipboardCopy={onCloseInternal}>
|
||||
Copy to clipboard and close
|
||||
<Trans i18nKey="serviceaccounts.create-token-modal.copy-to-clipboard-and-close">
|
||||
Copy to clipboard and close
|
||||
</Trans>
|
||||
</ClipboardButton>
|
||||
<Button variant="secondary" onClick={onCloseInternal}>
|
||||
Close
|
||||
<Trans i18nKey="serviceaccounts.create-token-modal.close">Close</Trans>
|
||||
</Button>
|
||||
</Modal.ButtonRow>
|
||||
</>
|
||||
|
||||
@@ -5,6 +5,7 @@ import { GrafanaTheme2, OrgRole, TimeZone, dateTimeFormat } from '@grafana/data'
|
||||
import { Label, TextLink, useStyles2 } from '@grafana/ui';
|
||||
import { fetchRoleOptions } from 'app/core/components/RolePicker/api';
|
||||
import { contextSrv } from 'app/core/core';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
import { AccessControlAction, Role, ServiceAccountDTO } from 'app/types';
|
||||
|
||||
import { ServiceAccountProfileRow } from './ServiceAccountProfileRow';
|
||||
@@ -47,38 +48,46 @@ export function ServiceAccountProfile({ serviceAccount, timeZone, onChange }: Pr
|
||||
|
||||
return (
|
||||
<div className={styles.section}>
|
||||
<h3>Information</h3>
|
||||
<h3>
|
||||
<Trans i18nKey="serviceaccounts.service-account-profile.information">Information</Trans>
|
||||
</h3>
|
||||
<table className="filter-table">
|
||||
<tbody>
|
||||
{serviceAccount.id && (
|
||||
<ServiceAccountProfileRow
|
||||
label="Numerical identifier"
|
||||
label={t('serviceaccounts.service-account-profile.label-numerical-identifier', 'Numerical identifier')}
|
||||
value={serviceAccount.id.toString()}
|
||||
disabled={true}
|
||||
/>
|
||||
)}
|
||||
<ServiceAccountProfileRow
|
||||
label="Name"
|
||||
label={t('serviceaccounts.service-account-profile.label-name', 'Name')}
|
||||
value={serviceAccount.name}
|
||||
onChange={!serviceAccount.isExternal ? onNameChange : undefined}
|
||||
disabled={!ableToWrite || serviceAccount.isDisabled}
|
||||
/>
|
||||
<ServiceAccountProfileRow label="ID" value={serviceAccount.login} disabled={serviceAccount.isDisabled} />
|
||||
<ServiceAccountProfileRow
|
||||
label={t('serviceaccounts.service-account-profile.label-id', 'ID')}
|
||||
value={serviceAccount.login}
|
||||
disabled={serviceAccount.isDisabled}
|
||||
/>
|
||||
<ServiceAccountRoleRow
|
||||
label="Roles"
|
||||
label={t('serviceaccounts.service-account-profile.label-roles', 'Roles')}
|
||||
serviceAccount={serviceAccount}
|
||||
onRoleChange={onRoleChange}
|
||||
roleOptions={roles}
|
||||
/>
|
||||
<ServiceAccountProfileRow
|
||||
label="Creation date"
|
||||
label={t('serviceaccounts.service-account-profile.label-creation-date', 'Creation date')}
|
||||
value={dateTimeFormat(serviceAccount.createdAt, { timeZone })}
|
||||
disabled={serviceAccount.isDisabled}
|
||||
/>
|
||||
{serviceAccount.isExternal && serviceAccount.requiredBy && (
|
||||
<tr>
|
||||
<td>
|
||||
<Label>Used by</Label>
|
||||
<Label>
|
||||
<Trans i18nKey="serviceaccounts.service-account-profile.used-by">Used by</Trans>
|
||||
</Label>
|
||||
</td>
|
||||
<td>
|
||||
<TextLink href={`/plugins/${serviceAccount.requiredBy}`}>{serviceAccount.requiredBy}</TextLink>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Label } from '@grafana/ui';
|
||||
import { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker';
|
||||
import { contextSrv } from 'app/core/core';
|
||||
import { t } from 'app/core/internationalization';
|
||||
import { OrgRolePicker } from 'app/features/admin/OrgRolePicker';
|
||||
import { AccessControlAction, OrgRole, Role, ServiceAccountDTO } from 'app/types';
|
||||
|
||||
@@ -38,7 +39,7 @@ export const ServiceAccountRoleRow = ({ label, serviceAccount, roleOptions, onRo
|
||||
<OrgRolePicker
|
||||
width={24}
|
||||
inputId={inputId}
|
||||
aria-label="Role"
|
||||
aria-label={t('serviceaccounts.service-account-role-row.aria-label-role', 'Role')}
|
||||
value={serviceAccount.role}
|
||||
disabled={serviceAccount.isExternal || serviceAccount.isDisabled}
|
||||
onChange={onRoleChange}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { css, cx } from '@emotion/css';
|
||||
|
||||
import { dateTimeFormat, GrafanaTheme2, TimeZone } from '@grafana/data';
|
||||
import { DeleteButton, Icon, Tooltip, useStyles2, useTheme2 } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
import { ApiKey } from 'app/types';
|
||||
|
||||
interface Props {
|
||||
@@ -19,10 +20,18 @@ export const ServiceAccountTokensTable = ({ tokens, timeZone, tokenActionsDisabl
|
||||
<table className={cx(styles.section, 'filter-table')}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Expires</th>
|
||||
<th>Created</th>
|
||||
<th>Last used at</th>
|
||||
<th>
|
||||
<Trans i18nKey="serviceaccounts.service-account-tokens-table.name">Name</Trans>
|
||||
</th>
|
||||
<th>
|
||||
<Trans i18nKey="serviceaccounts.service-account-tokens-table.expires">Expires</Trans>
|
||||
</th>
|
||||
<th>
|
||||
<Trans i18nKey="serviceaccounts.service-account-tokens-table.created">Created</Trans>
|
||||
</th>
|
||||
<th>
|
||||
<Trans i18nKey="serviceaccounts.service-account-tokens-table.last-used-at">Last used at</Trans>
|
||||
</th>
|
||||
<th />
|
||||
<th />
|
||||
</tr>
|
||||
@@ -96,7 +105,11 @@ interface TokenExpirationProps {
|
||||
const TokenExpiration = ({ timeZone, token }: TokenExpirationProps) => {
|
||||
const styles = useStyles2(getStyles);
|
||||
if (!token.expiration) {
|
||||
return <span className={styles.neverExpire}>Never</span>;
|
||||
return (
|
||||
<span className={styles.neverExpire}>
|
||||
<Trans i18nKey="serviceaccounts.token-expiration.never">Never</Trans>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
if (token.secondsUntilExpiration) {
|
||||
return (
|
||||
|
||||
@@ -7,6 +7,7 @@ import { Button, Icon, IconButton, Stack, useStyles2 } from '@grafana/ui';
|
||||
import { SkeletonComponent, attachSkeleton } from '@grafana/ui/unstable';
|
||||
import { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker';
|
||||
import { contextSrv } from 'app/core/core';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
import { OrgRolePicker } from 'app/features/admin/OrgRolePicker';
|
||||
import { AccessControlAction, Role, ServiceAccountDTO } from 'app/types';
|
||||
|
||||
@@ -91,7 +92,7 @@ const ServiceAccountListItemComponent = memo(
|
||||
) : (
|
||||
<td>
|
||||
<OrgRolePicker
|
||||
aria-label="Role"
|
||||
aria-label={t('serviceaccounts.service-account-list-item.aria-label-role', 'Role')}
|
||||
value={serviceAccount.role}
|
||||
disabled={serviceAccount.isExternal || !canUpdateRole || serviceAccount.isDisabled}
|
||||
onChange={(newRole) => onRoleChange(newRole, serviceAccount)}
|
||||
@@ -102,7 +103,7 @@ const ServiceAccountListItemComponent = memo(
|
||||
<a
|
||||
className="ellipsis"
|
||||
href={editUrl}
|
||||
title="Tokens"
|
||||
title={t('serviceaccounts.service-account-list-item.title-tokens', 'Tokens')}
|
||||
aria-label={getServiceAccountsAriaLabel(serviceAccount.name)}
|
||||
>
|
||||
<div className={cx(styles.tokensInfo, { [styles.tokensInfoSecondary]: !serviceAccount.tokens })}>
|
||||
@@ -122,17 +123,17 @@ const ServiceAccountListItemComponent = memo(
|
||||
disabled={serviceAccount.isDisabled}
|
||||
className={styles.actionButton}
|
||||
>
|
||||
Add token
|
||||
<Trans i18nKey="serviceaccounts.service-account-list-item.add-token">Add token</Trans>
|
||||
</Button>
|
||||
)}
|
||||
{contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsWrite, serviceAccount) &&
|
||||
(serviceAccount.isDisabled ? (
|
||||
<Button variant="primary" onClick={() => onEnable(serviceAccount)} className={styles.actionButton}>
|
||||
Enable
|
||||
<Trans i18nKey="serviceaccounts.service-account-list-item.enable">Enable</Trans>
|
||||
</Button>
|
||||
) : (
|
||||
<Button variant="secondary" onClick={() => onDisable(serviceAccount)} className={styles.actionButton}>
|
||||
Disable
|
||||
<Trans i18nKey="serviceaccounts.service-account-list-item.disable">Disable</Trans>
|
||||
</Button>
|
||||
))}
|
||||
{contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsDelete, serviceAccount) && (
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
AdHocFiltersVariable,
|
||||
} from '@grafana/scenes';
|
||||
import { Button } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
import { reportExploreMetrics } from '../interactions';
|
||||
import { VAR_OTEL_AND_METRIC_FILTERS, VAR_OTEL_GROUP_LEFT, VAR_OTEL_RESOURCES } from '../shared';
|
||||
@@ -87,7 +88,7 @@ export class AddToFiltersGraphAction extends SceneObjectBase<AddToFiltersGraphAc
|
||||
|
||||
return (
|
||||
<Button variant="secondary" size="sm" fill="solid" onClick={model.onClick}>
|
||||
Add to filters
|
||||
<Trans i18nKey="trails.add-to-filters-graph-action.add-to-filters">Add to filters</Trans>
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -2,6 +2,7 @@ import { ChangeEvent } from 'react';
|
||||
|
||||
import { BusEventBase } from '@grafana/data';
|
||||
import { SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { ByFrameRepeater } from './ByFrameRepeater';
|
||||
import { LabelBreakdownScene } from './LabelBreakdownScene';
|
||||
@@ -34,7 +35,7 @@ export class BreakdownSearchScene extends SceneObjectBase<BreakdownSearchSceneSt
|
||||
value={filter}
|
||||
onChange={model.onValueFilterChange}
|
||||
onClear={model.clearValueFilter}
|
||||
placeholder="Search for value"
|
||||
placeholder={t('trails.breakdown-search-scene.placeholder-search-for-value', 'Search for value')}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -28,7 +28,7 @@ import {
|
||||
} from '@grafana/scenes';
|
||||
import { DataQuery, SortOrder, TooltipDisplayMode } from '@grafana/schema';
|
||||
import { Alert, Button, Field, LoadingPlaceholder, useStyles2 } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { BreakdownLabelSelector } from '../BreakdownLabelSelector';
|
||||
import { DataTrail } from '../DataTrail';
|
||||
@@ -374,14 +374,14 @@ export class LabelBreakdownScene extends SceneObjectBase<LabelBreakdownSceneStat
|
||||
|
||||
{value !== ALL_VARIABLE_VALUE && (
|
||||
<>
|
||||
<Field label="Search" className={styles.searchField}>
|
||||
<Field label={t('trails.label-breakdown-scene.label-search', 'Search')} className={styles.searchField}>
|
||||
<search.Component model={search} />
|
||||
</Field>
|
||||
<sortBy.Component model={sortBy} />
|
||||
</>
|
||||
)}
|
||||
{body instanceof LayoutSwitcher && (
|
||||
<Field label="View">
|
||||
<Field label={t('trails.label-breakdown-scene.label-view', 'View')}>
|
||||
<body.Selector model={body} />
|
||||
</Field>
|
||||
)}
|
||||
@@ -585,7 +585,7 @@ function buildNormalLayout(
|
||||
children: [
|
||||
new SceneFlexItem({
|
||||
body: new SceneReactObject({
|
||||
reactNode: <LoadingPlaceholder text="Loading..." />,
|
||||
reactNode: <LoadingPlaceholder text={t('trails.build-normal-layout.text-loading', 'Loading...')} />,
|
||||
}),
|
||||
}),
|
||||
],
|
||||
|
||||
@@ -3,6 +3,7 @@ import { css } from '@emotion/css';
|
||||
import { BusEventBase, GrafanaTheme2, SelectableValue } from '@grafana/data';
|
||||
import { SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes';
|
||||
import { IconButton, Select, Field, useStyles2 } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { Trans } from '../../../core/internationalization';
|
||||
import { getSortByPreference, setSortByPreference } from '../services/store';
|
||||
@@ -79,7 +80,10 @@ export class SortByScene extends SceneObjectBase<SortBySceneState> {
|
||||
name={'info-circle'}
|
||||
size="sm"
|
||||
variant={'secondary'}
|
||||
tooltip="Sorts values using standard or smart time series calculations."
|
||||
tooltip={t(
|
||||
'trails.sort-by-scene.tooltip-sorts-values-using-standard-smart-series',
|
||||
'Sorts values using standard or smart time series calculations.'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import { useMemo } from 'react';
|
||||
import { dateTimeFormat, GrafanaTheme2 } from '@grafana/data';
|
||||
import { AdHocFiltersVariable, sceneGraph } from '@grafana/scenes';
|
||||
import { Card, IconButton, useStyles2 } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { DataTrail } from './DataTrail';
|
||||
import { getTrailStore, DataTrailBookmark } from './TrailStore/TrailStore';
|
||||
@@ -79,7 +79,7 @@ export function DataTrailCard(props: Props) {
|
||||
key="delete"
|
||||
name="trash-alt"
|
||||
className={styles.secondary}
|
||||
tooltip="Remove bookmark"
|
||||
tooltip={t('trails.data-trail-card.deleteButton-tooltip-remove-bookmark', 'Remove bookmark')}
|
||||
onClick={onDelete}
|
||||
data-testid="deleteButton"
|
||||
/>
|
||||
|
||||
@@ -50,7 +50,9 @@ export class DataTrailSettings extends SceneObjectBase<DataTrailSettingsState> {
|
||||
return (
|
||||
/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */
|
||||
<div className={styles.popover} onClick={(evt) => evt.stopPropagation()}>
|
||||
<div className={styles.heading}>Settings</div>
|
||||
<div className={styles.heading}>
|
||||
<Trans i18nKey="trails.data-trail-settings.render-popover.settings">Settings</Trans>
|
||||
</div>
|
||||
{topScene instanceof MetricScene && (
|
||||
<div className={styles.options}>
|
||||
<div>
|
||||
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
} from '@grafana/scenes';
|
||||
import { Stack, Tooltip, useStyles2 } from '@grafana/ui';
|
||||
import { appEvents } from 'app/core/app_events';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
import { RecordHistoryEntryEvent } from 'app/types/events';
|
||||
|
||||
import { DataTrail, DataTrailState, getTopSceneFor } from './DataTrail';
|
||||
@@ -305,7 +306,9 @@ export class DataTrailHistory extends SceneObjectBase<DataTrailsHistoryState> {
|
||||
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<div className={styles.heading}>History</div>
|
||||
<div className={styles.heading}>
|
||||
<Trans i18nKey="trails.data-trail-history.history">History</Trans>
|
||||
</div>
|
||||
{steps.map((step, index) => {
|
||||
let stepType = step.type;
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
SceneVariableSet,
|
||||
} from '@grafana/scenes';
|
||||
import { Box, Icon, LinkButton, Stack, Tab, TabsBar, ToolbarButton, Tooltip, useStyles2 } from '@grafana/ui';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { getExploreUrl } from '../../core/utils/explore';
|
||||
|
||||
@@ -182,18 +183,21 @@ export class MetricActionBar extends SceneObjectBase<MetricActionBarState> {
|
||||
<Stack gap={1}>
|
||||
<ToolbarButton
|
||||
variant={'canvas'}
|
||||
tooltip="Remove existing metric and choose a new metric"
|
||||
tooltip={t(
|
||||
'trails.metric-action-bar.tooltip-remove-existing-metric-choose',
|
||||
'Remove existing metric and choose a new metric'
|
||||
)}
|
||||
onClick={() => {
|
||||
reportExploreMetrics('selected_metric_action_clicked', { action: 'unselect' });
|
||||
trail.publishEvent(new MetricSelectedEvent(undefined));
|
||||
}}
|
||||
>
|
||||
Select new metric
|
||||
<Trans i18nKey="trails.metric-action-bar.select-new-metric">Select new metric</Trans>
|
||||
</ToolbarButton>
|
||||
<ToolbarButton
|
||||
variant={'canvas'}
|
||||
icon="compass"
|
||||
tooltip="Open in explore"
|
||||
tooltip={t('trails.metric-action-bar.tooltip-open-in-explore', 'Open in explore')}
|
||||
onClick={model.openExploreLink}
|
||||
/>
|
||||
<ShareTrailButton trail={trail} />
|
||||
@@ -215,7 +219,7 @@ export class MetricActionBar extends SceneObjectBase<MetricActionBarState> {
|
||||
variant={'secondary'}
|
||||
onClick={() => reportExploreMetrics('selected_metric_action_clicked', { action: 'open_from_embedded' })}
|
||||
>
|
||||
Open
|
||||
<Trans i18nKey="trails.metric-action-bar.open">Open</Trans>
|
||||
</LinkButton>
|
||||
)}
|
||||
</Stack>
|
||||
|
||||
@@ -26,7 +26,7 @@ import {
|
||||
VariableDependencyConfig,
|
||||
} from '@grafana/scenes';
|
||||
import { Alert, Badge, Field, Icon, IconButton, InlineSwitch, Input, Select, Tooltip, useStyles2 } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { MetricScene } from '../MetricScene';
|
||||
import { StatusWrapper } from '../StatusWrapper';
|
||||
@@ -523,6 +523,10 @@ export class MetricSelectScene extends SceneObjectBase<MetricSelectSceneState> i
|
||||
|
||||
const isLoading = metricNamesLoading && children.length === 0;
|
||||
|
||||
const unableToRetrieveMetricNames = t(
|
||||
'trails.metric-select-scene.unable-to-retrieve-metric-names',
|
||||
'Unable to retrieve metric names'
|
||||
);
|
||||
const blockingMessage = isLoading
|
||||
? undefined
|
||||
: missingOtelTargets
|
||||
@@ -535,7 +539,7 @@ export class MetricSelectScene extends SceneObjectBase<MetricSelectSceneState> i
|
||||
<Tooltip
|
||||
content={
|
||||
<>
|
||||
<h4>Unable to retrieve metric names</h4>
|
||||
<h4>{unableToRetrieveMetricNames}</h4>
|
||||
<p>{metricNamesWarning}</p>
|
||||
</>
|
||||
}
|
||||
@@ -549,7 +553,7 @@ export class MetricSelectScene extends SceneObjectBase<MetricSelectSceneState> i
|
||||
<div className={styles.header}>
|
||||
<Field label={'Search metrics'} className={styles.searchField}>
|
||||
<Input
|
||||
placeholder="Search metrics"
|
||||
placeholder={t('trails.metric-select-scene.placeholder-search-metrics', 'Search metrics')}
|
||||
prefix={<Icon name={'search'} />}
|
||||
value={metricSearch}
|
||||
onChange={model.onSearchQueryChange}
|
||||
@@ -616,7 +620,7 @@ export class MetricSelectScene extends SceneObjectBase<MetricSelectSceneState> i
|
||||
<InlineSwitch
|
||||
disabled={!isStandardOtel}
|
||||
showLabel={true}
|
||||
label="OTel experience"
|
||||
label={t('trails.metric-select-scene.label-otel-experience', 'OTel experience')}
|
||||
value={useOtelExperience}
|
||||
onChange={model.onToggleOtelExperience}
|
||||
/>
|
||||
@@ -625,14 +629,17 @@ export class MetricSelectScene extends SceneObjectBase<MetricSelectSceneState> i
|
||||
)}
|
||||
</div>
|
||||
{metricNamesError && (
|
||||
<Alert title="Unable to retrieve metric names" severity="error">
|
||||
<Alert title={unableToRetrieveMetricNames} severity="error">
|
||||
<div>We are unable to connect to your data source. Double check your data source URL and credentials.</div>
|
||||
<div>({metricNamesError})</div>
|
||||
</Alert>
|
||||
)}
|
||||
{metricNamesWarning && !warningDismissed && (
|
||||
<Alert
|
||||
title="Unable to retrieve all metric names"
|
||||
title={t(
|
||||
'trails.metric-select-scene.title-unable-to-retrieve-all-metric-names',
|
||||
'Unable to retrieve all metric names'
|
||||
)}
|
||||
severity="warning"
|
||||
onSubmit={dismissWarning}
|
||||
onRemove={dismissWarning}
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
import { Stack, Text } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
export const MetricsHeader = () => (
|
||||
<Stack direction="column" gap={1}>
|
||||
<Text variant="h1">Metrics</Text>
|
||||
<Text color="secondary">Explore your Prometheus-compatible metrics without writing a query</Text>
|
||||
<Text variant="h1">
|
||||
<Trans i18nKey="trails.metrics-header.metrics">Metrics</Trans>
|
||||
</Text>
|
||||
<Text color="secondary">
|
||||
<Trans i18nKey="trails.metrics-header.explore-prometheuscompatible-metrics-without-writing-query">
|
||||
Explore your Prometheus-compatible metrics without writing a query
|
||||
</Trans>
|
||||
</Text>
|
||||
</Stack>
|
||||
);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { LinkButton, Stack } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
import { createSuccessNotification } from '../../../core/copy/appNotification';
|
||||
import { HOME_ROUTE } from '../shared';
|
||||
@@ -12,7 +13,7 @@ export function createBookmarkSavedNotification() {
|
||||
You can view bookmarks under <i>Explore > Metrics</i>
|
||||
</div>
|
||||
<LinkButton fill={'solid'} variant={'secondary'} href={HOME_ROUTE}>
|
||||
View bookmarks
|
||||
<Trans i18nKey="trails.create-bookmark-saved-notification.view-bookmarks">View bookmarks</Trans>
|
||||
</LinkButton>
|
||||
</Stack>
|
||||
);
|
||||
|
||||
+6
-5
@@ -3,6 +3,7 @@ import { useCallback } from 'react';
|
||||
import { Field, SelectableValue, valueMatchers } from '@grafana/data';
|
||||
import { FilterByValueFilter } from '@grafana/data/internal';
|
||||
import { Button, Select, InlineField, InlineFieldRow, Box } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { valueMatchersUI } from './ValueMatchers/valueMatchersUI';
|
||||
|
||||
@@ -76,25 +77,25 @@ export const FilterByValueFilterEditor = (props: Props) => {
|
||||
|
||||
return (
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Field" labelWidth={14}>
|
||||
<InlineField label={t('transformers.filter-by-value-filter-editor.label-field', 'Field')} labelWidth={14}>
|
||||
<Select
|
||||
className="min-width-15 max-width-24"
|
||||
placeholder="Field Name"
|
||||
placeholder={t('transformers.filter-by-value-filter-editor.placeholder-field-name', 'Field name')}
|
||||
options={fieldsAsOptions}
|
||||
value={filter.fieldName}
|
||||
onChange={onChangeField}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Match">
|
||||
<InlineField label={t('transformers.filter-by-value-filter-editor.label-match', 'Match')}>
|
||||
<Select
|
||||
className="width-12"
|
||||
placeholder="Select test"
|
||||
placeholder={t('transformers.filter-by-value-filter-editor.placeholder-select-test', 'Select test')}
|
||||
options={matcherOptions}
|
||||
value={matcherId}
|
||||
onChange={onChangeMatcher}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Value" grow>
|
||||
<InlineField label={t('transformers.filter-by-value-filter-editor.label-value', 'Value')} grow>
|
||||
<editor.component field={field} options={filter.config.options ?? {}} onChange={onChangeMatcherOptions} />
|
||||
</InlineField>
|
||||
<Box marginBottom={0.5}>
|
||||
|
||||
+10
-3
@@ -21,6 +21,7 @@ import {
|
||||
FilterByValueType,
|
||||
} from '@grafana/data/internal';
|
||||
import { Button, RadioButtonGroup, InlineField, Box } from '@grafana/ui';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -101,12 +102,18 @@ export const FilterByValueTransformerEditor = (props: TransformerUIProps<FilterB
|
||||
|
||||
return (
|
||||
<div>
|
||||
<InlineField label="Filter type" labelWidth={16}>
|
||||
<InlineField
|
||||
label={t('transformers.filter-by-value-transformer-editor.label-filter-type', 'Filter type')}
|
||||
labelWidth={16}
|
||||
>
|
||||
<div className="width-15">
|
||||
<RadioButtonGroup options={filterTypes} value={options.type} onChange={onChangeType} fullWidth />
|
||||
</div>
|
||||
</InlineField>
|
||||
<InlineField label="Conditions" labelWidth={16}>
|
||||
<InlineField
|
||||
label={t('transformers.filter-by-value-transformer-editor.label-conditions', 'Conditions')}
|
||||
labelWidth={16}
|
||||
>
|
||||
<div className="width-15">
|
||||
<RadioButtonGroup options={filterMatch} value={options.match} onChange={onChangeMatch} fullWidth />
|
||||
</div>
|
||||
@@ -122,7 +129,7 @@ export const FilterByValueTransformerEditor = (props: TransformerUIProps<FilterB
|
||||
/>
|
||||
))}
|
||||
<Button icon="plus" size="sm" onClick={onAddFilter} variant="secondary">
|
||||
Add condition
|
||||
<Trans i18nKey="transformers.filter-by-value-transformer-editor.add-condition">Add condition</Trans>
|
||||
</Button>
|
||||
</Box>
|
||||
</div>
|
||||
|
||||
+2
-1
@@ -2,6 +2,7 @@ import { useCallback, useState } from 'react';
|
||||
import * as React from 'react';
|
||||
|
||||
import { ValueMatcherID, BasicValueMatcherOptions } from '@grafana/data';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { SuggestionsInput } from '../../suggestionsInput/SuggestionsInput';
|
||||
import { getVariableSuggestions, numberOrVariableValidator } from '../../utils';
|
||||
@@ -33,7 +34,7 @@ export function basicMatcherEditor<T = any>(
|
||||
value={value}
|
||||
error={'Value needs to be a number or a variable'}
|
||||
onChange={onChangeVariableValue}
|
||||
placeholder="Value or variable"
|
||||
placeholder={t('transformers.basic-matcher-editor.placeholder-value-or-variable', 'Value or variable')}
|
||||
suggestions={getVariableSuggestions()}
|
||||
/>
|
||||
);
|
||||
|
||||
+6
-3
@@ -3,6 +3,7 @@ import * as React from 'react';
|
||||
|
||||
import { ValueMatcherID, RangeValueMatcherOptions } from '@grafana/data';
|
||||
import { InlineLabel } from '@grafana/ui';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { SuggestionsInput } from '../../suggestionsInput/SuggestionsInput';
|
||||
import { getVariableSuggestions, numberOrVariableValidator } from '../../utils';
|
||||
@@ -50,16 +51,18 @@ export function rangeMatcherEditor<T = any>(
|
||||
value={String(options.from)}
|
||||
invalid={isInvalid.from}
|
||||
error={'Value needs to be a number or a variable'}
|
||||
placeholder="From"
|
||||
placeholder={t('transformers.range-matcher-editor.placeholder-from', 'From')}
|
||||
onChange={(val) => onChangeOptionsSuggestions(val, 'from')}
|
||||
suggestions={suggestions}
|
||||
/>
|
||||
<InlineLabel>and</InlineLabel>
|
||||
<InlineLabel>
|
||||
<Trans i18nKey="transformers.range-matcher-editor.and">and</Trans>
|
||||
</InlineLabel>
|
||||
<SuggestionsInput
|
||||
invalid={isInvalid.to}
|
||||
error={'Value needs to be a number or a variable'}
|
||||
value={String(options.to)}
|
||||
placeholder="To"
|
||||
placeholder={t('transformers.range-matcher-editor.placeholder-to', 'To')}
|
||||
suggestions={suggestions}
|
||||
onChange={(val) => onChangeOptionsSuggestions(val, 'to')}
|
||||
/>
|
||||
|
||||
+2
-1
@@ -2,6 +2,7 @@ import { useCallback, useState } from 'react';
|
||||
import * as React from 'react';
|
||||
|
||||
import { ValueMatcherID, BasicValueMatcherOptions } from '@grafana/data';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { SuggestionsInput } from '../../suggestionsInput/SuggestionsInput';
|
||||
import { getVariableSuggestions } from '../../utils';
|
||||
@@ -32,7 +33,7 @@ export function regexMatcherEditor(
|
||||
invalid={isInvalid}
|
||||
value={value}
|
||||
onChange={onChangeVariableValue}
|
||||
placeholder="Value or variable"
|
||||
placeholder={t('transformers.regex-matcher-editor.placeholder-value-or-variable', 'Value or variable')}
|
||||
suggestions={getVariableSuggestions()}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -4,6 +4,7 @@ import { SelectableValue, StandardEditorProps, VariableOrigin } from '@grafana/d
|
||||
import { getTemplateSrv } from '@grafana/runtime';
|
||||
import { HeatmapCalculationBucketConfig, HeatmapCalculationMode } from '@grafana/schema';
|
||||
import { HorizontalGroup, RadioButtonGroup, ScaleDistribution } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { SuggestionsInput } from '../../suggestionsInput/SuggestionsInput';
|
||||
import { numberOrVariableValidator } from '../../utils';
|
||||
@@ -82,7 +83,7 @@ export const AxisEditor = ({ value, onChange, item }: StandardEditorProps<Heatma
|
||||
invalid={isInvalid}
|
||||
error={'Value needs to be an integer or a variable'}
|
||||
value={value?.value ?? ''}
|
||||
placeholder="Auto"
|
||||
placeholder={t('transformers.axis-editor.placeholder-auto', 'Auto')}
|
||||
onChange={(text) => {
|
||||
onValueChange({ ...value, value: text });
|
||||
}}
|
||||
|
||||
+14
-3
@@ -10,6 +10,7 @@ import {
|
||||
TransformerCategory,
|
||||
} from '@grafana/data';
|
||||
import { fieldMatchersUI, InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { FieldToConfigMappingEditor } from '../fieldToConfigMapping/FieldToConfigMappingEditor';
|
||||
@@ -54,17 +55,27 @@ export function ConfigFromQueryTransformerEditor({ input, onChange, options }: P
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Config query" labelWidth={20}>
|
||||
<InlineField
|
||||
label={t('transformers.config-from-query-transformer-editor.label-config-query', 'Config query')}
|
||||
labelWidth={20}
|
||||
>
|
||||
<Select onChange={onRefIdChange} options={refIds} value={currentRefId} width={30} />
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Apply to" labelWidth={20}>
|
||||
<InlineField
|
||||
label={t('transformers.config-from-query-transformer-editor.label-apply-to', 'Apply to')}
|
||||
labelWidth={20}
|
||||
>
|
||||
<Select onChange={onMatcherChange} options={matchers} value={currentMatcher.id} width={30} />
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Apply to options" labelWidth={20} className={styles.matcherOptions}>
|
||||
<InlineField
|
||||
label={t('transformers.config-from-query-transformer-editor.label-apply-to-options', 'Apply to options')}
|
||||
labelWidth={20}
|
||||
className={styles.matcherOptions}
|
||||
>
|
||||
<matcherUI.component
|
||||
matcher={matcherUI.matcher}
|
||||
data={input}
|
||||
|
||||
+13
-3
@@ -7,6 +7,7 @@ import {
|
||||
checkBinaryValueType,
|
||||
} from '@grafana/data/internal';
|
||||
import { getFieldTypeIconName, InlineField, InlineFieldRow, Select } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { LABEL_WIDTH } from './constants';
|
||||
|
||||
@@ -130,10 +131,16 @@ export const BinaryOperationOptionsEditor = (props: {
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Operation" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField
|
||||
label={t('transformers.binary-operation-options-editor.label-operation', 'Operation')}
|
||||
labelWidth={LABEL_WIDTH}
|
||||
>
|
||||
<Select
|
||||
allowCustomValue={true}
|
||||
placeholder="Field(s) or number"
|
||||
placeholder={t(
|
||||
'transformers.binary-operation-options-editor.placeholder-fields-or-number',
|
||||
'Field(s) or number'
|
||||
)}
|
||||
options={leftNames}
|
||||
className="min-width-18"
|
||||
value={JSON.stringify(binary?.left)}
|
||||
@@ -151,7 +158,10 @@ export const BinaryOperationOptionsEditor = (props: {
|
||||
<InlineField>
|
||||
<Select
|
||||
allowCustomValue={true}
|
||||
placeholder="Field or number"
|
||||
placeholder={t(
|
||||
'transformers.binary-operation-options-editor.placeholder-field-or-number',
|
||||
'Field or number'
|
||||
)}
|
||||
className="min-width-10"
|
||||
options={rightNames}
|
||||
value={JSON.stringify(binary?.right)}
|
||||
|
||||
+14
-3
@@ -24,6 +24,7 @@ import {
|
||||
} from '@grafana/data/internal';
|
||||
import { getTemplateSrv, config as cfg } from '@grafana/runtime';
|
||||
import { InlineField, InlineSwitch, Input, Select } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../../docs/getTransformationContent';
|
||||
|
||||
@@ -176,7 +177,10 @@ export const CalculateFieldTransformerEditor = (props: CalculateFieldTransformer
|
||||
|
||||
return (
|
||||
<>
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="Mode">
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.calculate-field-transformer-editor.label-mode', 'Mode')}
|
||||
>
|
||||
<Select
|
||||
className="width-18"
|
||||
options={calculationModes}
|
||||
@@ -215,7 +219,11 @@ export const CalculateFieldTransformerEditor = (props: CalculateFieldTransformer
|
||||
{mode === CalculateFieldMode.Index && (
|
||||
<IndexOptionsEditor options={options} onChange={props.onChange}></IndexOptionsEditor>
|
||||
)}
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="Alias" disabled={disableAlias}>
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.calculate-field-transformer-editor.label-alias', 'Alias')}
|
||||
disabled={disableAlias}
|
||||
>
|
||||
<Input
|
||||
className="width-18"
|
||||
value={options.alias ?? ''}
|
||||
@@ -223,7 +231,10 @@ export const CalculateFieldTransformerEditor = (props: CalculateFieldTransformer
|
||||
onChange={onAliasChanged}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="Replace all fields">
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.calculate-field-transformer-editor.label-replace-all-fields', 'Replace all fields')}
|
||||
>
|
||||
<InlineSwitch value={!!options.replaceFields} onChange={onToggleReplaceFields} />
|
||||
</InlineField>
|
||||
</>
|
||||
|
||||
+7
-3
@@ -1,6 +1,7 @@
|
||||
import { ReducerID, SelectableValue } from '@grafana/data';
|
||||
import { CalculateFieldMode, CalculateFieldTransformerOptions, CumulativeOptions } from '@grafana/data/internal';
|
||||
import { InlineField, Select, StatsPicker } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { LABEL_WIDTH } from './constants';
|
||||
|
||||
@@ -36,16 +37,19 @@ export const CumulativeOptionsEditor = (props: {
|
||||
|
||||
return (
|
||||
<>
|
||||
<InlineField label="Field" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField label={t('transformers.cumulative-options-editor.label-field', 'Field')} labelWidth={LABEL_WIDTH}>
|
||||
<Select
|
||||
placeholder="Field"
|
||||
placeholder={t('transformers.cumulative-options-editor.placeholder-field', 'Field')}
|
||||
options={selectOptions}
|
||||
className="min-width-18"
|
||||
value={cumulative?.field}
|
||||
onChange={onCumulativeFieldChange}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Calculation" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField
|
||||
label={t('transformers.cumulative-options-editor.label-calculation', 'Calculation')}
|
||||
labelWidth={LABEL_WIDTH}
|
||||
>
|
||||
<StatsPicker
|
||||
allowMultiple={false}
|
||||
className="width-18"
|
||||
|
||||
+9
-1
@@ -2,6 +2,7 @@ import * as React from 'react';
|
||||
|
||||
import { CalculateFieldTransformerOptions } from '@grafana/data/internal';
|
||||
import { InlineField, InlineSwitch } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { LABEL_WIDTH } from './constants';
|
||||
|
||||
@@ -22,7 +23,14 @@ export const IndexOptionsEditor = (props: {
|
||||
};
|
||||
return (
|
||||
<>
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="As percentile" tooltip="Transform the row index as a percentile.">
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.index-options-editor.label-as-percentile', 'As percentile')}
|
||||
tooltip={t(
|
||||
'transformers.index-options-editor.tooltip-transform-index-percentile',
|
||||
'Transform the row index as a percentile.'
|
||||
)}
|
||||
>
|
||||
<InlineSwitch value={!!index?.asPercentile} onChange={onToggleRowIndexAsPercentile} />
|
||||
</InlineField>
|
||||
</>
|
||||
|
||||
+10
-2
@@ -1,6 +1,7 @@
|
||||
import { ReducerID } from '@grafana/data';
|
||||
import { CalculateFieldTransformerOptions, ReduceOptions } from '@grafana/data/internal';
|
||||
import { FilterPill, HorizontalGroup, InlineField, StatsPicker } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { LABEL_WIDTH } from './constants';
|
||||
|
||||
@@ -44,7 +45,11 @@ export const ReduceRowOptionsEditor = (props: {
|
||||
|
||||
return (
|
||||
<>
|
||||
<InlineField label="Operation" labelWidth={LABEL_WIDTH} grow={true}>
|
||||
<InlineField
|
||||
label={t('transformers.reduce-row-options-editor.label-operation', 'Operation')}
|
||||
labelWidth={LABEL_WIDTH}
|
||||
grow={true}
|
||||
>
|
||||
<HorizontalGroup spacing="xs" align="flex-start" wrap>
|
||||
{names.map((o, i) => {
|
||||
return (
|
||||
@@ -60,7 +65,10 @@ export const ReduceRowOptionsEditor = (props: {
|
||||
})}
|
||||
</HorizontalGroup>
|
||||
</InlineField>
|
||||
<InlineField label="Calculation" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField
|
||||
label={t('transformers.reduce-row-options-editor.label-calculation', 'Calculation')}
|
||||
labelWidth={LABEL_WIDTH}
|
||||
>
|
||||
<StatsPicker
|
||||
allowMultiple={false}
|
||||
className="width-18"
|
||||
|
||||
+6
-2
@@ -1,6 +1,7 @@
|
||||
import { unaryOperators, SelectableValue, UnaryOperationID } from '@grafana/data';
|
||||
import { UnaryOptions, CalculateFieldMode, CalculateFieldTransformerOptions } from '@grafana/data/internal';
|
||||
import { InlineField, InlineFieldRow, InlineLabel, Select } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { LABEL_WIDTH } from './constants';
|
||||
|
||||
@@ -51,12 +52,15 @@ export const UnaryOperationEditor = (props: {
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Operation" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField
|
||||
label={t('transformers.unary-operation-editor.label-operation', 'Operation')}
|
||||
labelWidth={LABEL_WIDTH}
|
||||
>
|
||||
<Select options={ops} value={unary?.operator ?? ops[0].value} onChange={onUnaryOperationChanged} />
|
||||
</InlineField>
|
||||
<InlineField label="(" labelWidth={2}>
|
||||
<Select
|
||||
placeholder="Field"
|
||||
placeholder={t('transformers.unary-operation-editor.placeholder-field', 'Field')}
|
||||
className="min-width-11"
|
||||
options={fieldName}
|
||||
value={unary?.fieldName}
|
||||
|
||||
+13
-6
@@ -8,6 +8,7 @@ import {
|
||||
} from '@grafana/data/internal';
|
||||
import { InlineField, RadioButtonGroup, Select, StatsPicker } from '@grafana/ui';
|
||||
import { NumberInput } from 'app/core/components/OptionsUI/NumberInput';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { LABEL_WIDTH } from './constants';
|
||||
|
||||
@@ -77,16 +78,19 @@ export const WindowOptionsEditor = (props: {
|
||||
|
||||
return (
|
||||
<>
|
||||
<InlineField label="Field" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField label={t('transformers.window-options-editor.label-field', 'Field')} labelWidth={LABEL_WIDTH}>
|
||||
<Select
|
||||
placeholder="Field"
|
||||
placeholder={t('transformers.window-options-editor.placeholder-field', 'Field')}
|
||||
options={selectOptions}
|
||||
className="min-width-18"
|
||||
value={window?.field}
|
||||
onChange={onWindowFieldChange}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Calculation" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField
|
||||
label={t('transformers.window-options-editor.label-calculation', 'Calculation')}
|
||||
labelWidth={LABEL_WIDTH}
|
||||
>
|
||||
<StatsPicker
|
||||
allowMultiple={false}
|
||||
className="width-18"
|
||||
@@ -98,14 +102,17 @@ export const WindowOptionsEditor = (props: {
|
||||
}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Type" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField label={t('transformers.window-options-editor.label-type', 'Type')} labelWidth={LABEL_WIDTH}>
|
||||
<RadioButtonGroup
|
||||
value={window?.windowAlignment ?? WindowAlignment.Trailing}
|
||||
options={typeOptions}
|
||||
onChange={onTypeChange}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Window size mode" labelWidth={LABEL_WIDTH}>
|
||||
<InlineField
|
||||
label={t('transformers.window-options-editor.label-window-size-mode', 'Window size mode')}
|
||||
labelWidth={LABEL_WIDTH}
|
||||
>
|
||||
<RadioButtonGroup
|
||||
value={window?.windowSizeMode ?? WindowSizeMode.Percentage}
|
||||
options={windowSizeModeOptions}
|
||||
@@ -122,7 +129,7 @@ export const WindowOptionsEditor = (props: {
|
||||
}
|
||||
>
|
||||
<NumberInput
|
||||
placeholder="Auto"
|
||||
placeholder={t('transformers.window-options-editor.placeholder-auto', 'Auto')}
|
||||
min={0.1}
|
||||
value={
|
||||
window?.windowSize && window.windowSizeMode === WindowSizeMode.Percentage
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { ConcatenateFrameNameMode, ConcatenateTransformerOptions } from '@grafana/data/internal';
|
||||
import { InlineField, Input, Select } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -54,7 +55,7 @@ export class ConcatenateTransformerEditor extends PureComponent<ConcatenateTrans
|
||||
|
||||
return (
|
||||
<div>
|
||||
<InlineField label="Name" labelWidth={16} grow>
|
||||
<InlineField label={t('transformers.concatenate-transformer-editor.label-name', 'Name')} labelWidth={16} grow>
|
||||
<Select
|
||||
width={36}
|
||||
options={nameModes}
|
||||
@@ -63,8 +64,17 @@ export class ConcatenateTransformerEditor extends PureComponent<ConcatenateTrans
|
||||
/>
|
||||
</InlineField>
|
||||
{frameNameMode === ConcatenateFrameNameMode.Label && (
|
||||
<InlineField label="Label" labelWidth={16} grow>
|
||||
<Input width={36} value={options.frameNameLabel ?? ''} placeholder="frame" onChange={this.onLabelChanged} />
|
||||
<InlineField
|
||||
label={t('transformers.concatenate-transformer-editor.label-label', 'Label')}
|
||||
labelWidth={16}
|
||||
grow
|
||||
>
|
||||
<Input
|
||||
width={36}
|
||||
value={options.frameNameLabel ?? ''}
|
||||
placeholder={t('transformers.concatenate-transformer-editor.placeholder-frame', 'Frame')}
|
||||
onChange={this.onLabelChanged}
|
||||
/>
|
||||
</InlineField>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -15,6 +15,7 @@ import {
|
||||
import { ConvertFieldTypeOptions, ConvertFieldTypeTransformerOptions } from '@grafana/data/internal';
|
||||
import { Button, InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';
|
||||
import { allFieldTypeIconOptions, FieldNamePicker } from '@grafana/ui/internal';
|
||||
import { t } from 'app/core/internationalization';
|
||||
import { findField } from 'app/features/dimensions';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
@@ -150,7 +151,7 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
</InlineField>
|
||||
{c.destinationType === FieldType.time && (
|
||||
<InlineField
|
||||
label="Input format"
|
||||
label={t('transformers.convert-field-type-transformer-editor.label-input-format', 'Input format')}
|
||||
tooltip="Specify the format of the input field so Grafana can parse the date string correctly."
|
||||
>
|
||||
<Input
|
||||
@@ -164,13 +165,25 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
{c.destinationType === FieldType.string && (
|
||||
<>
|
||||
{(c.joinWith?.length || targetField?.type === FieldType.other) && (
|
||||
<InlineField label="Join with" tooltip="Use an explicit separator when joining array values">
|
||||
<InlineField
|
||||
label={t('transformers.convert-field-type-transformer-editor.label-join-with', 'Join with')}
|
||||
tooltip={t(
|
||||
'transformers.convert-field-type-transformer-editor.tooltip-explicit-separator-joining-array-values',
|
||||
'Use an explicit separator when joining array values'
|
||||
)}
|
||||
>
|
||||
<Input value={c.joinWith} placeholder={'JSON'} onChange={onJoinWithChange(idx)} width={9} />
|
||||
</InlineField>
|
||||
)}
|
||||
{targetField?.type === FieldType.time && (
|
||||
<>
|
||||
<InlineField label="Date format" tooltip="Specify the output format.">
|
||||
<InlineField
|
||||
label={t('transformers.convert-field-type-transformer-editor.label-date-format', 'Date format')}
|
||||
tooltip={t(
|
||||
'transformers.convert-field-type-transformer-editor.tooltip-specify-the-output-format',
|
||||
'Specify the output format.'
|
||||
)}
|
||||
>
|
||||
<Input
|
||||
value={c.dateFormat}
|
||||
placeholder={'e.g. YYYY-MM-DD'}
|
||||
@@ -178,7 +191,16 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
width={24}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Set timezone" tooltip="Set the timezone of the date manually">
|
||||
<InlineField
|
||||
label={t(
|
||||
'transformers.convert-field-type-transformer-editor.label-set-timezone',
|
||||
'Set timezone'
|
||||
)}
|
||||
tooltip={t(
|
||||
'transformers.convert-field-type-transformer-editor.tooltip-timezone-manually',
|
||||
'Set the timezone of the date manually'
|
||||
)}
|
||||
>
|
||||
<Select options={timeZoneOptions} value={c.timezone} onChange={onTzChange(idx)} isClearable />
|
||||
</InlineField>
|
||||
</>
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useEffect, useState } from 'react';
|
||||
import { DataFrame, EnumFieldConfig, GrafanaTheme2 } from '@grafana/data';
|
||||
import { ConvertFieldTypeTransformerOptions } from '@grafana/data/internal';
|
||||
import { Button, HorizontalGroup, InlineFieldRow, useStyles2, VerticalGroup } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
import EnumMappingRow from './EnumMappingRow';
|
||||
|
||||
@@ -121,10 +122,12 @@ export const EnumMappingEditor = ({ input, options, transformIndex, onChange }:
|
||||
<InlineFieldRow>
|
||||
<HorizontalGroup>
|
||||
<Button size="sm" icon="plus" onClick={() => generateEnumValues()} className={styles.button}>
|
||||
Generate enum values from data
|
||||
<Trans i18nKey="transformers.enum-mapping-editor.generate-enum-values-from-data">
|
||||
Generate enum values from data
|
||||
</Trans>
|
||||
</Button>
|
||||
<Button size="sm" icon="plus" onClick={() => onAddEnumRow()} className={styles.button}>
|
||||
Add enum value
|
||||
<Trans i18nKey="transformers.enum-mapping-editor.add-enum-value">Add enum value</Trans>
|
||||
</Button>
|
||||
</HorizontalGroup>
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import { FormEvent, useState, KeyboardEvent, useRef, useEffect } from 'react';
|
||||
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import { Icon, Input, IconButton, HorizontalGroup, FieldValidationMessage, useStyles2 } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
type EnumMappingRowProps = {
|
||||
transformIndex: number;
|
||||
@@ -116,8 +117,11 @@ const EnumMappingRow = ({
|
||||
name="trash-alt"
|
||||
onClick={onRemoveButtonClick}
|
||||
data-testid="remove-enum-row"
|
||||
aria-label="Delete enum row"
|
||||
tooltip="Delete"
|
||||
aria-label={t(
|
||||
'transformers.enum-mapping-row.remove-enum-row-aria-label-delete-enum-row',
|
||||
'Delete enum row'
|
||||
)}
|
||||
tooltip={t('transformers.enum-mapping-row.remove-enum-row-tooltip-delete', 'Delete')}
|
||||
/>
|
||||
</HorizontalGroup>
|
||||
</td>
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
import { FilterFieldsByNameTransformerOptions } from '@grafana/data/internal';
|
||||
import { getTemplateSrv } from '@grafana/runtime/src/services';
|
||||
import { Input, FilterPill, InlineFieldRow, InlineField, InlineSwitch, Select } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -198,14 +199,14 @@ export class FilterByNameTransformerEditor extends React.PureComponent<
|
||||
const { options, selected, isRegexValid } = this.state;
|
||||
return (
|
||||
<div>
|
||||
<InlineFieldRow label="Use variable">
|
||||
<InlineField label="From variable">
|
||||
<InlineFieldRow label={t('transformers.filter-by-name-transformer-editor.label-use-variable', 'Use variable')}>
|
||||
<InlineField label={t('transformers.filter-by-name-transformer-editor.label-from-variable', 'From variable')}>
|
||||
<InlineSwitch value={this.state.byVariable} onChange={this.onFromVariableChange}></InlineSwitch>
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
{this.state.byVariable ? (
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Variable">
|
||||
<InlineField label={t('transformers.filter-by-name-transformer-editor.label-variable', 'Variable')}>
|
||||
<Select
|
||||
value={this.state.variable}
|
||||
onChange={this.onVariableChange}
|
||||
@@ -214,14 +215,17 @@ export class FilterByNameTransformerEditor extends React.PureComponent<
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
) : (
|
||||
<InlineFieldRow label="Identifier">
|
||||
<InlineFieldRow label={t('transformers.filter-by-name-transformer-editor.label-identifier', 'Identifier')}>
|
||||
<InlineField
|
||||
label="Identifier"
|
||||
label={t('transformers.filter-by-name-transformer-editor.label-identifier', 'Identifier')}
|
||||
invalid={!isRegexValid}
|
||||
error={!isRegexValid ? 'Invalid pattern' : undefined}
|
||||
>
|
||||
<Input
|
||||
placeholder="Regular expression pattern"
|
||||
placeholder={t(
|
||||
'transformers.filter-by-name-transformer-editor.placeholder-regular-expression-pattern',
|
||||
'Regular expression pattern'
|
||||
)}
|
||||
value={this.state.regex || ''}
|
||||
onChange={(e) => this.setState({ regex: e.currentTarget.value })}
|
||||
onBlur={this.onInputBlur}
|
||||
|
||||
@@ -16,6 +16,7 @@ import { FormatStringOutput, FormatStringTransformerOptions } from '@grafana/dat
|
||||
import { Select, InlineFieldRow, InlineField } from '@grafana/ui';
|
||||
import { FieldNamePicker } from '@grafana/ui/internal';
|
||||
import { NumberInput } from 'app/core/components/OptionsUI/NumberInput';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {
|
||||
settings: {
|
||||
@@ -90,14 +91,17 @@ function FormatStringTransfomerEditor({
|
||||
/>
|
||||
</InlineField>
|
||||
|
||||
<InlineField label="Format" labelWidth={10}>
|
||||
<InlineField label={t('transformers.format-string-transfomer-editor.label-format', 'Format')} labelWidth={10}>
|
||||
<Select options={ops} value={options.outputFormat} onChange={onFormatChange} width={20} />
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
|
||||
{options.outputFormat === FormatStringOutput.Substring && (
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Substring range" labelWidth={15}>
|
||||
<InlineField
|
||||
label={t('transformers.format-string-transfomer-editor.label-substring-range', 'Substring range')}
|
||||
labelWidth={15}
|
||||
>
|
||||
<NumberInput min={0} value={options.substringStart ?? 0} onChange={onSubstringStartChange} width={7} />
|
||||
</InlineField>
|
||||
<InlineField>
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { FormatTimeTransformerOptions } from '@grafana/data/internal';
|
||||
import { Select, InlineFieldRow, InlineField, Input } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { getTimezoneOptions } from '../utils';
|
||||
@@ -69,18 +70,24 @@ export function FormatTimeTransfomerEditor({
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Time Field" labelWidth={15} grow>
|
||||
<InlineField
|
||||
label={t('transformers.format-time-transfomer-editor.label-time-field', 'Time field')}
|
||||
labelWidth={15}
|
||||
grow
|
||||
>
|
||||
<Select
|
||||
options={timeFields}
|
||||
value={options.timeField}
|
||||
onChange={onSelectField}
|
||||
/* don't translate here as this references a field name */
|
||||
/* eslint-disable-next-line @grafana/no-untranslated-strings */
|
||||
placeholder="time"
|
||||
isClearable
|
||||
/>
|
||||
</InlineField>
|
||||
|
||||
<InlineField
|
||||
label="Format"
|
||||
label={t('transformers.format-time-transfomer-editor.label-format', 'Format')}
|
||||
labelWidth={10}
|
||||
tooltip={
|
||||
<>
|
||||
@@ -95,7 +102,14 @@ export function FormatTimeTransfomerEditor({
|
||||
>
|
||||
<Input onChange={onFormatChange} value={options.outputFormat} />
|
||||
</InlineField>
|
||||
<InlineField label="Set Timezone" tooltip="Set the timezone of the date manually" labelWidth={20}>
|
||||
<InlineField
|
||||
label={t('transformers.format-time-transfomer-editor.label-set-timezone', 'Set timezone')}
|
||||
tooltip={t(
|
||||
'transformers.format-time-transfomer-editor.tooltip-timezone-manually',
|
||||
'Set the timezone of the date manually'
|
||||
)}
|
||||
labelWidth={20}
|
||||
>
|
||||
<Select options={timeZoneOptions} value={options.timezone} onChange={onTzChange} isClearable />
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { GroupByFieldOptions, GroupByOperationID, GroupByTransformerOptions } from '@grafana/data/internal';
|
||||
import { useTheme2, Select, StatsPicker, InlineField, Stack, Alert } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { useAllFieldNamesFromDataFrames } from '../utils';
|
||||
@@ -102,13 +103,19 @@ export const GroupByFieldConfiguration = ({ fieldName, config, onConfigChange }:
|
||||
<InlineField className={styles.label} label={fieldName} grow shrink>
|
||||
<Stack gap={0.5} direction="row">
|
||||
<div className={styles.operation}>
|
||||
<Select options={options} value={config?.operation} placeholder="Ignored" onChange={onChange} isClearable />
|
||||
<Select
|
||||
options={options}
|
||||
value={config?.operation}
|
||||
placeholder={t('transformers.group-by-field-configuration.placeholder-ignored', 'Ignored')}
|
||||
onChange={onChange}
|
||||
isClearable
|
||||
/>
|
||||
</div>
|
||||
|
||||
{config?.operation === GroupByOperationID.aggregate && (
|
||||
<StatsPicker
|
||||
className={styles.aggregations}
|
||||
placeholder="Select Stats"
|
||||
placeholder={t('transformers.group-by-field-configuration.placeholder-select-stats', 'Select stats')}
|
||||
allowMultiple
|
||||
stats={config.aggregations}
|
||||
onChange={(stats) => {
|
||||
|
||||
@@ -20,6 +20,7 @@ import {
|
||||
SHOW_NESTED_HEADERS_DEFAULT,
|
||||
} from '@grafana/data/internal';
|
||||
import { useTheme2, Select, StatsPicker, InlineField, Field, Switch, Alert, Stack } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { useAllFieldNamesFromDataFrames } from '../utils';
|
||||
|
||||
@@ -101,7 +102,10 @@ export const GroupToNestedTableTransformerEditor = ({
|
||||
))}
|
||||
</div>
|
||||
<Field
|
||||
label="Show field names in nested tables"
|
||||
label={t(
|
||||
'transformers.group-to-nested-table-transformer-editor.label-show-field-names-in-nested-tables',
|
||||
'Show field names in nested tables'
|
||||
)}
|
||||
description="If enabled nested tables will show field names as a table header"
|
||||
>
|
||||
<Switch value={showHeaders} onChange={onShowFieldNamesChange} />
|
||||
@@ -133,13 +137,19 @@ export const GroupByFieldConfiguration = ({ fieldName, config, onConfigChange }:
|
||||
<InlineField className={styles.label} label={fieldName} grow shrink>
|
||||
<Stack gap={0.5} direction="row" wrap={false}>
|
||||
<div className={styles.operation}>
|
||||
<Select options={options} value={config?.operation} placeholder="Ignored" onChange={onChange} isClearable />
|
||||
<Select
|
||||
options={options}
|
||||
value={config?.operation}
|
||||
placeholder={t('transformers.group-by-field-configuration.placeholder-ignored', 'Ignored')}
|
||||
onChange={onChange}
|
||||
isClearable
|
||||
/>
|
||||
</div>
|
||||
|
||||
{config?.operation === GroupByOperationID.aggregate && (
|
||||
<StatsPicker
|
||||
className={styles.aggregations}
|
||||
placeholder="Select Stats"
|
||||
placeholder={t('transformers.group-by-field-configuration.placeholder-select-stats', 'Select stats')}
|
||||
allowMultiple
|
||||
stats={config.aggregations}
|
||||
onChange={(stats) => {
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { getTemplateSrv } from '@grafana/runtime';
|
||||
import { InlineField, InlineFieldRow, Select } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { useAllFieldNamesFromDataFrames } from '../utils';
|
||||
@@ -79,7 +80,10 @@ export const GroupingToMatrixTransformerEditor = ({
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Column" labelWidth={8}>
|
||||
<InlineField
|
||||
label={t('transformers.grouping-to-matrix-transformer-editor.label-column', 'Column')}
|
||||
labelWidth={8}
|
||||
>
|
||||
<Select
|
||||
options={[...fieldNames, ...variables]}
|
||||
value={options.columnField}
|
||||
@@ -87,10 +91,13 @@ export const GroupingToMatrixTransformerEditor = ({
|
||||
isClearable
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Row" labelWidth={8}>
|
||||
<InlineField label={t('transformers.grouping-to-matrix-transformer-editor.label-row', 'Row')} labelWidth={8}>
|
||||
<Select options={[...fieldNames, ...variables]} value={options.rowField} onChange={onSelectRow} isClearable />
|
||||
</InlineField>
|
||||
<InlineField label="Cell Value" labelWidth={10}>
|
||||
<InlineField
|
||||
label={t('transformers.grouping-to-matrix-transformer-editor.label-cell-value', 'Cell value')}
|
||||
labelWidth={10}
|
||||
>
|
||||
<Select
|
||||
options={[...fieldNames, ...variables]}
|
||||
value={options.valueField}
|
||||
@@ -98,7 +105,7 @@ export const GroupingToMatrixTransformerEditor = ({
|
||||
isClearable
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Empty Value">
|
||||
<InlineField label={t('transformers.grouping-to-matrix-transformer-editor.label-empty-value', 'Empty value')}>
|
||||
<Select options={specialValueOptions} value={options.emptyValue} onChange={onSelectEmptyValue} isClearable />
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { histogramFieldInfo, HistogramTransformerInputs } from '@grafana/data/internal';
|
||||
import { InlineField, InlineFieldRow, InlineSwitch } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { SuggestionsInput } from '../suggestionsInput/SuggestionsInput';
|
||||
@@ -85,7 +86,7 @@ export const HistogramTransformerEditor = ({
|
||||
<SuggestionsInput
|
||||
suggestions={suggestions}
|
||||
value={options.bucketCount}
|
||||
placeholder="Default: 30"
|
||||
placeholder={t('transformers.histogram-transformer-editor.placeholder-default', 'Default: 30')}
|
||||
onChange={onVariableBucketCountChanged}
|
||||
/>
|
||||
</InlineField>
|
||||
|
||||
@@ -12,6 +12,7 @@ import { JoinByFieldOptions, JoinMode } from '@grafana/data/internal';
|
||||
import { getTemplateSrv } from '@grafana/runtime';
|
||||
import { Select, InlineFieldRow, InlineField } from '@grafana/ui';
|
||||
import { useFieldDisplayNames, useSelectOptions } from '@grafana/ui/internal';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -68,16 +69,26 @@ export function SeriesToFieldsTransformerEditor({ input, options, onChange }: Tr
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Mode" labelWidth={8} grow>
|
||||
<InlineField
|
||||
label={t('transformers.series-to-fields-transformer-editor.label-mode', 'Mode')}
|
||||
labelWidth={8}
|
||||
grow
|
||||
>
|
||||
<Select options={modes} value={options.mode ?? JoinMode.outer} onChange={onSetMode} />
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Field" labelWidth={8} grow>
|
||||
<InlineField
|
||||
label={t('transformers.series-to-fields-transformer-editor.label-field', 'Field')}
|
||||
labelWidth={8}
|
||||
grow
|
||||
>
|
||||
<Select
|
||||
options={[...fieldNames, ...variables]}
|
||||
value={options.byField}
|
||||
onChange={onSelectField}
|
||||
/* don't translate here as this references a field name */
|
||||
/* eslint-disable-next-line @grafana/no-untranslated-strings */
|
||||
placeholder="time"
|
||||
isClearable
|
||||
/>
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { LabelsToFieldsMode, LabelsToFieldsOptions } from '@grafana/data/internal';
|
||||
import { InlineField, InlineFieldRow, RadioButtonGroup, Select, FilterPill, Stack } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -99,14 +100,20 @@ export const LabelsAsFieldsTransformerEditor = ({
|
||||
<InlineField
|
||||
label={'Value field name'}
|
||||
labelWidth={labelWidth}
|
||||
tooltip="Replace the value field name with a label"
|
||||
tooltip={t(
|
||||
'transformers.labels-as-fields-transformer-editor.tooltip-replace-value-field-label',
|
||||
'Replace the value field name with a label'
|
||||
)}
|
||||
htmlFor="labels-to-fields-as-name"
|
||||
>
|
||||
<Select
|
||||
inputId="labels-to-fields-as-name"
|
||||
isClearable={true}
|
||||
allowCustomValue={false}
|
||||
placeholder="(Optional) Select label"
|
||||
placeholder={t(
|
||||
'transformers.labels-as-fields-transformer-editor.placeholder-optional-select-label',
|
||||
'(Optional) Select label'
|
||||
)}
|
||||
options={labelNames}
|
||||
value={options?.valueLabel}
|
||||
onChange={onValueLabelChange}
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { LimitTransformerOptions } from '@grafana/data/internal';
|
||||
import { InlineFieldRow } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { SuggestionsInput } from '../suggestionsInput/SuggestionsInput';
|
||||
@@ -36,7 +37,7 @@ export const LimitTransformerEditor = ({ options, onChange }: TransformerUIProps
|
||||
error={'Value needs to be an integer or a variable'}
|
||||
value={String(options.limitField)}
|
||||
onChange={onSetVariableLimit}
|
||||
placeholder="Value or variable"
|
||||
placeholder={t('transformers.limit-transformer-editor.placeholder-value-or-variable', 'Value or variable')}
|
||||
suggestions={getVariableSuggestions()}
|
||||
></SuggestionsInput>
|
||||
</InlineFieldRow>
|
||||
|
||||
@@ -7,13 +7,20 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { MergeTransformerOptions } from '@grafana/data/internal';
|
||||
import { FieldValidationMessage } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
export const MergeTransformerEditor = ({ input, options, onChange }: TransformerUIProps<MergeTransformerOptions>) => {
|
||||
if (input.length <= 1) {
|
||||
// Show warning that merge is useless only apply on a single frame
|
||||
return <FieldValidationMessage>Merge has no effect when applied on a single frame.</FieldValidationMessage>;
|
||||
return (
|
||||
<FieldValidationMessage>
|
||||
<Trans i18nKey="transformers.merge-transformer-editor.merge-effect-applied-single-frame">
|
||||
Merge has no effect when applied on a single frame.
|
||||
</Trans>
|
||||
</FieldValidationMessage>
|
||||
);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -22,6 +22,7 @@ import {
|
||||
Text,
|
||||
Box,
|
||||
} from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { useAllFieldNamesFromDataFrames } from '../utils';
|
||||
@@ -164,7 +165,15 @@ const DraggableFieldName = ({
|
||||
<InlineLabel width={60} as="div">
|
||||
<Stack gap={0} justifyContent="flex-start" alignItems="center" width="100%">
|
||||
<span {...provided.dragHandleProps}>
|
||||
<Icon name="draggabledots" title="Drag and drop to reorder" size="lg" className={styles.draggable} />
|
||||
<Icon
|
||||
name="draggabledots"
|
||||
title={t(
|
||||
'transformers.draggable-field-name.title-drag-and-drop-to-reorder',
|
||||
'Drag and drop to reorder'
|
||||
)}
|
||||
size="lg"
|
||||
className={styles.draggable}
|
||||
/>
|
||||
</span>
|
||||
<IconButton
|
||||
className={styles.toggle}
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
import { ReduceTransformerMode, ReduceTransformerOptions } from '@grafana/data/internal';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { InlineField, Select, StatsPicker, InlineSwitch } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -58,7 +59,12 @@ export const ReduceTransformerEditor = ({ options, onChange }: TransformerUIProp
|
||||
|
||||
return (
|
||||
<>
|
||||
<InlineField label="Mode" data-testid={selectors.components.Transforms.Reduce.modeLabel} grow labelWidth={16}>
|
||||
<InlineField
|
||||
label={t('transformers.reduce-transformer-editor.label-mode', 'Mode')}
|
||||
data-testid={selectors.components.Transforms.Reduce.modeLabel}
|
||||
grow
|
||||
labelWidth={16}
|
||||
>
|
||||
<Select
|
||||
options={modes}
|
||||
value={modes.find((v) => v.value === options.mode) || modes[0]}
|
||||
@@ -66,13 +72,13 @@ export const ReduceTransformerEditor = ({ options, onChange }: TransformerUIProp
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField
|
||||
label="Calculations"
|
||||
label={t('transformers.reduce-transformer-editor.label-calculations', 'Calculations')}
|
||||
data-testid={selectors.components.Transforms.Reduce.calculationsLabel}
|
||||
grow
|
||||
labelWidth={16}
|
||||
>
|
||||
<StatsPicker
|
||||
placeholder="Choose Stat"
|
||||
placeholder={t('transformers.reduce-transformer-editor.placeholder-choose-stat', 'Choose stat')}
|
||||
allowMultiple
|
||||
stats={options.reducers || []}
|
||||
onChange={(stats) => {
|
||||
@@ -84,12 +90,20 @@ export const ReduceTransformerEditor = ({ options, onChange }: TransformerUIProp
|
||||
/>
|
||||
</InlineField>
|
||||
{options.mode === ReduceTransformerMode.ReduceFields && (
|
||||
<InlineField htmlFor="include-time-field" labelWidth={16} label="Include time">
|
||||
<InlineField
|
||||
htmlFor="include-time-field"
|
||||
labelWidth={16}
|
||||
label={t('transformers.reduce-transformer-editor.label-include-time', 'Include time')}
|
||||
>
|
||||
<InlineSwitch id="include-time-field" value={!!options.includeTimeField} onChange={onToggleTime} />
|
||||
</InlineField>
|
||||
)}
|
||||
{options.mode !== ReduceTransformerMode.ReduceFields && (
|
||||
<InlineField htmlFor="labels-to-fields" labelWidth={16} label="Labels to fields">
|
||||
<InlineField
|
||||
htmlFor="labels-to-fields"
|
||||
labelWidth={16}
|
||||
label={t('transformers.reduce-transformer-editor.label-labels-to-fields', 'Labels to fields')}
|
||||
>
|
||||
<InlineSwitch id="labels-to-fields" value={!!options.labelsToFields} onChange={onToggleLabels} />
|
||||
</InlineField>
|
||||
)}
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { RenameByRegexTransformerOptions } from '@grafana/data/internal';
|
||||
import { InlineField, Input } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -83,22 +84,31 @@ export class RenameByRegexTransformerEditor extends React.PureComponent<
|
||||
return (
|
||||
<>
|
||||
<InlineField
|
||||
label="Match"
|
||||
label={t('transformers.rename-by-regex-transformer-editor.label-match', 'Match')}
|
||||
labelWidth={16}
|
||||
invalid={!isRegexValid}
|
||||
error={!isRegexValid ? 'Invalid pattern' : undefined}
|
||||
>
|
||||
<Input
|
||||
placeholder="Regular expression pattern"
|
||||
placeholder={t(
|
||||
'transformers.rename-by-regex-transformer-editor.placeholder-regular-expression-pattern',
|
||||
'Regular expression pattern'
|
||||
)}
|
||||
value={regex || ''}
|
||||
onChange={this.handleRegexChange}
|
||||
onBlur={this.handleRegexBlur}
|
||||
width={25}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Replace" labelWidth={16}>
|
||||
<InlineField
|
||||
label={t('transformers.rename-by-regex-transformer-editor.label-replace', 'Replace')}
|
||||
labelWidth={16}
|
||||
>
|
||||
<Input
|
||||
placeholder="Replacement pattern"
|
||||
placeholder={t(
|
||||
'transformers.rename-by-regex-transformer-editor.placeholder-replacement-pattern',
|
||||
'Replacement pattern'
|
||||
)}
|
||||
value={renamePattern || ''}
|
||||
onChange={this.handleRenameChange}
|
||||
onBlur={this.handleRenameBlur}
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
import { SortByField, SortByTransformerOptions } from '@grafana/data/internal';
|
||||
import { getTemplateSrv } from '@grafana/runtime';
|
||||
import { InlineField, InlineSwitch, InlineFieldRow, Select } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { useAllFieldNamesFromDataFrames } from '../utils';
|
||||
@@ -34,17 +35,21 @@ export const SortByTransformerEditor = ({ input, options, onChange }: Transforme
|
||||
{sorts.map((s, index) => {
|
||||
return (
|
||||
<InlineFieldRow key={`${s.field}/${index}`}>
|
||||
<InlineField label="Field" labelWidth={10} grow={true}>
|
||||
<InlineField
|
||||
label={t('transformers.sort-by-transformer-editor.label-field', 'Field')}
|
||||
labelWidth={10}
|
||||
grow={true}
|
||||
>
|
||||
<Select
|
||||
options={[...fieldNames, ...variables]}
|
||||
value={s.field}
|
||||
placeholder="Select field"
|
||||
placeholder={t('transformers.sort-by-transformer-editor.placeholder-select-field', 'Select field')}
|
||||
onChange={(v) => {
|
||||
onSortChange(index, { ...s, field: v.value! });
|
||||
}}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Reverse">
|
||||
<InlineField label={t('transformers.sort-by-transformer-editor.label-reverse', 'Reverse')}>
|
||||
<InlineSwitch
|
||||
value={!!s.desc}
|
||||
onChange={() => {
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { TransposeTransformerOptions } from '@grafana/data/internal';
|
||||
import { InlineField, InlineFieldRow, Input } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIProps<TransposeTransformerOptions>) => {
|
||||
return (
|
||||
@@ -14,7 +15,7 @@ export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIPr
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'First field name'} labelWidth={24}>
|
||||
<Input
|
||||
placeholder="Field"
|
||||
placeholder={t('transformers.transpose-transfomer-editor.placeholder-field', 'Field')}
|
||||
value={options.firstFieldName}
|
||||
onChange={(e) => onChange({ ...options, firstFieldName: e.currentTarget.value })}
|
||||
width={25}
|
||||
@@ -24,7 +25,7 @@ export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIPr
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Remaining fields name'} tooltip={'Name for value fields'} labelWidth={24}>
|
||||
<Input
|
||||
placeholder="Value"
|
||||
placeholder={t('transformers.transpose-transfomer-editor.placeholder-value', 'Value')}
|
||||
value={options.restFieldsName}
|
||||
onChange={(e) => onChange({ ...options, restFieldsName: e.currentTarget.value })}
|
||||
width={25}
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { InlineField, InlineFieldRow, Select, InlineSwitch, Input, Combobox, ComboboxOption } from '@grafana/ui';
|
||||
import { FieldNamePicker } from '@grafana/ui/internal';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -124,12 +125,18 @@ export const extractFieldsTransformerEditor = ({
|
||||
)}
|
||||
{options.format === FieldExtractorID.Delimiter && (
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Delimiter" labelWidth={16}>
|
||||
<InlineField
|
||||
label={t('transformers.extract-fields-transformer-editor.label-delimiter', 'Delimiter')}
|
||||
labelWidth={16}
|
||||
>
|
||||
<Combobox
|
||||
value={options.delimiter}
|
||||
options={[{ value: ',' }, { value: ';' }, { value: '|' }]}
|
||||
onChange={onDelimiterChange}
|
||||
placeholder="Select delimiter..."
|
||||
placeholder={t(
|
||||
'transformers.extract-fields-transformer-editor.placeholder-select-delimiter',
|
||||
'Select delimiter...'
|
||||
)}
|
||||
width={24}
|
||||
/>
|
||||
</InlineField>
|
||||
|
||||
@@ -3,6 +3,7 @@ import { useState } from 'react';
|
||||
import * as React from 'react';
|
||||
|
||||
import { Button, InlineField, InlineFieldRow, IconButton, Input } from '@grafana/ui';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { JSONPath } from '../types';
|
||||
|
||||
@@ -51,15 +52,18 @@ export function JSONPathEditor({ options, onChange }: Props) {
|
||||
paths.map((path: JSONPath, key: number) => (
|
||||
<li key={key}>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Field" tooltip={tooltips.field} grow>
|
||||
<InlineField label={t('transformers.jsonpath-editor.label-field', 'Field')} tooltip={tooltips.field} grow>
|
||||
<Input
|
||||
onBlur={onBlur}
|
||||
onChange={(event: React.SyntheticEvent<HTMLInputElement>) => onJSONPathChange(event, key, 'path')}
|
||||
value={path.path}
|
||||
placeholder='A valid json path, e.g. "object.value1" or "object.value2[0]"'
|
||||
placeholder={t(
|
||||
'transformers.jsonpath-editor.placeholder-valid-objectvalue',
|
||||
'A valid json path, e.g. "object.value1" or "object.value2[0]"'
|
||||
)}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Alias" tooltip={tooltips.alias}>
|
||||
<InlineField label={t('transformers.jsonpath-editor.label-alias', 'Alias')} tooltip={tooltips.alias}>
|
||||
<Input
|
||||
width={12}
|
||||
value={path.alias}
|
||||
@@ -68,14 +72,18 @@ export function JSONPathEditor({ options, onChange }: Props) {
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField className={cx(style.removeIcon)}>
|
||||
<IconButton onClick={() => removeJSONPath(key)} name={'trash-alt'} tooltip="Remove path" />
|
||||
<IconButton
|
||||
onClick={() => removeJSONPath(key)}
|
||||
name={'trash-alt'}
|
||||
tooltip={t('transformers.jsonpath-editor.tooltip-remove-path', 'Remove path')}
|
||||
/>
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
</li>
|
||||
))}
|
||||
<InlineField>
|
||||
<Button icon={'plus'} onClick={() => addJSONPath()} variant={'secondary'}>
|
||||
Add path
|
||||
<Trans i18nKey="transformers.jsonpath-editor.add-path">Add path</Trans>
|
||||
</Button>
|
||||
</InlineField>
|
||||
</ol>
|
||||
@@ -96,7 +104,9 @@ const getTooltips = () => {
|
||||
<div>
|
||||
A valid path of an json object.
|
||||
<div>
|
||||
<strong>JSON Value:</strong>
|
||||
<strong>
|
||||
<Trans i18nKey="transformers.get-tooltips.json-value">JSON Value:</Trans>
|
||||
</strong>
|
||||
</div>
|
||||
<pre>
|
||||
<code>
|
||||
|
||||
+19
-4
@@ -3,6 +3,7 @@ import { capitalize } from 'lodash';
|
||||
|
||||
import { DataFrame, getFieldDisplayName, GrafanaTheme2, ReducerID, SelectableValue } from '@grafana/data';
|
||||
import { Select, StatsPicker, useStyles2 } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
import {
|
||||
configMapHandlers,
|
||||
@@ -85,10 +86,24 @@ export function FieldToConfigMappingEditor({ frame, mappings, onChange, withRedu
|
||||
<table className={styles.table}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Field</th>
|
||||
<th>Use as</th>
|
||||
{withReducers && <th>Select</th>}
|
||||
{hasAdditionalSettings && <th>Additional settings</th>}
|
||||
<th>
|
||||
<Trans i18nKey="transformers.field-to-config-mapping-editor.field">Field</Trans>
|
||||
</th>
|
||||
<th>
|
||||
<Trans i18nKey="transformers.field-to-config-mapping-editor.use-as">Use as</Trans>
|
||||
</th>
|
||||
{withReducers && (
|
||||
<th>
|
||||
<Trans i18nKey="transformers.field-to-config-mapping-editor.select">Select</Trans>
|
||||
</th>
|
||||
)}
|
||||
{hasAdditionalSettings && (
|
||||
<th>
|
||||
<Trans i18nKey="transformers.field-to-config-mapping-editor.additional-settings">
|
||||
Additional settings
|
||||
</Trans>
|
||||
</th>
|
||||
)}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
TransformerCategory,
|
||||
} from '@grafana/data';
|
||||
import { Alert, HorizontalGroup, InlineField, InlineFieldRow, Select, ValuePicker } from '@grafana/ui';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { getDistinctLabels } from '../utils';
|
||||
@@ -29,9 +30,23 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
|
||||
}
|
||||
|
||||
if (!input.length) {
|
||||
warn = <Alert title="No input found">No input (or labels) found</Alert>;
|
||||
warn = (
|
||||
<Alert title={t('transformers.join-by-labels-transformer-editor.info.title-no-input-found', 'No input found')}>
|
||||
<Trans i18nKey="transformers.join-by-labels-transformer-editor.info.no-input-or-labels-found">
|
||||
No input (or labels) found
|
||||
</Trans>
|
||||
</Alert>
|
||||
);
|
||||
} else if (distinct.size === 0) {
|
||||
warn = <Alert title="No labels found">The input does not contain any labels</Alert>;
|
||||
warn = (
|
||||
<Alert
|
||||
title={t('transformers.join-by-labels-transformer-editor.info.title-no-labels-found', 'No labels found')}
|
||||
>
|
||||
<Trans i18nKey="transformers.join-by-labels-transformer-editor.info.input-contain-labels">
|
||||
The input does not contain any labels
|
||||
</Trans>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
// Show the selected values
|
||||
@@ -97,7 +112,10 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
|
||||
invalid={!Boolean(options.value?.length)}
|
||||
label={'Value'}
|
||||
labelWidth={labelWidth}
|
||||
tooltip="Select the label indicating the values name"
|
||||
tooltip={t(
|
||||
'transformers.join-by-labels-transformer-editor.tooltip-select-label-indicating-values',
|
||||
'Select the label indicating the values name'
|
||||
)}
|
||||
>
|
||||
<Select
|
||||
options={info.valueOptions}
|
||||
|
||||
@@ -18,6 +18,7 @@ import {
|
||||
RadioButtonGroup,
|
||||
} from '@grafana/ui';
|
||||
import { useFieldDisplayNames, useSelectOptions } from '@grafana/ui/internal';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -91,7 +92,13 @@ export function PartitionByValuesEditor({
|
||||
);
|
||||
|
||||
if (input.length > 1) {
|
||||
return <FieldValidationMessage>Partition by values only works with a single frame.</FieldValidationMessage>;
|
||||
return (
|
||||
<FieldValidationMessage>
|
||||
<Trans i18nKey="transformers.partition-by-values-editor.partition-values-works-single-frame">
|
||||
Partition by values only works with a single frame.
|
||||
</Trans>
|
||||
</FieldValidationMessage>
|
||||
);
|
||||
}
|
||||
|
||||
const fieldNames = [...new Set(options.fields)];
|
||||
@@ -99,7 +106,11 @@ export function PartitionByValuesEditor({
|
||||
return (
|
||||
<div>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Field" labelWidth={10} grow={true}>
|
||||
<InlineField
|
||||
label={t('transformers.partition-by-values-editor.label-field', 'Field')}
|
||||
labelWidth={10}
|
||||
grow={true}
|
||||
>
|
||||
<HorizontalGroup>
|
||||
{fieldNames.map((name) => (
|
||||
<Button key={name} icon="times" variant="secondary" size="md" onClick={() => removeField(name)}>
|
||||
@@ -112,7 +123,7 @@ export function PartitionByValuesEditor({
|
||||
size="md"
|
||||
options={selectOptions}
|
||||
onChange={addField}
|
||||
label="Select field"
|
||||
label={t('transformers.partition-by-values-editor.label-select-field', 'Select field')}
|
||||
icon="plus"
|
||||
/>
|
||||
)}
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
TransformerCategory,
|
||||
} from '@grafana/data';
|
||||
import { InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -21,10 +22,20 @@ const wideInfo = {
|
||||
description: 'Creates a single frame joined by time',
|
||||
info: (
|
||||
<ul>
|
||||
<li>Single frame</li>
|
||||
<li>1st field is shared time field</li>
|
||||
<li>Time in ascending order</li>
|
||||
<li>Multiple value fields of any type</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.wide-info.single-frame">Single frame</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.wide-info.st-field-is-shared-time">1st field is shared time field</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.wide-info.time-in-ascending-order">Time in ascending order</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.wide-info.multiple-value-fields-of-any-type">
|
||||
Multiple value fields of any type
|
||||
</Trans>
|
||||
</li>
|
||||
</ul>
|
||||
),
|
||||
};
|
||||
@@ -35,11 +46,21 @@ const multiInfo = {
|
||||
description: 'Creates a new frame for each time/number pair',
|
||||
info: (
|
||||
<ul>
|
||||
<li>Multiple frames</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.multi-info.multiple-frames">Multiple frames</Trans>
|
||||
</li>
|
||||
<li>Each frame has two fields: time, value</li>
|
||||
<li>Time in ascending order</li>
|
||||
<li>String values are represented as labels</li>
|
||||
<li>All values are numeric</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.multi-info.time-in-ascending-order">Time in ascending order</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.multi-info.string-values-are-represented-as-labels">
|
||||
String values are represented as labels
|
||||
</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.multi-info.all-values-are-numeric">All values are numeric</Trans>
|
||||
</li>
|
||||
</ul>
|
||||
),
|
||||
};
|
||||
@@ -50,11 +71,21 @@ const longInfo = {
|
||||
description: 'Convert each frame to long format',
|
||||
info: (
|
||||
<ul>
|
||||
<li>Single frame</li>
|
||||
<li>1st field is time field</li>
|
||||
<li>Time in ascending order, but may have duplicates</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.long-info.single-frame">Single frame</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.long-info.st-field-is-time">1st field is time field</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.long-info.ascending-order-duplicates">
|
||||
Time in ascending order, but may have duplicates
|
||||
</Trans>
|
||||
</li>
|
||||
<li>String values are represented as separate fields rather than as labels</li>
|
||||
<li>Multiple value fields may exist</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.long-info.multiple-value-fields-may-exist">Multiple value fields may exist</Trans>
|
||||
</li>
|
||||
</ul>
|
||||
),
|
||||
};
|
||||
@@ -78,7 +109,7 @@ export function PrepareTimeSeriesEditor(props: TransformerUIProps<PrepareTimeSer
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Format" labelWidth={12}>
|
||||
<InlineField label={t('transformers.prepare-time-series-editor.label-format', 'Format')} labelWidth={12}>
|
||||
<Select
|
||||
width={35}
|
||||
options={formats}
|
||||
@@ -101,7 +132,7 @@ export function PrepareTimeSeriesEditor(props: TransformerUIProps<PrepareTimeSer
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField label="Info" labelWidth={12}>
|
||||
<InlineField label={t('transformers.prepare-time-series-editor.label-info', 'Info')} labelWidth={12}>
|
||||
<div className={styles.info}>{(formats.find((v) => v.value === options.format) || formats[0]).info}</div>
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
import { InlineField, Select } from '@grafana/ui';
|
||||
import { FieldNamePicker } from '@grafana/ui/internal';
|
||||
import { NumberInput } from 'app/core/components/OptionsUI/NumberInput';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -74,7 +75,10 @@ export const RegressionTransformerEditor = ({
|
||||
|
||||
return (
|
||||
<>
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="X field">
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.regression-transformer-editor.label-x-field', 'X field')}
|
||||
>
|
||||
<FieldNamePicker
|
||||
context={{ data: input }}
|
||||
value={options.xFieldName ?? ''}
|
||||
@@ -84,7 +88,10 @@ export const RegressionTransformerEditor = ({
|
||||
}}
|
||||
></FieldNamePicker>
|
||||
</InlineField>
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="Y field">
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.regression-transformer-editor.label-y-field', 'Y field')}
|
||||
>
|
||||
<FieldNamePicker
|
||||
context={{ data: input }}
|
||||
value={options.yFieldName ?? ''}
|
||||
@@ -94,7 +101,10 @@ export const RegressionTransformerEditor = ({
|
||||
}}
|
||||
></FieldNamePicker>
|
||||
</InlineField>
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="Model type">
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.regression-transformer-editor.label-model-type', 'Model type')}
|
||||
>
|
||||
<Select
|
||||
value={options.modelType ?? DEFAULTS.modelType}
|
||||
onChange={(v) => {
|
||||
@@ -103,7 +113,11 @@ export const RegressionTransformerEditor = ({
|
||||
options={modelTypeOptions}
|
||||
></Select>
|
||||
</InlineField>
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="Predicted points" tooltip={'Number of X,Y points to predict'}>
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.regression-transformer-editor.label-predicted-points', 'Predicted points')}
|
||||
tooltip={'Number of X,Y points to predict'}
|
||||
>
|
||||
<NumberInput
|
||||
value={options.predictionCount ?? DEFAULTS.predictionCount}
|
||||
onChange={(v) => {
|
||||
@@ -112,7 +126,10 @@ export const RegressionTransformerEditor = ({
|
||||
></NumberInput>
|
||||
</InlineField>
|
||||
{options.modelType === ModelType.polynomial && (
|
||||
<InlineField labelWidth={LABEL_WIDTH} label="Degree">
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.regression-transformer-editor.label-degree', 'Degree')}
|
||||
>
|
||||
<Select<number>
|
||||
value={options.degree ?? DEFAULTS.degree}
|
||||
options={[
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
isTimeSeriesField,
|
||||
} from '@grafana/data';
|
||||
import { InlineFieldRow, InlineField, StatsPicker, Select, InlineLabel } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
@@ -89,7 +90,7 @@ export function TimeSeriesTableTransformEditor({
|
||||
<InlineLabel>{`Trend #${refId}`}</InlineLabel>
|
||||
</InlineField>
|
||||
<InlineField
|
||||
label="Time field"
|
||||
label={t('transformers.time-series-table-transform-editor.label-time-field', 'Time field')}
|
||||
tooltip="The time field that will be used for the time series. If not selected the first found will be used."
|
||||
>
|
||||
<Select
|
||||
@@ -99,7 +100,13 @@ export function TimeSeriesTableTransformEditor({
|
||||
isClearable={true}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label="Stat" tooltip="The statistic that should be calculated for this time series.">
|
||||
<InlineField
|
||||
label={t('transformers.time-series-table-transform-editor.label-stat', 'Stat')}
|
||||
tooltip={t(
|
||||
'transformers.time-series-table-transform-editor.tooltip-statistic-should-calculated-series',
|
||||
'The statistic that should be calculated for this time series.'
|
||||
)}
|
||||
>
|
||||
<StatsPicker
|
||||
stats={[options[refId]?.stat ?? ReducerID.lastNotNull]}
|
||||
onChange={onSelectStat.bind(null, refId)}
|
||||
|
||||
@@ -3,6 +3,7 @@ import { css, cx } from '@emotion/css';
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import { Button, InfoBox, Portal, useStyles2, useTheme2 } from '@grafana/ui';
|
||||
import { getModalStyles } from '@grafana/ui/internal';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
interface Props {
|
||||
maxConcurrentSessions?: number;
|
||||
@@ -40,7 +41,7 @@ export const TokenRevokedModal = (props: Props) => {
|
||||
</p>
|
||||
</div>
|
||||
<Button size="md" variant="primary" onClick={redirectToLogin}>
|
||||
Sign in
|
||||
<Trans i18nKey="users.token-revoked-modal.sign-in">Sign in</Trans>
|
||||
</Button>
|
||||
</InfoBox>
|
||||
</div>
|
||||
|
||||
@@ -4,6 +4,7 @@ import { reportInteraction } from '@grafana/runtime';
|
||||
import { RadioButtonGroup, LinkButton, FilterInput, InlineField } from '@grafana/ui';
|
||||
import config from 'app/core/config';
|
||||
import { contextSrv } from 'app/core/core';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
import { AccessControlAction, StoreState } from 'app/types';
|
||||
|
||||
import { selectTotal } from '../invites/state/selectors';
|
||||
@@ -66,7 +67,10 @@ export const UsersActionBarUnconnected = ({
|
||||
<FilterInput
|
||||
value={searchQuery}
|
||||
onChange={changeSearchQuery}
|
||||
placeholder="Search user by login, email or name"
|
||||
placeholder={t(
|
||||
'users.users-action-bar-unconnected.placeholder-search-login-email',
|
||||
'Search user by login, email or name'
|
||||
)}
|
||||
/>
|
||||
</InlineField>
|
||||
{pendingInvitesCount > 0 && (
|
||||
@@ -74,7 +78,11 @@ export const UsersActionBarUnconnected = ({
|
||||
<RadioButtonGroup value={showInvites ? 'invites' : 'users'} options={options} onChange={onShowInvites} />
|
||||
</div>
|
||||
)}
|
||||
{showInviteButton && <LinkButton href="org/users/invite">Invite</LinkButton>}
|
||||
{showInviteButton && (
|
||||
<LinkButton href="org/users/invite">
|
||||
<Trans i18nKey="users.users-action-bar-unconnected.invite">Invite</Trans>
|
||||
</LinkButton>
|
||||
)}
|
||||
{externalUserMngLinkUrl && (
|
||||
<LinkButton
|
||||
onClick={onExternalUserMngClick}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { Fragment, PureComponent, ReactNode } from 'react';
|
||||
|
||||
import { AdHocVariableFilter, DataSourceRef, SelectableValue } from '@grafana/data';
|
||||
import { Segment } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { AdHocFilterBuilder } from './AdHocFilterBuilder';
|
||||
import { REMOVE_FILTER_KEY } from './AdHocFilterKey';
|
||||
@@ -27,6 +28,7 @@ interface Props {
|
||||
* operators. Also filters are assumed to be joined with `AND` operator, which is also hardcoded.
|
||||
*/
|
||||
export class AdHocFilter extends PureComponent<Props> {
|
||||
private connectorLabel = t('variables.ad-hoc-filter.label-and', 'AND');
|
||||
onChange = (index: number, prop: string) => (key: SelectableValue<string | null>) => {
|
||||
const { filters } = this.props;
|
||||
const { value } = key;
|
||||
@@ -55,7 +57,7 @@ export class AdHocFilter extends PureComponent<Props> {
|
||||
{!disabled && (
|
||||
<AdHocFilterBuilder
|
||||
datasource={this.props.datasource!}
|
||||
appendBefore={filters.length > 0 ? <ConditionSegment label="AND" /> : null}
|
||||
appendBefore={filters.length > 0 ? <ConditionSegment label={this.connectorLabel} /> : null}
|
||||
onCompleted={this.appendFilterToVariable}
|
||||
allFilters={this.getAllFilters()}
|
||||
/>
|
||||
@@ -79,7 +81,7 @@ export class AdHocFilter extends PureComponent<Props> {
|
||||
|
||||
return filters.reduce((segments: ReactNode[], filter, index) => {
|
||||
if (segments.length > 0) {
|
||||
segments.push(<ConditionSegment label="AND" key={`condition-${index}`} />);
|
||||
segments.push(<ConditionSegment label={this.connectorLabel} key={`condition-${index}`} />);
|
||||
}
|
||||
segments.push(this.renderFilterSegments(filter, index, disabled));
|
||||
return segments;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { css } from '@emotion/css';
|
||||
|
||||
import { ConfirmModal } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
interface Props {
|
||||
varName: string;
|
||||
@@ -12,7 +13,7 @@ interface Props {
|
||||
export function ConfirmDeleteModal({ varName, isOpen = false, onConfirm, onDismiss }: Props) {
|
||||
return (
|
||||
<ConfirmModal
|
||||
title="Delete variable"
|
||||
title={t('variables.confirm-delete-modal.title-delete-variable', 'Delete variable')}
|
||||
isOpen={isOpen}
|
||||
onConfirm={onConfirm}
|
||||
onDismiss={onDismiss}
|
||||
|
||||
@@ -4,6 +4,7 @@ import * as React from 'react';
|
||||
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { TextArea, useStyles2 } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { getStyles } from '../../dashboard-scene/settings/variables/components/VariableTextAreaField';
|
||||
import { VariableQueryEditorProps } from '../types';
|
||||
@@ -33,7 +34,10 @@ export const LegacyVariableQueryEditor = ({ onChange, query }: VariableQueryEdit
|
||||
value={value}
|
||||
onChange={onValueChange}
|
||||
onBlur={onBlur}
|
||||
placeholder="Metric name or tags query"
|
||||
placeholder={t(
|
||||
'variables.legacy-variable-query-editor.placeholder-metric-name-or-tags-query',
|
||||
'Metric name or tags query'
|
||||
)}
|
||||
required
|
||||
data-testid={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsQueryInput}
|
||||
cols={52}
|
||||
|
||||
@@ -7,6 +7,7 @@ import { GrafanaTheme2, LoadingState, SelectableValue, VariableHide, VariableTyp
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { locationService } from '@grafana/runtime';
|
||||
import { Button, HorizontalGroup, Icon, Themeable2, withTheme2 } from '@grafana/ui';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { StoreState, ThunkDispatch } from '../../../types';
|
||||
import { VariableHideSelect } from '../../dashboard-scene/settings/variables/components/VariableHideSelect';
|
||||
@@ -158,16 +159,27 @@ export class VariableEditorEditorUnConnected extends PureComponent<Props, State>
|
||||
|
||||
return (
|
||||
<>
|
||||
<form aria-label="Variable editor Form" onSubmit={this.onHandleSubmit}>
|
||||
<form
|
||||
aria-label={t(
|
||||
'variables.variable-editor-editor-un-connected.aria-label-variable-editor-form',
|
||||
'Variable editor Form'
|
||||
)}
|
||||
onSubmit={this.onHandleSubmit}
|
||||
>
|
||||
<VariableTypeSelect onChange={this.onTypeChange} type={this.props.variable.type} />
|
||||
|
||||
<VariableLegend>General</VariableLegend>
|
||||
<VariableLegend>
|
||||
<Trans i18nKey="variables.variable-editor-editor-un-connected.general">General</Trans>
|
||||
</VariableLegend>
|
||||
<VariableTextField
|
||||
value={this.props.editor.name}
|
||||
onChange={this.onNameChange}
|
||||
name="Name"
|
||||
placeholder="Variable name"
|
||||
description="The name of the template variable. (Max. 50 characters)"
|
||||
placeholder={t('variables.variable-editor-editor-un-connected.placeholder-variable-name', 'Variable name')}
|
||||
description={t(
|
||||
'variables.variable-editor-editor-un-connected.description-template-variable-characters',
|
||||
'The name of the template variable. (Max. 50 characters)'
|
||||
)}
|
||||
invalid={!!this.props.editor.errors.name}
|
||||
error={this.props.editor.errors.name}
|
||||
testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalNameInputV2}
|
||||
@@ -177,16 +189,22 @@ export class VariableEditorEditorUnConnected extends PureComponent<Props, State>
|
||||
|
||||
<VariableTextField
|
||||
name="Label"
|
||||
description="Optional display name"
|
||||
description={t(
|
||||
'variables.variable-editor-editor-un-connected.description-optional-display-name',
|
||||
'Optional display name'
|
||||
)}
|
||||
value={this.props.variable.label ?? ''}
|
||||
placeholder="Label name"
|
||||
placeholder={t('variables.variable-editor-editor-un-connected.placeholder-label-name', 'Label name')}
|
||||
onChange={this.onLabelChange}
|
||||
testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalLabelInputV2}
|
||||
/>
|
||||
<VariableTextAreaField
|
||||
name="Description"
|
||||
value={variable.description ?? ''}
|
||||
placeholder="Descriptive text"
|
||||
placeholder={t(
|
||||
'variables.variable-editor-editor-un-connected.placeholder-descriptive-text',
|
||||
'Descriptive text'
|
||||
)}
|
||||
onChange={this.onDescriptionChange}
|
||||
width={52}
|
||||
/>
|
||||
@@ -203,7 +221,7 @@ export class VariableEditorEditorUnConnected extends PureComponent<Props, State>
|
||||
<div style={{ marginTop: '16px' }}>
|
||||
<HorizontalGroup spacing="md" height="inherit">
|
||||
<Button variant="destructive" fill="outline" onClick={this.onModalOpen}>
|
||||
Delete
|
||||
<Trans i18nKey="variables.variable-editor-editor-un-connected.delete">Delete</Trans>
|
||||
</Button>
|
||||
<Button
|
||||
type="submit"
|
||||
@@ -226,7 +244,7 @@ export class VariableEditorEditorUnConnected extends PureComponent<Props, State>
|
||||
onClick={this.onApply}
|
||||
data-testid={selectors.pages.Dashboard.Settings.Variables.Edit.General.applyButton}
|
||||
>
|
||||
Apply
|
||||
<Trans i18nKey="variables.variable-editor-editor-un-connected.apply">Apply</Trans>
|
||||
</Button>
|
||||
</HorizontalGroup>
|
||||
</div>
|
||||
|
||||
@@ -60,8 +60,12 @@ export function VariableEditorList({
|
||||
>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>Definition</th>
|
||||
<th>
|
||||
<Trans i18nKey="variables.variable-editor-list.variable">Variable</Trans>
|
||||
</th>
|
||||
<th>
|
||||
<Trans i18nKey="variables.variable-editor-list.definition">Definition</Trans>
|
||||
</th>
|
||||
<th colSpan={5} />
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -95,7 +99,7 @@ export function VariableEditorList({
|
||||
onClick={onAdd}
|
||||
icon="plus"
|
||||
>
|
||||
New variable
|
||||
<Trans i18nKey="variables.variable-editor-list.new-variable">New variable</Trans>
|
||||
</Button>
|
||||
</Stack>
|
||||
</Stack>
|
||||
|
||||
@@ -6,6 +6,7 @@ import { GrafanaTheme2, TypedVariableModel } from '@grafana/data';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { reportInteraction } from '@grafana/runtime';
|
||||
import { Button, Icon, IconButton, useStyles2, useTheme2 } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { hasOptions } from '../guard';
|
||||
import { VariableUsagesButton } from '../inspect/VariableUsagesButton';
|
||||
@@ -88,7 +89,7 @@ export function VariableEditorListRow({
|
||||
propsOnDuplicate(identifier);
|
||||
}}
|
||||
name="copy"
|
||||
tooltip="Duplicate variable"
|
||||
tooltip={t('variables.variable-editor-list-row.tooltip-duplicate-variable', 'Duplicate variable')}
|
||||
aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowDuplicateButtons(variable.name)}
|
||||
/>
|
||||
<IconButton
|
||||
@@ -98,7 +99,7 @@ export function VariableEditorListRow({
|
||||
propsOnDelete(identifier);
|
||||
}}
|
||||
name="trash-alt"
|
||||
tooltip="Remove variable"
|
||||
tooltip={t('variables.variable-editor-list-row.tooltip-remove-variable', 'Remove variable')}
|
||||
aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowRemoveButtons(variable.name)}
|
||||
/>
|
||||
<div {...provided.dragHandleProps} className={styles.dragHandle}>
|
||||
@@ -138,7 +139,10 @@ function VariableCheckIndicator({ passed }: VariableCheckIndicatorProps): ReactE
|
||||
<Icon
|
||||
name="check"
|
||||
className={styles.iconPassed}
|
||||
title="This variable is referenced by other variables or dashboard."
|
||||
title={t(
|
||||
'variables.variable-check-indicator.title-variable-referenced-other-variables-dashboard',
|
||||
'This variable is referenced by other variables or dashboard.'
|
||||
)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -147,7 +151,10 @@ function VariableCheckIndicator({ passed }: VariableCheckIndicatorProps): ReactE
|
||||
<Icon
|
||||
name="exclamation-triangle"
|
||||
className={styles.iconFailed}
|
||||
title="This variable is not referenced by any variable or dashboard."
|
||||
title={t(
|
||||
'variables.variable-check-indicator.title-variable-referenced-dashboard',
|
||||
'This variable is not referenced by any variable or dashboard.'
|
||||
)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { useMemo } from 'react';
|
||||
|
||||
import { reportInteraction } from '@grafana/runtime';
|
||||
import { IconButton } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { NetworkGraphModal } from './NetworkGraphModal';
|
||||
import { UsagesToNetwork } from './utils';
|
||||
@@ -35,7 +36,7 @@ export const VariableUsagesButton = ({ id, usages, isAdhoc }: Props) => {
|
||||
showModal();
|
||||
}}
|
||||
name="code-branch"
|
||||
tooltip="Show usages"
|
||||
tooltip={t('variables.variable-usages-button.tooltip-show-usages', 'Show usages')}
|
||||
/>
|
||||
);
|
||||
}}
|
||||
|
||||
@@ -3,6 +3,7 @@ import { useMemo } from 'react';
|
||||
import { TypedVariableModel } from '@grafana/data';
|
||||
import { reportInteraction } from '@grafana/runtime';
|
||||
import { Button } from '@grafana/ui';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { NetworkGraphModal } from './NetworkGraphModal';
|
||||
import { createDependencyEdges, createDependencyNodes, filterNodesWithDependencies } from './utils';
|
||||
@@ -22,7 +23,7 @@ export const VariablesDependenciesButton = ({ variables }: Props) => {
|
||||
return (
|
||||
<NetworkGraphModal
|
||||
show={false}
|
||||
title="Dependencies"
|
||||
title={t('variables.variables-dependencies-button.title-dependencies', 'Dependencies')}
|
||||
nodes={filterNodesWithDependencies(nodes, edges)}
|
||||
edges={edges}
|
||||
>
|
||||
@@ -36,7 +37,7 @@ export const VariablesDependenciesButton = ({ variables }: Props) => {
|
||||
icon="channel-add"
|
||||
variant="secondary"
|
||||
>
|
||||
Show dependencies
|
||||
<Trans i18nKey="variables.variables-dependencies-button.show-dependencies">Show dependencies</Trans>
|
||||
</Button>
|
||||
);
|
||||
}}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { useMemo } from 'react';
|
||||
|
||||
import { IconButton } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { NetworkGraphModal } from './NetworkGraphModal';
|
||||
import { UsagesToNetwork } from './utils';
|
||||
@@ -31,7 +32,7 @@ export const VariablesUnknownButton = ({ id, usages }: Props) => {
|
||||
<IconButton
|
||||
onClick={() => showModal()}
|
||||
name="code-branch"
|
||||
tooltip="Show usages"
|
||||
tooltip={t('variables.variables-unknown-button.VariablesUnknownButton-tooltip-show-usages', 'Show usages')}
|
||||
data-testid="VariablesUnknownButton"
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -5,6 +5,7 @@ import { useAsync } from 'react-use';
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import { reportInteraction } from '@grafana/runtime';
|
||||
import { CollapsableSection, HorizontalGroup, Icon, Spinner, Tooltip, useStyles2, VerticalGroup } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
import { DashboardModel } from '../../dashboard/state/DashboardModel';
|
||||
import { VariableModel } from '../types';
|
||||
@@ -57,7 +58,9 @@ export function VariablesUnknownTable({ variables, dashboard }: VariablesUnknown
|
||||
{loading && (
|
||||
<VerticalGroup justify="center">
|
||||
<HorizontalGroup justify="center">
|
||||
<span>Loading...</span>
|
||||
<span>
|
||||
<Trans i18nKey="variables.variables-unknown-table.loading">Loading...</Trans>
|
||||
</span>
|
||||
<Spinner />
|
||||
</HorizontalGroup>
|
||||
</VerticalGroup>
|
||||
@@ -86,7 +89,13 @@ function CollapseLabel(): ReactElement {
|
||||
}
|
||||
|
||||
function NoUnknowns(): ReactElement {
|
||||
return <span>No renamed or missing variables found.</span>;
|
||||
return (
|
||||
<span>
|
||||
<Trans i18nKey="variables.no-unknowns.no-renamed-or-missing-variables-found">
|
||||
No renamed or missing variables found.
|
||||
</Trans>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
function UnknownTable({ usages }: { usages: UsagesToNetwork[] }): ReactElement {
|
||||
@@ -95,7 +104,9 @@ function UnknownTable({ usages }: { usages: UsagesToNetwork[] }): ReactElement {
|
||||
<table className="filter-table filter-table--hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>
|
||||
<Trans i18nKey="variables.unknown-table.variable">Variable</Trans>
|
||||
</th>
|
||||
<th colSpan={5} />
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@@ -121,7 +121,7 @@ class VariableOptions extends PureComponent<Props> {
|
||||
role="checkbox"
|
||||
aria-checked={selectedValues.length > 1 ? 'mixed' : 'false'}
|
||||
onClick={this.onToggleAll}
|
||||
aria-label="Toggle all values"
|
||||
aria-label={t('variables.variable-options.aria-label-toggle-all-values', 'Toggle all values')}
|
||||
data-placement="top"
|
||||
>
|
||||
<span
|
||||
|
||||
@@ -3,6 +3,7 @@ import { PropsWithChildren, useMemo, useState } from 'react';
|
||||
import { VariableRefresh } from '@grafana/data';
|
||||
import { Field, RadioButtonGroup, useTheme2 } from '@grafana/ui';
|
||||
import { useMediaQueryChange } from 'app/core/hooks/useMediaQueryChange';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
interface Props {
|
||||
onChange: (option: VariableRefresh) => void;
|
||||
@@ -32,7 +33,14 @@ export function QueryVariableRefreshSelect({ onChange, refresh, testId }: PropsW
|
||||
);
|
||||
|
||||
return (
|
||||
<Field label="Refresh" description="When to update the values of this variable" data-testid={testId}>
|
||||
<Field
|
||||
label={t('variables.query-variable-refresh-select.label-refresh', 'Refresh')}
|
||||
description={t(
|
||||
'variables.query-variable-refresh-select.description-update-values-variable',
|
||||
'When to update the values of this variable'
|
||||
)}
|
||||
data-testid={testId}
|
||||
>
|
||||
<RadioButtonGroup
|
||||
options={REFRESH_OPTIONS}
|
||||
onChange={onChange}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { PropsWithChildren, useMemo } from 'react';
|
||||
|
||||
import { SelectableValue, VariableSort } from '@grafana/data';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { VariableSelectField } from '../../dashboard-scene/settings/variables/components/VariableSelectField';
|
||||
|
||||
@@ -28,7 +29,10 @@ export function QueryVariableSortSelect({ onChange, sort, testId }: PropsWithChi
|
||||
return (
|
||||
<VariableSelectField
|
||||
name="Sort"
|
||||
description="How to sort the values of this variable"
|
||||
description={t(
|
||||
'variables.query-variable-sort-select.description-values-variable',
|
||||
'How to sort the values of this variable'
|
||||
)}
|
||||
value={value}
|
||||
options={SORT_OPTIONS}
|
||||
onChange={onChange}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { FormEvent, ReactElement, useCallback } from 'react';
|
||||
|
||||
import { TextBoxVariableModel } from '@grafana/data';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { VariableLegend } from '../../dashboard-scene/settings/variables/components/VariableLegend';
|
||||
import { VariableTextField } from '../../dashboard-scene/settings/variables/components/VariableTextField';
|
||||
@@ -24,11 +25,13 @@ export function TextBoxVariableEditor({ onPropChange, variable: { query } }: Pro
|
||||
|
||||
return (
|
||||
<>
|
||||
<VariableLegend>Text options</VariableLegend>
|
||||
<VariableLegend>
|
||||
<Trans i18nKey="variables.text-box-variable-editor.text-options">Text options</Trans>
|
||||
</VariableLegend>
|
||||
<VariableTextField
|
||||
value={query}
|
||||
name="Default value"
|
||||
placeholder="default value, if any"
|
||||
placeholder={t('variables.text-box-variable-editor.placeholder-default-value-if-any', 'default value, if any')}
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
width={30}
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { SortOrder, TooltipDisplayMode } from '@grafana/schema';
|
||||
import { TextLink, useStyles2 } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
import { renderValue } from 'app/plugins/panel/geomap/utils/uiUtils';
|
||||
|
||||
import { ExemplarHoverView } from './ExemplarHoverView';
|
||||
@@ -138,7 +139,9 @@ export const DataHoverView = ({
|
||||
))}
|
||||
{links.map((link, i) => (
|
||||
<tr key={i}>
|
||||
<th>Link</th>
|
||||
<th>
|
||||
<Trans i18nKey="visualization.data-hover-view.link">Link</Trans>
|
||||
</th>
|
||||
<td colSpan={2}>
|
||||
<TextLink href={link.href} external={link.target === '_blank'} weight={'medium'} inline={false}>
|
||||
{link.title}
|
||||
|
||||
@@ -4327,6 +4327,73 @@
|
||||
"title": "You haven't created any service accounts yet"
|
||||
}
|
||||
},
|
||||
"serviceaccounts": {
|
||||
"create-token-modal": {
|
||||
"close": "Close",
|
||||
"copy-clipboard": "Copy to clipboard",
|
||||
"copy-to-clipboard-and-close": "Copy to clipboard and close",
|
||||
"description-name-to-easily-identify-the-token": "Name to easily identify the token",
|
||||
"generate-token": "Generate token",
|
||||
"label-display-name": "Display name",
|
||||
"label-expiration": "Expiration",
|
||||
"label-expiration-date": "Expiration date",
|
||||
"label-token": "Token"
|
||||
},
|
||||
"get-actions-cell": {
|
||||
"add-token": "Add token",
|
||||
"disable": "Disable",
|
||||
"enable": "Enable"
|
||||
},
|
||||
"get-role-cell": {
|
||||
"aria-label-role": "Role"
|
||||
},
|
||||
"service-account-list-item": {
|
||||
"add-token": "Add token",
|
||||
"aria-label-role": "Role",
|
||||
"disable": "Disable",
|
||||
"enable": "Enable",
|
||||
"title-tokens": "Tokens"
|
||||
},
|
||||
"service-account-page-unconnected": {
|
||||
"add-service-account-token": "Add service account token",
|
||||
"delete-service-account": "Delete service account",
|
||||
"disable-service-account": "Disable service account",
|
||||
"enable-service-account": "Enable service account",
|
||||
"title-delete-service-account": "Delete service account",
|
||||
"title-disable-service-account": "Disable service account",
|
||||
"tokens": "Tokens"
|
||||
},
|
||||
"service-account-permissions": {
|
||||
"title-permissions": "Permissions"
|
||||
},
|
||||
"service-account-profile": {
|
||||
"information": "Information",
|
||||
"label-creation-date": "Creation date",
|
||||
"label-id": "ID",
|
||||
"label-name": "Name",
|
||||
"label-numerical-identifier": "Numerical identifier",
|
||||
"label-roles": "Roles",
|
||||
"used-by": "Used by"
|
||||
},
|
||||
"service-account-role-row": {
|
||||
"aria-label-role": "Role"
|
||||
},
|
||||
"service-account-tokens-table": {
|
||||
"created": "Created",
|
||||
"expires": "Expires",
|
||||
"last-used-at": "Last used at",
|
||||
"name": "Name"
|
||||
},
|
||||
"service-accounts-list-page-unconnected": {
|
||||
"add-service-account": "Add service account",
|
||||
"placeholder-search-service-account-by-name": "Search service account by name",
|
||||
"title-delete-service-account": "Delete service account",
|
||||
"title-disable-service-account": "Disable service account"
|
||||
},
|
||||
"token-expiration": {
|
||||
"never": "Never"
|
||||
}
|
||||
},
|
||||
"share-dashboard": {
|
||||
"menu": {
|
||||
"export-json-title": "Export as JSON",
|
||||
@@ -4707,24 +4774,67 @@
|
||||
}
|
||||
},
|
||||
"trails": {
|
||||
"add-to-filters-graph-action": {
|
||||
"add-to-filters": "Add to filters"
|
||||
},
|
||||
"bookmarks": {
|
||||
"or-view-bookmarks": "Or view bookmarks"
|
||||
},
|
||||
"breakdown-search-scene": {
|
||||
"placeholder-search-for-value": "Search for value"
|
||||
},
|
||||
"build-normal-layout": {
|
||||
"text-loading": "Loading..."
|
||||
},
|
||||
"card": {
|
||||
"date-created": "Date created: "
|
||||
},
|
||||
"create-bookmark-saved-notification": {
|
||||
"view-bookmarks": "View bookmarks"
|
||||
},
|
||||
"data-trail-card": {
|
||||
"deleteButton-tooltip-remove-bookmark": "Remove bookmark"
|
||||
},
|
||||
"data-trail-history": {
|
||||
"history": "History"
|
||||
},
|
||||
"data-trail-settings": {
|
||||
"render-popover": {
|
||||
"settings": "Settings"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"learn-more": "Learn more",
|
||||
"lets-start": "Let's start!",
|
||||
"start-your-metrics-exploration": "Start your metrics exploration!",
|
||||
"subtitle": "Explore your Prometheus-compatible metrics without writing a query."
|
||||
},
|
||||
"label-breakdown-scene": {
|
||||
"label-search": "Search",
|
||||
"label-view": "View"
|
||||
},
|
||||
"metric-action-bar": {
|
||||
"open": "Open",
|
||||
"select-new-metric": "Select new metric",
|
||||
"tooltip-open-in-explore": "Open in explore",
|
||||
"tooltip-remove-existing-metric-choose": "Remove existing metric and choose a new metric"
|
||||
},
|
||||
"metric-select": {
|
||||
"filter-by": "Filter by",
|
||||
"native-histogram": "Native Histogram",
|
||||
"new-badge": "New",
|
||||
"otel-switch": "This switch enables filtering by OTel resources for OTel native data sources."
|
||||
},
|
||||
"metric-select-scene": {
|
||||
"label-otel-experience": "OTel experience",
|
||||
"placeholder-search-metrics": "Search metrics",
|
||||
"title-unable-to-retrieve-all-metric-names": "Unable to retrieve all metric names",
|
||||
"unable-to-retrieve-metric-names": "Unable to retrieve metric names"
|
||||
},
|
||||
"metrics-header": {
|
||||
"explore-prometheuscompatible-metrics-without-writing-query": "Explore your Prometheus-compatible metrics without writing a query",
|
||||
"metrics": "Metrics"
|
||||
},
|
||||
"native-histogram-banner": {
|
||||
"ch-heatmap": "Classic Histogram displayed as heatmap:",
|
||||
"ch-histogram": "Classic Histogram displayed as histogram:",
|
||||
@@ -4745,6 +4855,9 @@
|
||||
"settings": {
|
||||
"always-keep-selected-metric-graph-in-view": "Always keep selected metric graph in-view",
|
||||
"show-previews-of-metric-graphs": "Show previews of metric graphs"
|
||||
},
|
||||
"sort-by-scene": {
|
||||
"tooltip-sorts-values-using-standard-smart-series": "Sorts values using standard or smart time series calculations."
|
||||
}
|
||||
},
|
||||
"transformations": {
|
||||
@@ -4753,6 +4866,236 @@
|
||||
"add-transformation-header": "Start transforming data"
|
||||
}
|
||||
},
|
||||
"transformers": {
|
||||
"axis-editor": {
|
||||
"placeholder-auto": "Auto"
|
||||
},
|
||||
"basic-matcher-editor": {
|
||||
"placeholder-value-or-variable": "Value or variable"
|
||||
},
|
||||
"binary-operation-options-editor": {
|
||||
"label-operation": "Operation",
|
||||
"placeholder-field-or-number": "Field or number",
|
||||
"placeholder-fields-or-number": "Field(s) or number"
|
||||
},
|
||||
"calculate-field-transformer-editor": {
|
||||
"label-alias": "Alias",
|
||||
"label-mode": "Mode",
|
||||
"label-replace-all-fields": "Replace all fields"
|
||||
},
|
||||
"concatenate-transformer-editor": {
|
||||
"label-label": "Label",
|
||||
"label-name": "Name",
|
||||
"placeholder-frame": "Frame"
|
||||
},
|
||||
"config-from-query-transformer-editor": {
|
||||
"label-apply-to": "Apply to",
|
||||
"label-apply-to-options": "Apply to options",
|
||||
"label-config-query": "Config query"
|
||||
},
|
||||
"convert-field-type-transformer-editor": {
|
||||
"label-date-format": "Date format",
|
||||
"label-input-format": "Input format",
|
||||
"label-join-with": "Join with",
|
||||
"label-set-timezone": "Set timezone",
|
||||
"tooltip-explicit-separator-joining-array-values": "Use an explicit separator when joining array values",
|
||||
"tooltip-specify-the-output-format": "Specify the output format.",
|
||||
"tooltip-timezone-manually": "Set the timezone of the date manually"
|
||||
},
|
||||
"cumulative-options-editor": {
|
||||
"label-calculation": "Calculation",
|
||||
"label-field": "Field",
|
||||
"placeholder-field": "Field"
|
||||
},
|
||||
"draggable-field-name": {
|
||||
"title-drag-and-drop-to-reorder": "Drag and drop to reorder"
|
||||
},
|
||||
"enum-mapping-editor": {
|
||||
"add-enum-value": "Add enum value",
|
||||
"generate-enum-values-from-data": "Generate enum values from data"
|
||||
},
|
||||
"enum-mapping-row": {
|
||||
"remove-enum-row-aria-label-delete-enum-row": "Delete enum row",
|
||||
"remove-enum-row-tooltip-delete": "Delete"
|
||||
},
|
||||
"extract-fields-transformer-editor": {
|
||||
"label-delimiter": "Delimiter",
|
||||
"placeholder-select-delimiter": "Select delimiter..."
|
||||
},
|
||||
"field-to-config-mapping-editor": {
|
||||
"additional-settings": "Additional settings",
|
||||
"field": "Field",
|
||||
"select": "Select",
|
||||
"use-as": "Use as"
|
||||
},
|
||||
"filter-by-name-transformer-editor": {
|
||||
"label-from-variable": "From variable",
|
||||
"label-identifier": "Identifier",
|
||||
"label-use-variable": "Use variable",
|
||||
"label-variable": "Variable",
|
||||
"placeholder-regular-expression-pattern": "Regular expression pattern"
|
||||
},
|
||||
"filter-by-value-filter-editor": {
|
||||
"label-field": "Field",
|
||||
"label-match": "Match",
|
||||
"label-value": "Value",
|
||||
"placeholder-field-name": "Field name",
|
||||
"placeholder-select-test": "Select test"
|
||||
},
|
||||
"filter-by-value-transformer-editor": {
|
||||
"add-condition": "Add condition",
|
||||
"label-conditions": "Conditions",
|
||||
"label-filter-type": "Filter type"
|
||||
},
|
||||
"format-string-transfomer-editor": {
|
||||
"label-format": "Format",
|
||||
"label-substring-range": "Substring range"
|
||||
},
|
||||
"format-time-transfomer-editor": {
|
||||
"label-format": "Format",
|
||||
"label-set-timezone": "Set timezone",
|
||||
"label-time-field": "Time field",
|
||||
"tooltip-timezone-manually": "Set the timezone of the date manually"
|
||||
},
|
||||
"get-tooltips": {
|
||||
"json-value": "JSON Value:"
|
||||
},
|
||||
"group-by-field-configuration": {
|
||||
"placeholder-ignored": "Ignored",
|
||||
"placeholder-select-stats": "Select stats"
|
||||
},
|
||||
"group-to-nested-table-transformer-editor": {
|
||||
"label-show-field-names-in-nested-tables": "Show field names in nested tables"
|
||||
},
|
||||
"grouping-to-matrix-transformer-editor": {
|
||||
"label-cell-value": "Cell value",
|
||||
"label-column": "Column",
|
||||
"label-empty-value": "Empty value",
|
||||
"label-row": "Row"
|
||||
},
|
||||
"histogram-transformer-editor": {
|
||||
"placeholder-default": "Default: 30"
|
||||
},
|
||||
"index-options-editor": {
|
||||
"label-as-percentile": "As percentile",
|
||||
"tooltip-transform-index-percentile": "Transform the row index as a percentile."
|
||||
},
|
||||
"join-by-labels-transformer-editor": {
|
||||
"info": {
|
||||
"input-contain-labels": "The input does not contain any labels",
|
||||
"no-input-or-labels-found": "No input (or labels) found",
|
||||
"title-no-input-found": "No input found",
|
||||
"title-no-labels-found": "No labels found"
|
||||
},
|
||||
"tooltip-select-label-indicating-values": "Select the label indicating the values name"
|
||||
},
|
||||
"jsonpath-editor": {
|
||||
"add-path": "Add path",
|
||||
"label-alias": "Alias",
|
||||
"label-field": "Field",
|
||||
"placeholder-valid-objectvalue": "A valid json path, e.g. \"object.value1\" or \"object.value2[0]\"",
|
||||
"tooltip-remove-path": "Remove path"
|
||||
},
|
||||
"labels-as-fields-transformer-editor": {
|
||||
"placeholder-optional-select-label": "(Optional) Select label",
|
||||
"tooltip-replace-value-field-label": "Replace the value field name with a label"
|
||||
},
|
||||
"limit-transformer-editor": {
|
||||
"placeholder-value-or-variable": "Value or variable"
|
||||
},
|
||||
"long-info": {
|
||||
"ascending-order-duplicates": "Time in ascending order, but may have duplicates",
|
||||
"multiple-value-fields-may-exist": "Multiple value fields may exist",
|
||||
"single-frame": "Single frame",
|
||||
"st-field-is-time": "1st field is time field"
|
||||
},
|
||||
"merge-transformer-editor": {
|
||||
"merge-effect-applied-single-frame": "Merge has no effect when applied on a single frame."
|
||||
},
|
||||
"multi-info": {
|
||||
"all-values-are-numeric": "All values are numeric",
|
||||
"multiple-frames": "Multiple frames",
|
||||
"string-values-are-represented-as-labels": "String values are represented as labels",
|
||||
"time-in-ascending-order": "Time in ascending order"
|
||||
},
|
||||
"partition-by-values-editor": {
|
||||
"label-field": "Field",
|
||||
"label-select-field": "Select field",
|
||||
"partition-values-works-single-frame": "Partition by values only works with a single frame."
|
||||
},
|
||||
"prepare-time-series-editor": {
|
||||
"label-format": "Format",
|
||||
"label-info": "Info"
|
||||
},
|
||||
"range-matcher-editor": {
|
||||
"and": "and",
|
||||
"placeholder-from": "From",
|
||||
"placeholder-to": "To"
|
||||
},
|
||||
"reduce-row-options-editor": {
|
||||
"label-calculation": "Calculation",
|
||||
"label-operation": "Operation"
|
||||
},
|
||||
"reduce-transformer-editor": {
|
||||
"label-calculations": "Calculations",
|
||||
"label-include-time": "Include time",
|
||||
"label-labels-to-fields": "Labels to fields",
|
||||
"label-mode": "Mode",
|
||||
"placeholder-choose-stat": "Choose stat"
|
||||
},
|
||||
"regex-matcher-editor": {
|
||||
"placeholder-value-or-variable": "Value or variable"
|
||||
},
|
||||
"regression-transformer-editor": {
|
||||
"label-degree": "Degree",
|
||||
"label-model-type": "Model type",
|
||||
"label-predicted-points": "Predicted points",
|
||||
"label-x-field": "X field",
|
||||
"label-y-field": "Y field"
|
||||
},
|
||||
"rename-by-regex-transformer-editor": {
|
||||
"label-match": "Match",
|
||||
"label-replace": "Replace",
|
||||
"placeholder-regular-expression-pattern": "Regular expression pattern",
|
||||
"placeholder-replacement-pattern": "Replacement pattern"
|
||||
},
|
||||
"series-to-fields-transformer-editor": {
|
||||
"label-field": "Field",
|
||||
"label-mode": "Mode"
|
||||
},
|
||||
"sort-by-transformer-editor": {
|
||||
"label-field": "Field",
|
||||
"label-reverse": "Reverse",
|
||||
"placeholder-select-field": "Select field"
|
||||
},
|
||||
"time-series-table-transform-editor": {
|
||||
"label-stat": "Stat",
|
||||
"label-time-field": "Time field",
|
||||
"tooltip-statistic-should-calculated-series": "The statistic that should be calculated for this time series."
|
||||
},
|
||||
"transpose-transfomer-editor": {
|
||||
"placeholder-field": "Field",
|
||||
"placeholder-value": "Value"
|
||||
},
|
||||
"unary-operation-editor": {
|
||||
"label-operation": "Operation",
|
||||
"placeholder-field": "Field"
|
||||
},
|
||||
"wide-info": {
|
||||
"multiple-value-fields-of-any-type": "Multiple value fields of any type",
|
||||
"single-frame": "Single frame",
|
||||
"st-field-is-shared-time": "1st field is shared time field",
|
||||
"time-in-ascending-order": "Time in ascending order"
|
||||
},
|
||||
"window-options-editor": {
|
||||
"label-calculation": "Calculation",
|
||||
"label-field": "Field",
|
||||
"label-type": "Type",
|
||||
"label-window-size-mode": "Window size mode",
|
||||
"placeholder-auto": "Auto",
|
||||
"placeholder-field": "Field"
|
||||
}
|
||||
},
|
||||
"upgrade-box": {
|
||||
"discovery-text": "You’ve discovered a Pro feature!",
|
||||
"discovery-text-continued": "Get the Grafana Pro plan to access {{featureName}}.",
|
||||
@@ -4794,6 +5137,13 @@
|
||||
"users": {
|
||||
"empty-state": {
|
||||
"message": "No users found"
|
||||
},
|
||||
"token-revoked-modal": {
|
||||
"sign-in": "Sign in"
|
||||
},
|
||||
"users-action-bar-unconnected": {
|
||||
"invite": "Invite",
|
||||
"placeholder-search-login-email": "Search user by login, email or name"
|
||||
}
|
||||
},
|
||||
"users-access-list": {
|
||||
@@ -4820,17 +5170,85 @@
|
||||
}
|
||||
},
|
||||
"variables": {
|
||||
"ad-hoc-filter": {
|
||||
"label-and": "AND"
|
||||
},
|
||||
"confirm-delete-modal": {
|
||||
"title-delete-variable": "Delete variable"
|
||||
},
|
||||
"empty-state": {
|
||||
"button-title": "Add variable",
|
||||
"info-box-content": "Variables enable more interactive and dynamic dashboards. Instead of hard-coding things like server or sensor names in your metric queries you can use variables in their place. Variables are shown as list boxes at the top of the dashboard. These drop-down lists make it easy to change the data being displayed in your dashboard.",
|
||||
"info-box-content-2": "Check out the <2>Templates and variables documentation</2> for more information.",
|
||||
"title": "There are no variables added yet"
|
||||
},
|
||||
"legacy-variable-query-editor": {
|
||||
"placeholder-metric-name-or-tags-query": "Metric name or tags query"
|
||||
},
|
||||
"no-unknowns": {
|
||||
"no-renamed-or-missing-variables-found": "No renamed or missing variables found."
|
||||
},
|
||||
"query-variable-refresh-select": {
|
||||
"description-update-values-variable": "When to update the values of this variable",
|
||||
"label-refresh": "Refresh"
|
||||
},
|
||||
"query-variable-sort-select": {
|
||||
"description-values-variable": "How to sort the values of this variable"
|
||||
},
|
||||
"text-box-variable-editor": {
|
||||
"placeholder-default-value-if-any": "default value, if any",
|
||||
"text-options": "Text options"
|
||||
},
|
||||
"unknown-table": {
|
||||
"loading": "Loading...",
|
||||
"no-unknowns": "No renamed or missing variables found.",
|
||||
"renamed-or-missing-variables": "Renamed or missing variables",
|
||||
"variable": "Variable"
|
||||
},
|
||||
"variable-check-indicator": {
|
||||
"title-variable-referenced-dashboard": "This variable is not referenced by any variable or dashboard.",
|
||||
"title-variable-referenced-other-variables-dashboard": "This variable is referenced by other variables or dashboard."
|
||||
},
|
||||
"variable-editor-editor-un-connected": {
|
||||
"apply": "Apply",
|
||||
"aria-label-variable-editor-form": "Variable editor Form",
|
||||
"delete": "Delete",
|
||||
"description-optional-display-name": "Optional display name",
|
||||
"description-template-variable-characters": "The name of the template variable. (Max. 50 characters)",
|
||||
"general": "General",
|
||||
"placeholder-descriptive-text": "Descriptive text",
|
||||
"placeholder-label-name": "Label name",
|
||||
"placeholder-variable-name": "Variable name"
|
||||
},
|
||||
"variable-editor-list": {
|
||||
"definition": "Definition",
|
||||
"new-variable": "New variable",
|
||||
"variable": "Variable"
|
||||
},
|
||||
"variable-editor-list-row": {
|
||||
"tooltip-duplicate-variable": "Duplicate variable",
|
||||
"tooltip-remove-variable": "Remove variable"
|
||||
},
|
||||
"variable-options": {
|
||||
"aria-label-toggle-all-values": "Toggle all values"
|
||||
},
|
||||
"variable-usages-button": {
|
||||
"tooltip-show-usages": "Show usages"
|
||||
},
|
||||
"variables-dependencies-button": {
|
||||
"show-dependencies": "Show dependencies",
|
||||
"title-dependencies": "Dependencies"
|
||||
},
|
||||
"variables-unknown-button": {
|
||||
"VariablesUnknownButton-tooltip-show-usages": "Show usages"
|
||||
},
|
||||
"variables-unknown-table": {
|
||||
"loading": "Loading..."
|
||||
}
|
||||
},
|
||||
"visualization": {
|
||||
"data-hover-view": {
|
||||
"link": "Link"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user