Internationalisation: More markup for translations (#103726)
* mark up variables/trails/transformers * more markup * fix unit tests * final unit test fix
This commit is contained in:
+21
-183
@@ -2693,8 +2693,7 @@ exports[`better eslint`] = {
|
||||
],
|
||||
"public/app/features/plugins/admin/pages/Browse.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, "Do not use any type assertions.", "1"]
|
||||
],
|
||||
"public/app/features/plugins/admin/state/actions.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
@@ -2744,9 +2743,6 @@ exports[`better eslint`] = {
|
||||
"public/app/features/profile/FeatureTogglePage.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/profile/UserSessions.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/provisioning/File/FileStatusPage.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "Do not use any type assertions.", "1"]
|
||||
@@ -2761,31 +2757,26 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"]
|
||||
],
|
||||
"public/app/features/query/components/QueryEditorRowHeader.tsx:5381": [
|
||||
[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"]
|
||||
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"]
|
||||
],
|
||||
"public/app/features/query/components/QueryErrorAlert.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/query/components/QueryGroup.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. Wrap text with <Trans />", "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"]
|
||||
[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"]
|
||||
],
|
||||
"public/app/features/query/components/QueryGroupOptions.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 />", "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 />", "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 />", "8"]
|
||||
],
|
||||
"public/app/features/query/state/DashboardQueryRunner/AnnotationsQueryRunner.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
@@ -2842,20 +2833,6 @@ exports[`better eslint`] = {
|
||||
"public/app/features/search/utils.ts:5381": [
|
||||
[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"]
|
||||
],
|
||||
"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"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/ServiceAccountsListPage.tsx:5381": [
|
||||
[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"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/components/ServiceAccountProfileRow.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
@@ -2864,39 +2841,9 @@ exports[`better eslint`] = {
|
||||
[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/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"]
|
||||
],
|
||||
"public/app/features/serviceaccounts/state/reducers.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/features/support-bundles/SupportBundles.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/support-bundles/SupportBundlesCreate.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/teams/CreateTeam.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/teams/TeamGroupSync.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"]
|
||||
],
|
||||
"public/app/features/teams/TeamList.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/teams/TeamSettings.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/features/teams/state/reducers.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
@@ -2931,15 +2878,6 @@ 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/LabelBreakdownScene.tsx:5381": [
|
||||
[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"]
|
||||
],
|
||||
"public/app/features/trails/Breakdown/types.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
@@ -2952,19 +2890,9 @@ exports[`better eslint`] = {
|
||||
"public/app/features/trails/DataTrailCard.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"]
|
||||
],
|
||||
"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. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
|
||||
],
|
||||
"public/app/features/trails/TrailStore/utils.tsx:5381": [
|
||||
[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"]
|
||||
[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/FilterByValueTransformer/ValueMatchers/BasicMatcherEditor.tsx:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
@@ -2997,10 +2925,6 @@ exports[`better eslint`] = {
|
||||
[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"]
|
||||
],
|
||||
"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. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
@@ -3009,16 +2933,7 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Do not re-export imported variable (\`calculateFieldTransformRegistryItem\`)", "1"]
|
||||
],
|
||||
"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"],
|
||||
[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 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, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"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"],
|
||||
@@ -3027,32 +2942,11 @@ exports[`better eslint`] = {
|
||||
"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"]
|
||||
],
|
||||
"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"]
|
||||
],
|
||||
"public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx:5381": [
|
||||
[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"]
|
||||
],
|
||||
"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"]
|
||||
],
|
||||
"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"]
|
||||
],
|
||||
"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"]
|
||||
],
|
||||
"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. Wrap text with <Trans />", "1"]
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/editors/ReduceTransformerEditor.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
@@ -3060,24 +2954,12 @@ exports[`better eslint`] = {
|
||||
"public/app/features/transformers/editors/SortByTransformerEditor.tsx:5381": [
|
||||
[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"]
|
||||
],
|
||||
"public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.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 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 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, "Unexpected any. Specify a different type.", "10"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
|
||||
],
|
||||
"public/app/features/transformers/extractFields/components/JSONPathEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
@@ -3085,9 +2967,6 @@ exports[`better eslint`] = {
|
||||
"public/app/features/transformers/extractFields/fieldExtractors.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/fieldToConfigMapping/FieldConfigMappingHandlerArgumentsEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"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"]
|
||||
@@ -3100,30 +2979,13 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
|
||||
],
|
||||
"public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.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, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/lookupGazetteer/FieldLookupTransformerEditor.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, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/features/transformers/partitionByValues/PartitionByValuesEditor.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"]
|
||||
],
|
||||
"public/app/features/transformers/prepareTimeSeries/PrepareTimeSeriesEditor.tsx:5381": [
|
||||
[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/regression/regressionEditor.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
[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/spatial/optionsHelper.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
@@ -3139,12 +3001,8 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Do not use any type assertions.", "2"],
|
||||
[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"]
|
||||
],
|
||||
"public/app/features/users/TokenRevokedModal.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/variables/adapters.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||
@@ -3189,16 +3047,9 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
|
||||
],
|
||||
"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"]
|
||||
],
|
||||
"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"]
|
||||
],
|
||||
"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, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"]
|
||||
],
|
||||
"public/app/features/variables/inspect/utils.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
@@ -3212,15 +3063,11 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
|
||||
],
|
||||
"public/app/features/variables/pickers/PickerRenderer.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/variables/pickers/index.ts:5381": [
|
||||
[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. Wrap text with <Trans />", "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", "0"]
|
||||
],
|
||||
"public/app/features/variables/query/QueryVariableEditor.tsx:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||
@@ -3308,10 +3155,6 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
|
||||
],
|
||||
"public/app/features/visualization/data-hover/DataHoverRows.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
|
||||
],
|
||||
"public/app/plugins/datasource/alertmanager/types.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
|
||||
@@ -4162,9 +4005,6 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "17"]
|
||||
],
|
||||
"public/app/routes/RoutesWrapper.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
|
||||
],
|
||||
"public/app/store/configureStore.ts:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
@@ -4237,9 +4077,7 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/swagger/SwaggerPage.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, "Unexpected any. Specify a different type.", "2"]
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
"public/swagger/index.tsx:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
|
||||
@@ -4,9 +4,9 @@ import { useLocation } from 'react-router-dom-v5-compat';
|
||||
|
||||
import { SelectableValue, GrafanaTheme2, PluginType } from '@grafana/data';
|
||||
import { locationSearchToObject } from '@grafana/runtime';
|
||||
import { Select, RadioButtonGroup, useStyles2, Tooltip, Field } from '@grafana/ui';
|
||||
import { Select, RadioButtonGroup, useStyles2, Tooltip, Field, TextLink } from '@grafana/ui';
|
||||
import { Page } from 'app/core/components/Page/Page';
|
||||
import { t } from 'app/core/internationalization';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
import { getNavModel } from 'app/core/selectors/navModel';
|
||||
import { ROUTES as CONNECTIONS_ROUTES } from 'app/features/connections/constants';
|
||||
import { useSelector } from 'app/types';
|
||||
@@ -76,11 +76,10 @@ export default function Browse() {
|
||||
|
||||
const subTitle = (
|
||||
<div>
|
||||
Extend the Grafana experience with panel plugins and apps. To find more data sources go to{' '}
|
||||
<a className="external-link" href={`${CONNECTIONS_ROUTES.AddNewConnection}?cat=data-source`}>
|
||||
Connections
|
||||
</a>
|
||||
.
|
||||
<Trans i18nKey="plugins.browse.subtitle">
|
||||
Extend the Grafana experience with panel plugins and apps. To find more data sources go to{' '}
|
||||
<TextLink href={`${CONNECTIONS_ROUTES.AddNewConnection}?cat=data-source`}>Connections</TextLink>.
|
||||
</Trans>
|
||||
</div>
|
||||
);
|
||||
|
||||
|
||||
@@ -66,7 +66,12 @@ class UserSessions extends PureComponent<Props> {
|
||||
<td>{formatDate(session.createdAt, { dateStyle: 'long' })}</td>
|
||||
<td>{session.clientIp}</td>
|
||||
<td>
|
||||
{session.browser} on {session.os} {session.osVersion}
|
||||
<Trans
|
||||
i18nKey="profile.user-sessions.browser-details"
|
||||
values={{ browser: session.browser, os: session.os, osVersion: session.osVersion }}
|
||||
>
|
||||
{'{{browser}}'} on {'{{os}}'} {'{{osVersion}}'}
|
||||
</Trans>
|
||||
</td>
|
||||
<td>
|
||||
{session.authModule && <TagBadge label={session.authModule} removeIcon={false} count={0} />}
|
||||
|
||||
@@ -138,6 +138,7 @@ const renderDataSource = <TQuery extends DataQuery>(
|
||||
const { alerting, dataSource, onChangeDataSource } = props;
|
||||
|
||||
if (!onChangeDataSource) {
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
return <em className={styles.contextInfo}>({dataSource.name})</em>;
|
||||
}
|
||||
|
||||
|
||||
@@ -312,7 +312,9 @@ export class QueryGroup extends PureComponent<Props, State> {
|
||||
className={styles.expressionButton}
|
||||
data-testid="query-tab-add-expression"
|
||||
>
|
||||
<span>Expression </span>
|
||||
<span>
|
||||
<Trans i18nKey="query.query-group.expression">Expression</Trans>
|
||||
</span>
|
||||
</Button>
|
||||
)}
|
||||
{this.renderExtraActions()}
|
||||
|
||||
@@ -191,6 +191,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data,
|
||||
</InlineLabel>
|
||||
<Input
|
||||
type="number"
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
placeholder={`${dataSource.cachingConfig.TTLMs}`}
|
||||
spellCheck={false}
|
||||
onBlur={onQueryCachingTTLBlur}
|
||||
@@ -223,6 +224,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data,
|
||||
<Input
|
||||
id="max-data-points-input"
|
||||
type="number"
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
placeholder={`${realMd}`}
|
||||
spellCheck={false}
|
||||
onBlur={onMaxDataPointsBlur}
|
||||
@@ -263,6 +265,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data,
|
||||
<Input
|
||||
id="min-interval-input"
|
||||
type="text"
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
placeholder={`${minIntervalOnDs}`}
|
||||
spellCheck={false}
|
||||
onBlur={onMinIntervalBlur}
|
||||
|
||||
@@ -179,7 +179,10 @@ export const ServiceAccountPageUnconnected = ({
|
||||
disabled={true}
|
||||
name="lock"
|
||||
size="md"
|
||||
tooltip={`This is a managed service account and cannot be modified.`}
|
||||
tooltip={t(
|
||||
'serviceaccounts.service-account-page-unconnected.tooltip-managed-service-account-cannot-modified',
|
||||
'This is a managed service account and cannot be modified'
|
||||
)}
|
||||
/>
|
||||
</Stack>
|
||||
)}
|
||||
|
||||
@@ -228,7 +228,11 @@ const getActionsCell = (
|
||||
{contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsDelete, original) && (
|
||||
<IconButton
|
||||
name="trash-alt"
|
||||
aria-label={`Delete service account ${original.name}`}
|
||||
aria-label={t(
|
||||
'serviceaccounts.get-actions-cell.aria-label-delete-button',
|
||||
'Delete service account {{serviceAccountName}}',
|
||||
{ serviceAccountName: original.name }
|
||||
)}
|
||||
variant="secondary"
|
||||
onClick={() => onRemoveButtonClick(original)}
|
||||
/>
|
||||
@@ -240,7 +244,10 @@ const getActionsCell = (
|
||||
disabled={true}
|
||||
name="lock"
|
||||
size="md"
|
||||
tooltip={`This is a managed service account and cannot be modified.`}
|
||||
tooltip={t(
|
||||
'serviceaccounts.get-actions-cell.tooltip-managed-service-account-cannot-modified',
|
||||
'This is a managed service account and cannot be modified'
|
||||
)}
|
||||
/>
|
||||
</Stack>
|
||||
);
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
Box,
|
||||
Stack,
|
||||
useStyles2,
|
||||
TextLink,
|
||||
} from '@grafana/ui';
|
||||
import { Page } from 'app/core/components/Page/Page';
|
||||
import config from 'app/core/config';
|
||||
@@ -172,20 +173,14 @@ export const ServiceAccountsListPageUnconnected = ({
|
||||
setCurrentServiceAccount(null);
|
||||
};
|
||||
|
||||
const docsLink = (
|
||||
<a
|
||||
className="external-link"
|
||||
href="https://grafana.com/docs/grafana/latest/administration/service-accounts/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
documentation.
|
||||
</a>
|
||||
);
|
||||
const subTitle = (
|
||||
<span>
|
||||
Service accounts and their tokens can be used to authenticate against the Grafana API. Find out more in our{' '}
|
||||
{docsLink}
|
||||
<Trans i18nKey="serviceaccounts.service-accounts-list-page-unconnected.sub-title">
|
||||
Service accounts and their tokens can be used to authenticate against the Grafana API. Find out more in our{' '}
|
||||
<TextLink href="https://grafana.com/docs/grafana/latest/administration/service-accounts/" external>
|
||||
documentation.
|
||||
</TextLink>
|
||||
</Trans>
|
||||
</span>
|
||||
);
|
||||
|
||||
|
||||
@@ -136,7 +136,10 @@ export const CreateTokenModal = ({ isOpen, token, serviceAccountLogin, onCreateT
|
||||
<>
|
||||
<Field
|
||||
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."
|
||||
description={t(
|
||||
'serviceaccounts.create-token-modal.description-token',
|
||||
'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}>
|
||||
<Input name="tokenValue" value={token} readOnly />
|
||||
|
||||
@@ -142,7 +142,11 @@ const ServiceAccountListItemComponent = memo(
|
||||
name="trash-alt"
|
||||
size="md"
|
||||
onClick={() => onRemoveButtonClick(serviceAccount)}
|
||||
tooltip={`Delete service account ${serviceAccount.name}`}
|
||||
tooltip={t(
|
||||
'serviceaccounts.service-account-list-item.tooltip-delete-button',
|
||||
'Delete service account {{serviceAccountName}}',
|
||||
{ serviceAccountName: serviceAccount.name }
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
</Stack>
|
||||
@@ -153,7 +157,10 @@ const ServiceAccountListItemComponent = memo(
|
||||
disabled={true}
|
||||
name="lock"
|
||||
size="md"
|
||||
tooltip={`This is a managed service account and cannot be modified.`}
|
||||
tooltip={t(
|
||||
'serviceaccounts.service-account-list-item.tooltip-managed-service-account-cannot-modified',
|
||||
'This is a managed service account and cannot be modified'
|
||||
)}
|
||||
/>
|
||||
</Stack>
|
||||
)}
|
||||
|
||||
@@ -10,13 +10,6 @@ import { AccessControlAction, StoreState } from 'app/types';
|
||||
|
||||
import { loadBundles, removeBundle, checkBundles } from './state/actions';
|
||||
|
||||
const subTitle = (
|
||||
<span>
|
||||
Support bundles allow you to easily collect and share Grafana logs, configuration, and data with the Grafana Labs
|
||||
team.
|
||||
</span>
|
||||
);
|
||||
|
||||
const NewBundleButton = (
|
||||
<LinkButton icon="plus" href="support-bundles/create" variant="primary">
|
||||
<Trans i18nKey="support-bundles.new-bundle-button.new-support-bundle">New support bundle</Trans>
|
||||
@@ -58,6 +51,15 @@ const SupportBundlesUnconnected = ({ supportBundles, isLoading, loadBundles, rem
|
||||
|
||||
const actions = hasAccess ? NewBundleButton : undefined;
|
||||
|
||||
const subTitle = (
|
||||
<span>
|
||||
<Trans i18nKey="support-bundles.support-bundles-unconnected.sub-title">
|
||||
Support bundles allow you to easily collect and share Grafana logs, configuration, and data with the Grafana
|
||||
Labs team.
|
||||
</Trans>
|
||||
</span>
|
||||
);
|
||||
|
||||
return (
|
||||
<Page navId="support-bundles" subTitle={subTitle} actions={actions}>
|
||||
<Page.Contents isLoading={isLoading}>
|
||||
|
||||
@@ -9,12 +9,6 @@ import { StoreState } from 'app/types';
|
||||
|
||||
import { loadSupportBundleCollectors, createSupportBundle } from './state/actions';
|
||||
|
||||
const subTitle = (
|
||||
<span>
|
||||
Choose the components for the support bundle. The support bundle will be available for 3 days after creation.
|
||||
</span>
|
||||
);
|
||||
|
||||
const mapStateToProps = (state: StoreState) => {
|
||||
return {
|
||||
collectors: state.supportBundles.supportBundleCollectors,
|
||||
@@ -55,6 +49,14 @@ export const SupportBundlesCreateUnconnected = ({
|
||||
return { ...acc, [curr.uid]: curr.default };
|
||||
}, {});
|
||||
|
||||
const subTitle = (
|
||||
<span>
|
||||
<Trans i18nKey="support-bundles.support-bundles-create-unconnected.sub-title">
|
||||
Choose the components for the support bundle. The support bundle will be available for 3 days after creation.
|
||||
</Trans>
|
||||
</span>
|
||||
);
|
||||
|
||||
return (
|
||||
<Page navId="support-bundles" pageNav={{ text: 'Create support bundle' }} subTitle={subTitle}>
|
||||
<Page.Contents isLoading={isLoading}>
|
||||
|
||||
@@ -74,8 +74,11 @@ export const CreateTeam = (): JSX.Element => {
|
||||
</Field>
|
||||
)}
|
||||
<Field
|
||||
label={'Email'}
|
||||
description={'This is optional and is primarily used for allowing custom team avatars.'}
|
||||
label={t('teams.create-team.label-email', 'Email')}
|
||||
description={t(
|
||||
'teams.create-team.description-email',
|
||||
'This is optional and is primarily used for allowing custom team avatars'
|
||||
)}
|
||||
>
|
||||
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
|
||||
<Input {...register('email')} type="email" id="team-email" placeholder="email@test.com" />
|
||||
|
||||
@@ -47,11 +47,11 @@ describe('TeamGroupSync', () => {
|
||||
|
||||
it('should call remove group', async () => {
|
||||
const mockRemoveGroup = jest.fn();
|
||||
const mockGroup: TeamGroup = { teamId: 1, groupId: 'some/group' };
|
||||
const mockGroup: TeamGroup = { teamId: 1, groupId: 'someGroup' };
|
||||
setup({ removeTeamGroup: mockRemoveGroup, groups: [mockGroup] });
|
||||
await userEvent.click(screen.getByRole('button', { name: 'Remove group some/group' }));
|
||||
await userEvent.click(screen.getByRole('button', { name: 'Remove group someGroup' }));
|
||||
await waitFor(() => {
|
||||
expect(mockRemoveGroup).toHaveBeenCalledWith('some/group');
|
||||
expect(mockRemoveGroup).toHaveBeenCalledWith('someGroup');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -88,7 +88,9 @@ export class TeamGroupSync extends PureComponent<Props, State> {
|
||||
variant="destructive"
|
||||
onClick={() => this.onRemoveGroup(group)}
|
||||
disabled={isReadOnly}
|
||||
aria-label={`Remove group ${group.groupId}`}
|
||||
aria-label={t('teams.team-group-sync.aria-label-remove', 'Remove group {{groupName}}', {
|
||||
groupName: group.groupId,
|
||||
})}
|
||||
>
|
||||
<Icon name="times" />
|
||||
</Button>
|
||||
@@ -108,7 +110,10 @@ export class TeamGroupSync extends PureComponent<Props, State> {
|
||||
featureId={'team-sync'}
|
||||
eventVariant={'trial'}
|
||||
featureName={'team sync'}
|
||||
text={'Add a group to enable team sync for free during your trial of Grafana Pro.'}
|
||||
text={t(
|
||||
'teams.team-group-sync.team-sync-upgrade',
|
||||
'Add a group to enable team sync for free during your trial of Grafana Pro'
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
<div className="page-action-bar">
|
||||
@@ -124,8 +129,8 @@ export class TeamGroupSync extends PureComponent<Props, State> {
|
||||
)}
|
||||
<div className="page-action-bar__spacer" />
|
||||
{groups.length > 0 && (
|
||||
<Button onClick={this.onToggleAdding} disabled={isReadOnly}>
|
||||
<Icon name="plus" /> Add group
|
||||
<Button onClick={this.onToggleAdding} icon="plus" disabled={isReadOnly}>
|
||||
<Trans i18nKey="teams.team-group-sync.add-group-button">Add group</Trans>
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
@@ -136,8 +141,10 @@ export class TeamGroupSync extends PureComponent<Props, State> {
|
||||
<form onSubmit={this.onAddGroup}>
|
||||
<InlineFieldRow>
|
||||
<InlineField
|
||||
label={'Add External Group'}
|
||||
tooltip="LDAP Group Example: cn=users,ou=groups,dc=grafana,dc=org."
|
||||
label={t('teams.team-group-sync.label-add-external-group', 'Add external group')}
|
||||
tooltip={t('teams.team-group-sync.tooltip-add-external-group', 'LDAP group example: {{example}}', {
|
||||
example: 'cn=users,ou=groups,dc=grafana,dc=org',
|
||||
})}
|
||||
>
|
||||
<Input
|
||||
type="text"
|
||||
@@ -204,14 +211,15 @@ export const TeamSyncUpgradeContent = ({ action }: { action?: UpgradeContentProp
|
||||
action={action}
|
||||
listItems={[
|
||||
'Stop managing user access in two places - assign users to groups in SAML, LDAP or Oauth, and manage access at a Team level in Grafana',
|
||||
'Update users’ permissions immediately when you add or remove them from an LDAP group, with no need for them to sign out and back in',
|
||||
"Update users' permissions immediately when you add or remove them from an LDAP group, with no need for them to sign out and back in",
|
||||
]}
|
||||
image={`team-sync-${theme.isLight ? 'light' : 'dark'}.png`}
|
||||
featureName={'team sync'}
|
||||
featureUrl={'https://grafana.com/docs/grafana/latest/enterprise/team-sync'}
|
||||
description={
|
||||
'Team Sync makes it easier for you to manage users’ access in Grafana, by immediately updating each user’s Grafana teams and permissions based on their single sign-on group membership, instead of when users sign in.'
|
||||
}
|
||||
description={t(
|
||||
'teams.team-sync-upgrade-content.description',
|
||||
"Team Sync makes it easier for you to manage users' access in Grafana, by immediately updating each user's Grafana teams and permissions based on their single sign-on group membership, instead of when users sign in"
|
||||
)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -201,15 +201,19 @@ export const TeamList = ({
|
||||
{canReadTeam && (
|
||||
<LinkButton
|
||||
href={`org/teams/edit/${original.uid}`}
|
||||
aria-label={`Edit team ${original.name}`}
|
||||
aria-label={t('teams.team-list.columns.aria-label-edit-team', 'Edit team {{teamName}}', {
|
||||
teamName: original.name,
|
||||
})}
|
||||
icon="pen"
|
||||
size="sm"
|
||||
variant="secondary"
|
||||
tooltip={'Edit team'}
|
||||
tooltip={t('teams.team-list.columns.tooltip-edit-team', 'Edit team')}
|
||||
/>
|
||||
)}
|
||||
<DeleteButton
|
||||
aria-label={`Delete team ${original.name}`}
|
||||
aria-label={t('teams.team-list.columns.aria-label-delete-button', 'Delete team {{teamName}}', {
|
||||
teamName: original.name,
|
||||
})}
|
||||
size="sm"
|
||||
disabled={!canDelete}
|
||||
onConfirm={() => deleteTeam(original.uid)}
|
||||
|
||||
@@ -70,7 +70,10 @@ export const TeamSettings = ({ team, updateTeam }: Props) => {
|
||||
|
||||
<Field
|
||||
label={t('teams.team-settings.label-email', 'Email')}
|
||||
description="This is optional and is primarily used to set the team profile avatar (via gravatar service)."
|
||||
description={t(
|
||||
'teams.team-settings.description-email',
|
||||
'This is optional and is primarily used to set the team profile avatar (via gravatar service)'
|
||||
)}
|
||||
disabled={!canWriteTeamSettings}
|
||||
>
|
||||
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
|
||||
|
||||
@@ -388,7 +388,10 @@ export class LabelBreakdownScene extends SceneObjectBase<LabelBreakdownSceneStat
|
||||
</div>
|
||||
{missingOtelTargets && !dismissOtelWarning && (
|
||||
<Alert
|
||||
title={`Warning: There may be missing Open Telemetry resource attributes.`}
|
||||
title={t(
|
||||
'trails.label-breakdown-scene.title-warning-there-missing-telemetry-resource-attributes',
|
||||
'Warning: There may be missing Open Telemetry resource attributes'
|
||||
)}
|
||||
severity={'warning'}
|
||||
key={'warning'}
|
||||
onRemove={() => updateDismissOtelWarning(true)}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { css } from '@emotion/css';
|
||||
import { HTMLProps } from 'react';
|
||||
|
||||
import { Icon, Input } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
interface Props extends Omit<HTMLProps<HTMLInputElement>, 'width'> {
|
||||
onClear(): void;
|
||||
@@ -13,7 +14,14 @@ export const SearchInput = ({ value, onChange, placeholder, onClear, ...rest }:
|
||||
value={value}
|
||||
onChange={onChange}
|
||||
suffix={
|
||||
value ? <Icon onClick={onClear} title={'Clear search'} name="times" className={styles.clearIcon} /> : undefined
|
||||
value ? (
|
||||
<Icon
|
||||
onClick={onClear}
|
||||
title={t('trails.search-input.title-clear-search', 'Clear search')}
|
||||
name="times"
|
||||
className={styles.clearIcon}
|
||||
/>
|
||||
) : undefined
|
||||
}
|
||||
prefix={<Icon name="search" />}
|
||||
placeholder={placeholder}
|
||||
|
||||
@@ -93,7 +93,7 @@ export class SortByScene extends SceneObjectBase<SortBySceneState> {
|
||||
width={20}
|
||||
isSearchable={true}
|
||||
options={model.sortingOptions}
|
||||
placeholder={'Choose criteria'}
|
||||
placeholder={t('trails.sort-by-scene.placeholder-choose-criteria', 'Choose criteria')}
|
||||
onChange={model.onCriteriaChange}
|
||||
inputId="sort-by-criteria"
|
||||
/>
|
||||
|
||||
@@ -210,7 +210,7 @@ export class MetricActionBar extends SceneObjectBase<MetricActionBarState> {
|
||||
<Icon name={'star'} type={'default'} size={'lg'} />
|
||||
)
|
||||
}
|
||||
tooltip={'Bookmark'}
|
||||
tooltip={t('trails.metric-action-bar.tooltip-bookmark', 'Bookmark')}
|
||||
onClick={toggleBookmark}
|
||||
/>
|
||||
{trail.state.embedded && (
|
||||
|
||||
@@ -551,7 +551,10 @@ export class MetricSelectScene extends SceneObjectBase<MetricSelectSceneState> i
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<div className={styles.header}>
|
||||
<Field label={'Search metrics'} className={styles.searchField}>
|
||||
<Field
|
||||
label={t('trails.metric-select-scene.label-search-metrics', 'Search metrics')}
|
||||
className={styles.searchField}
|
||||
>
|
||||
<Input
|
||||
placeholder={t('trails.metric-select-scene.placeholder-search-metrics', 'Search metrics')}
|
||||
prefix={<Icon name={'search'} />}
|
||||
|
||||
@@ -10,7 +10,9 @@ export function createBookmarkSavedNotification() {
|
||||
notification.component = (
|
||||
<Stack gap={2} direction={'row'}>
|
||||
<div>
|
||||
You can view bookmarks under <i>Explore > Metrics</i>
|
||||
<Trans i18nKey="trails.create-bookmark-saved-notification.description">
|
||||
You can view bookmarks under <i>Explore > Metrics</i>
|
||||
</Trans>
|
||||
</div>
|
||||
<LinkButton fill={'solid'} variant={'secondary'} href={HOME_ROUTE}>
|
||||
<Trans i18nKey="trails.create-bookmark-saved-notification.view-bookmarks">View bookmarks</Trans>
|
||||
|
||||
@@ -18,7 +18,7 @@ const mockProps = {
|
||||
describe('NativeHistogramBanner', () => {
|
||||
test('renders correctly when histograms are loaded', () => {
|
||||
render(<NativeHistogramBanner {...mockProps} />);
|
||||
expect(screen.getByText('Native Histogram Support')).toBeInTheDocument();
|
||||
expect(screen.getByText('Native histogram support')).toBeInTheDocument();
|
||||
expect(
|
||||
screen.getByText(
|
||||
'Prometheus native histograms offer high resolution, high precision, simple usage in instrumentation and a way to combine and manipulate histograms in queries and in Grafana.'
|
||||
|
||||
@@ -29,7 +29,7 @@ export function NativeHistogramBanner(props: NativeHistogramInfoProps) {
|
||||
<>
|
||||
{
|
||||
<Alert
|
||||
title={'Native Histogram Support'}
|
||||
title={t('trails.native-histogram-banner.title-native-histogram-support', 'Native histogram support')}
|
||||
severity={'info'}
|
||||
onRemove={() => {
|
||||
// when a user explicitly closes the banner, save that it has been closed in local storage to not show again
|
||||
|
||||
+6
-1
@@ -58,7 +58,11 @@ export const UnaryOperationEditor = (props: {
|
||||
>
|
||||
<Select options={ops} value={unary?.operator ?? ops[0].value} onChange={onUnaryOperationChanged} />
|
||||
</InlineField>
|
||||
<InlineField label="(" labelWidth={2}>
|
||||
<InlineField
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
label="("
|
||||
labelWidth={2}
|
||||
>
|
||||
<Select
|
||||
placeholder={t('transformers.unary-operation-editor.placeholder-field', 'Field')}
|
||||
className="min-width-11"
|
||||
@@ -67,6 +71,7 @@ export const UnaryOperationEditor = (props: {
|
||||
onChange={onUnaryValueChanged}
|
||||
/>
|
||||
</InlineField>
|
||||
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
|
||||
<InlineLabel width={2}>)</InlineLabel>
|
||||
</InlineFieldRow>
|
||||
</>
|
||||
|
||||
@@ -132,7 +132,7 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
return (
|
||||
<div key={`${c.targetField}-${idx}`}>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Field'}>
|
||||
<InlineField label={t('transformers.convert-field-type-transformer-editor.label-field', 'Field')}>
|
||||
<FieldNamePicker
|
||||
context={{ data: input }}
|
||||
value={c.targetField ?? ''}
|
||||
@@ -140,11 +140,11 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
item={fieldNamePickerSettings}
|
||||
/>
|
||||
</InlineField>
|
||||
<InlineField label={'as'}>
|
||||
<InlineField label={t('transformers.convert-field-type-transformer-editor.label-as', 'as')}>
|
||||
<Select
|
||||
options={allTypes}
|
||||
value={c.destinationType}
|
||||
placeholder={'Type'}
|
||||
placeholder={t('transformers.convert-field-type-transformer-editor.placeholder-type', 'Type')}
|
||||
onChange={onSelectDestinationType(idx)}
|
||||
width={18}
|
||||
/>
|
||||
@@ -152,10 +152,14 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
{c.destinationType === FieldType.time && (
|
||||
<InlineField
|
||||
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."
|
||||
tooltip={t(
|
||||
'transformers.convert-field-type-transformer-editor.tooltip-input-format',
|
||||
'Specify the format of the input field so Grafana can parse the date string correctly.'
|
||||
)}
|
||||
>
|
||||
<Input
|
||||
value={c.dateFormat}
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
placeholder={'e.g. YYYY-MM-DD'}
|
||||
onChange={onInputFormat(idx)}
|
||||
width={24}
|
||||
@@ -172,7 +176,13 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
'Use an explicit separator when joining array values'
|
||||
)}
|
||||
>
|
||||
<Input value={c.joinWith} placeholder={'JSON'} onChange={onJoinWithChange(idx)} width={9} />
|
||||
<Input
|
||||
value={c.joinWith}
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
placeholder={'JSON'}
|
||||
onChange={onJoinWithChange(idx)}
|
||||
width={9}
|
||||
/>
|
||||
</InlineField>
|
||||
)}
|
||||
{targetField?.type === FieldType.time && (
|
||||
@@ -186,6 +196,7 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
>
|
||||
<Input
|
||||
value={c.dateFormat}
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
placeholder={'e.g. YYYY-MM-DD'}
|
||||
onChange={onInputFormat(idx)}
|
||||
width={24}
|
||||
@@ -212,7 +223,10 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
icon="trash-alt"
|
||||
variant="secondary"
|
||||
onClick={() => onRemoveConvertFieldType(idx)}
|
||||
aria-label={'Remove convert field type transformer'}
|
||||
aria-label={t(
|
||||
'transformers.convert-field-type-transformer-editor.aria-label-remove-convert-field-type-transformer',
|
||||
'Remove convert field type transformer'
|
||||
)}
|
||||
/>
|
||||
</InlineFieldRow>
|
||||
{c.destinationType === FieldType.enum && (
|
||||
@@ -226,7 +240,10 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
icon="plus"
|
||||
onClick={onAddConvertFieldType}
|
||||
variant="secondary"
|
||||
aria-label={'Add a convert field type transformer'}
|
||||
aria-label={t(
|
||||
'transformers.convert-field-type-transformer-editor.aria-label-add-a-convert-field-type-transformer',
|
||||
'Add a convert field type transformer'
|
||||
)}
|
||||
>
|
||||
{'Convert field type'}
|
||||
</Button>
|
||||
|
||||
@@ -82,7 +82,7 @@ function FormatStringTransfomerEditor({
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Field'} labelWidth={10}>
|
||||
<InlineField label={t('transformers.format-string-transfomer-editor.label-field', 'Field')} labelWidth={10}>
|
||||
<FieldNamePicker
|
||||
context={{ data: input }}
|
||||
value={options.stringField ?? ''}
|
||||
|
||||
@@ -66,7 +66,13 @@ export const GroupByTransformerEditor = ({
|
||||
return (
|
||||
<Stack direction="column">
|
||||
{showCalcAlert && (
|
||||
<Alert title="Calculations will not have an effect if no fields are being grouped on." severity="warning" />
|
||||
<Alert
|
||||
title={t(
|
||||
'transformers.group-by-transformer-editor.title-calc-alert',
|
||||
'Calculations will not have an effect if no fields are being grouped on'
|
||||
)}
|
||||
severity="warning"
|
||||
/>
|
||||
)}
|
||||
{fieldNames.map((key) => (
|
||||
<GroupByFieldConfiguration
|
||||
|
||||
@@ -89,7 +89,13 @@ export const GroupToNestedTableTransformerEditor = ({
|
||||
return (
|
||||
<Stack direction="column">
|
||||
{showCalcAlert && (
|
||||
<Alert title="Calculations will not have an effect if no fields are being grouped on." severity="warning" />
|
||||
<Alert
|
||||
title={t(
|
||||
'transformers.group-to-nested-table-transformer-editor.title-calc-alert',
|
||||
'Calculations will not have an effect if no fields are being grouped on.'
|
||||
)}
|
||||
severity="warning"
|
||||
/>
|
||||
)}
|
||||
<div>
|
||||
{fieldNames.map((key) => (
|
||||
@@ -106,7 +112,10 @@ export const GroupToNestedTableTransformerEditor = ({
|
||||
'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"
|
||||
description={t(
|
||||
'transformers.group-to-nested-table-transformer-editor.description-show-field-names',
|
||||
'If enabled nested tables will show field names as a table header'
|
||||
)}
|
||||
>
|
||||
<Switch value={showHeaders} onChange={onShowFieldNamesChange} />
|
||||
</Field>
|
||||
|
||||
@@ -102,7 +102,7 @@ export const HistogramTransformerEditor = ({
|
||||
<SuggestionsInput
|
||||
suggestions={suggestions}
|
||||
value={options.bucketSize}
|
||||
placeholder="auto"
|
||||
placeholder={t('transformers.histogram-transformer-editor.placeholder-auto', 'Auto')}
|
||||
onChange={onVariableBucketSizeChanged}
|
||||
/>
|
||||
</InlineField>
|
||||
@@ -118,7 +118,7 @@ export const HistogramTransformerEditor = ({
|
||||
<SuggestionsInput
|
||||
suggestions={suggestions}
|
||||
value={options.bucketOffset}
|
||||
placeholder="none"
|
||||
placeholder={t('transformers.histogram-transformer-editor.placeholder-none', 'None')}
|
||||
onChange={onVariableBucketOffsetChanged}
|
||||
/>
|
||||
</InlineField>
|
||||
|
||||
@@ -70,7 +70,10 @@ export const LabelsAsFieldsTransformerEditor = ({
|
||||
return (
|
||||
<div>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Mode'} labelWidth={labelWidth}>
|
||||
<InlineField
|
||||
label={t('transformers.labels-as-fields-transformer-editor.label-mode', 'Mode')}
|
||||
labelWidth={labelWidth}
|
||||
>
|
||||
<RadioButtonGroup
|
||||
options={modes}
|
||||
value={options.mode ?? LabelsToFieldsMode.Columns}
|
||||
@@ -79,7 +82,10 @@ export const LabelsAsFieldsTransformerEditor = ({
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Labels'} labelWidth={labelWidth}>
|
||||
<InlineField
|
||||
label={t('transformers.labels-as-fields-transformer-editor.label-labels', 'Labels')}
|
||||
labelWidth={labelWidth}
|
||||
>
|
||||
<Stack gap={1} wrap={'wrap'}>
|
||||
{labelNames.map((o, i) => {
|
||||
const label = o.label!;
|
||||
@@ -98,7 +104,7 @@ export const LabelsAsFieldsTransformerEditor = ({
|
||||
{options.mode !== LabelsToFieldsMode.Rows && (
|
||||
<InlineFieldRow>
|
||||
<InlineField
|
||||
label={'Value field name'}
|
||||
label={t('transformers.labels-as-fields-transformer-editor.label-value-field-name', 'Value field name')}
|
||||
labelWidth={labelWidth}
|
||||
tooltip={t(
|
||||
'transformers.labels-as-fields-transformer-editor.tooltip-replace-value-field-label',
|
||||
|
||||
@@ -22,7 +22,7 @@ import {
|
||||
Text,
|
||||
Box,
|
||||
} from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
import { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
import { useAllFieldNamesFromDataFrames } from '../utils';
|
||||
@@ -101,8 +101,10 @@ const OrganizeFieldsTransformerEditor = ({ options, input, onChange }: OrganizeF
|
||||
if (input.length > 1) {
|
||||
return (
|
||||
<FieldValidationMessage>
|
||||
Organize fields only works with a single frame. Consider applying a join transformation or filtering the input
|
||||
first.
|
||||
<Trans i18nKey="transformers.organize-fields-transformer-editor.first-frame-warning">
|
||||
Organize fields only works with a single frame. Consider applying a join transformation or filtering the input
|
||||
first.
|
||||
</Trans>
|
||||
</FieldValidationMessage>
|
||||
);
|
||||
}
|
||||
@@ -189,7 +191,9 @@ const DraggableFieldName = ({
|
||||
</InlineLabel>
|
||||
<Input
|
||||
defaultValue={renamedFieldName || ''}
|
||||
placeholder={`Rename ${fieldName}`}
|
||||
placeholder={t('transformers.draggable-field-name.rename-placeholder', 'Rename {{fieldName}}', {
|
||||
fieldName,
|
||||
})}
|
||||
onBlur={(event) => onRenameField(fieldName, event.currentTarget.value)}
|
||||
/>
|
||||
</Box>
|
||||
|
||||
@@ -13,7 +13,10 @@ export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIPr
|
||||
return (
|
||||
<>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'First field name'} labelWidth={24}>
|
||||
<InlineField
|
||||
label={t('transformers.transpose-transfomer-editor.label-first-field-name', 'First field name')}
|
||||
labelWidth={24}
|
||||
>
|
||||
<Input
|
||||
placeholder={t('transformers.transpose-transfomer-editor.placeholder-field', 'Field')}
|
||||
value={options.firstFieldName}
|
||||
@@ -23,7 +26,11 @@ export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIPr
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Remaining fields name'} tooltip={'Name for value fields'} labelWidth={24}>
|
||||
<InlineField
|
||||
label={t('transformers.transpose-transfomer-editor.label-remaining-fields-name', 'Remaining fields name')}
|
||||
tooltip={t('transformers.transpose-transfomer-editor.tooltip-name-for-value-fields', 'Name for value fields')}
|
||||
labelWidth={24}
|
||||
>
|
||||
<Input
|
||||
placeholder={t('transformers.transpose-transfomer-editor.placeholder-value', 'Value')}
|
||||
value={options.restFieldsName}
|
||||
|
||||
@@ -93,7 +93,7 @@ export const extractFieldsTransformerEditor = ({
|
||||
return (
|
||||
<div>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Source'} labelWidth={16}>
|
||||
<InlineField label={t('transformers.extract-fields-transformer-editor.label-source', 'Source')} labelWidth={16}>
|
||||
<FieldNamePicker
|
||||
context={{ data: input }}
|
||||
value={options.source ?? ''}
|
||||
@@ -103,20 +103,31 @@ export const extractFieldsTransformerEditor = ({
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Format'} labelWidth={16}>
|
||||
<InlineField label={t('transformers.extract-fields-transformer-editor.label-format', 'Format')} labelWidth={16}>
|
||||
<Select
|
||||
value={format.current[0] as any}
|
||||
options={format.options as any}
|
||||
onChange={onFormatChange}
|
||||
width={24}
|
||||
placeholder={'Auto'}
|
||||
placeholder={t('transformers.extract-fields-transformer-editor.placeholder-auto', 'Auto')}
|
||||
/>
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
{options.format === FieldExtractorID.RegExp && (
|
||||
<InlineFieldRow>
|
||||
<InlineField label="RegExp" labelWidth={16} interactive={true} tooltip="Example: /(?<NewField>.*)/">
|
||||
<Input placeholder="/(?<NewField>.*)/" value={options.regExp} onChange={onRegexpChange} />
|
||||
<InlineField
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
label="RegExp"
|
||||
labelWidth={16}
|
||||
interactive={true}
|
||||
tooltip="Example: /(?<NewField>.*)/"
|
||||
>
|
||||
<Input
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
placeholder="/(?<NewField>.*)/"
|
||||
value={options.regExp}
|
||||
onChange={onRegexpChange}
|
||||
/>
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
)}
|
||||
@@ -143,13 +154,19 @@ export const extractFieldsTransformerEditor = ({
|
||||
</InlineFieldRow>
|
||||
)}
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Replace all fields'} labelWidth={16}>
|
||||
<InlineField
|
||||
label={t('transformers.extract-fields-transformer-editor.label-replace-all-fields', 'Replace all fields')}
|
||||
labelWidth={16}
|
||||
>
|
||||
<InlineSwitch value={options.replace ?? false} onChange={onToggleReplace} />
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
{options.replace && (
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Keep time'} labelWidth={16}>
|
||||
<InlineField
|
||||
label={t('transformers.extract-fields-transformer-editor.label-keep-time', 'Keep time')}
|
||||
labelWidth={16}
|
||||
>
|
||||
<InlineSwitch value={options.keepTime ?? false} onChange={onToggleKeepTime} />
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
|
||||
+5
-1
@@ -1,4 +1,5 @@
|
||||
import { ColorPicker, Input } from '@grafana/ui';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { HandlerArguments } from './fieldToConfigMapping';
|
||||
|
||||
@@ -38,7 +39,10 @@ export function FieldConfigMappingHandlerArgumentsEditor({ handlerArguments, han
|
||||
<Input
|
||||
type="text"
|
||||
value={'Threshold color'}
|
||||
aria-label={'Threshold color'}
|
||||
aria-label={t(
|
||||
'transformers.field-config-mapping-handler-arguments-editor.aria-label-threshold-color',
|
||||
'Threshold color'
|
||||
)}
|
||||
disabled
|
||||
width={20}
|
||||
prefix={
|
||||
|
||||
@@ -110,7 +110,7 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
|
||||
<InlineField
|
||||
error="required"
|
||||
invalid={!Boolean(options.value?.length)}
|
||||
label={'Value'}
|
||||
label={t('transformers.join-by-labels-transformer-editor.label-value', 'Value')}
|
||||
labelWidth={labelWidth}
|
||||
tooltip={t(
|
||||
'transformers.join-by-labels-transformer-editor.tooltip-select-label-indicating-values',
|
||||
@@ -129,7 +129,7 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
|
||||
options.join!.map((v, idx) => (
|
||||
<InlineFieldRow key={v + idx}>
|
||||
<InlineField
|
||||
label={'Join'}
|
||||
label={t('transformers.join-by-labels-transformer-editor.label-join', 'Join')}
|
||||
labelWidth={labelWidth}
|
||||
error="Unable to join by the value label"
|
||||
invalid={v === options.value}
|
||||
@@ -145,6 +145,7 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
|
||||
{Boolean(info.addOptions.length && idx === options.join!.length - 1) && (
|
||||
<ValuePicker
|
||||
icon="plus"
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
label={''}
|
||||
options={info.addOptions}
|
||||
onChange={addJoin}
|
||||
@@ -159,7 +160,10 @@ export function JoinByLabelsTransformerEditor({ input, options, onChange }: Prop
|
||||
<>
|
||||
{Boolean(info.addOptions.length) && (
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Join'} labelWidth={labelWidth}>
|
||||
<InlineField
|
||||
label={t('transformers.join-by-labels-transformer-editor.label-join', 'Join')}
|
||||
labelWidth={labelWidth}
|
||||
>
|
||||
<Select
|
||||
options={info.addOptions}
|
||||
placeholder={info.addText}
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
} from '@grafana/data';
|
||||
import { InlineField, InlineFieldRow } from '@grafana/ui';
|
||||
import { FieldNamePicker } from '@grafana/ui/internal';
|
||||
import { t } from 'app/core/internationalization';
|
||||
import { GazetteerPathEditor, GazetteerPathEditorConfigSettings } from 'app/features/geo/editor/GazetteerPathEditor';
|
||||
|
||||
import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
@@ -57,7 +58,7 @@ export const FieldLookupTransformerEditor = ({ input, options, onChange }: Trans
|
||||
return (
|
||||
<div>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Field'} labelWidth={12}>
|
||||
<InlineField label={t('transformers.field-lookup-transformer-editor.label-field', 'Field')} labelWidth={12}>
|
||||
<FieldNamePicker
|
||||
context={{ data: input }}
|
||||
value={options?.lookupField ?? ''}
|
||||
@@ -67,7 +68,7 @@ export const FieldLookupTransformerEditor = ({ input, options, onChange }: Trans
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField label={'Lookup'} labelWidth={12}>
|
||||
<InlineField label={t('transformers.field-lookup-transformer-editor.label-lookup', 'Lookup')} labelWidth={12}>
|
||||
<GazetteerPathEditor
|
||||
value={options?.gazetteer ?? ''}
|
||||
context={{ data: input }}
|
||||
|
||||
@@ -132,10 +132,11 @@ export function PartitionByValuesEditor({
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField
|
||||
tooltip={
|
||||
tooltip={t(
|
||||
'transformers.partion-by-values-editor.tooltip-naming',
|
||||
'Sets how the names of the selected fields are displayed. As frame name is usually better for tabular data'
|
||||
}
|
||||
label={'Naming'}
|
||||
)}
|
||||
label={t('transformers.partition-by-values-editor.label-naming', 'Naming')}
|
||||
labelWidth={10}
|
||||
>
|
||||
<RadioButtonGroup
|
||||
@@ -152,7 +153,14 @@ export function PartitionByValuesEditor({
|
||||
</InlineField>
|
||||
</InlineFieldRow>
|
||||
<InlineFieldRow>
|
||||
<InlineField tooltip={'Keeps the partition fields in the frames.'} label={'Keep fields'} labelWidth={16}>
|
||||
<InlineField
|
||||
tooltip={t(
|
||||
'transformers.partition-by-values-editor.tooltip-keeps-partition-fields-frames',
|
||||
'Keeps the partition fields in the frames'
|
||||
)}
|
||||
label={t('transformers.partition-by-values-editor.label-keep-fields', 'Keep fields')}
|
||||
labelWidth={16}
|
||||
>
|
||||
<RadioButtonGroup
|
||||
options={KeepFieldsOptions}
|
||||
value={options.keepFields}
|
||||
|
||||
@@ -49,7 +49,11 @@ const multiInfo = {
|
||||
<li>
|
||||
<Trans i18nKey="transformers.multi-info.multiple-frames">Multiple frames</Trans>
|
||||
</li>
|
||||
<li>Each frame has two fields: time, value</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.multi-info.frame-fields-value" values={{ field1: 'time', field2: 'value' }}>
|
||||
Each frame has two fields: {'{{field1}}'}, {'{{field2}}'}
|
||||
</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.multi-info.time-in-ascending-order">Time in ascending order</Trans>
|
||||
</li>
|
||||
@@ -82,7 +86,11 @@ const longInfo = {
|
||||
Time in ascending order, but may have duplicates
|
||||
</Trans>
|
||||
</li>
|
||||
<li>String values are represented as separate fields rather than as labels</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.long-info.string-values-separate">
|
||||
String values are represented as separate fields rather than as labels
|
||||
</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<Trans i18nKey="transformers.long-info.multiple-value-fields-may-exist">Multiple value fields may exist</Trans>
|
||||
</li>
|
||||
|
||||
@@ -116,7 +116,10 @@ export const RegressionTransformerEditor = ({
|
||||
<InlineField
|
||||
labelWidth={LABEL_WIDTH}
|
||||
label={t('transformers.regression-transformer-editor.label-predicted-points', 'Predicted points')}
|
||||
tooltip={'Number of X,Y points to predict'}
|
||||
tooltip={t(
|
||||
'transformers.regression-transformer-editor.tooltip-number-of-xy-points-to-predict',
|
||||
'Number of X,Y points to predict'
|
||||
)}
|
||||
>
|
||||
<NumberInput
|
||||
value={options.predictionCount ?? DEFAULTS.predictionCount}
|
||||
|
||||
@@ -91,7 +91,10 @@ export function TimeSeriesTableTransformEditor({
|
||||
</InlineField>
|
||||
<InlineField
|
||||
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."
|
||||
tooltip={t(
|
||||
'transformers.time-series-table-transform-editor.tooltip-time-field',
|
||||
'The time field that will be used for the time series. If not selected the first found will be used.'
|
||||
)}
|
||||
>
|
||||
<Select
|
||||
onChange={onSelectTimefield.bind(null, refId)}
|
||||
|
||||
@@ -42,9 +42,11 @@ export const TokenRevokedModal = (props: Props) => {
|
||||
for your account.
|
||||
</p>
|
||||
<p>
|
||||
<strong>To resume your session, sign in again.</strong>
|
||||
Contact your administrator or visit the license page to review your quota if you are repeatedly signed out
|
||||
automatically.
|
||||
<Trans i18nKey="users.token-revoked-modal.resume-message">
|
||||
<strong>To resume your session, sign in again.</strong>
|
||||
Contact your administrator or visit the license page to review your quota if you are repeatedly signed
|
||||
out automatically.
|
||||
</Trans>
|
||||
</p>
|
||||
</div>
|
||||
<Button size="md" variant="primary" onClick={redirectToLogin}>
|
||||
|
||||
@@ -27,7 +27,14 @@ export const VariableUsagesButton = ({ id, usages, isAdhoc }: Props) => {
|
||||
});
|
||||
|
||||
return (
|
||||
<NetworkGraphModal show={false} title={`Showing usages for: $${id}`} nodes={nodes} edges={network.edges}>
|
||||
<NetworkGraphModal
|
||||
show={false}
|
||||
title={t('variabels.variable-usages-button.usage-title', 'Showing usages for: {{variableId}}', {
|
||||
variableId: `$${id}`,
|
||||
})}
|
||||
nodes={nodes}
|
||||
edges={network.edges}
|
||||
>
|
||||
{({ showModal }) => {
|
||||
return (
|
||||
<IconButton
|
||||
|
||||
@@ -26,7 +26,14 @@ export const VariablesUnknownButton = ({ id, usages }: Props) => {
|
||||
});
|
||||
|
||||
return (
|
||||
<NetworkGraphModal show={false} title={`Showing usages for: $${id}`} nodes={nodes} edges={network.edges}>
|
||||
<NetworkGraphModal
|
||||
show={false}
|
||||
title={t('variables.variables-unknown-button.usage-title', 'Showing usages for: {{variableId}}', {
|
||||
variableId: `$${id}`,
|
||||
})}
|
||||
nodes={nodes}
|
||||
edges={network.edges}
|
||||
>
|
||||
{({ showModal }) => {
|
||||
return (
|
||||
<IconButton
|
||||
|
||||
@@ -5,7 +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 { t, Trans } from 'app/core/internationalization';
|
||||
|
||||
import { DashboardModel } from '../../dashboard/state/DashboardModel';
|
||||
import { VariableModel } from '../types';
|
||||
@@ -80,8 +80,13 @@ function CollapseLabel(): ReactElement {
|
||||
const style = useStyles2(getStyles);
|
||||
return (
|
||||
<h5>
|
||||
Renamed or missing variables
|
||||
<Tooltip content="Click to expand a list with all variable references that have been renamed or are missing from the dashboard.">
|
||||
<Trans i18nKey="variables.variables-unknown-table.collapse-label">Renamed or missing variables</Trans>
|
||||
<Tooltip
|
||||
content={t(
|
||||
'variables.variables-unknown-table.collapse-tooltip',
|
||||
'Click to expand a list with all variable references that have been renamed or are missing from the dashboard.'
|
||||
)}
|
||||
>
|
||||
<Icon name="info-circle" className={style.infoIcon} />
|
||||
</Tooltip>
|
||||
</h5>
|
||||
|
||||
@@ -3,6 +3,7 @@ import { PropsWithChildren, ReactElement, useMemo } from 'react';
|
||||
import { TypedVariableModel, VariableHide } from '@grafana/data';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { Stack, Tooltip } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
import { variableAdapters } from '../adapters';
|
||||
import { VARIABLE_PREFIX } from '../constants';
|
||||
@@ -16,7 +17,11 @@ export const PickerRenderer = (props: Props) => {
|
||||
const PickerToRender = useMemo(() => variableAdapters.get(props.variable.type).picker, [props.variable]);
|
||||
|
||||
if (!props.variable) {
|
||||
return <div>Couldn't load variable</div>;
|
||||
return (
|
||||
<div>
|
||||
<Trans i18nKey="variables.picker-renderer.couldnt-load-variable">Couldn't load variable</Trans>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@@ -129,7 +129,9 @@ class VariableOptions extends PureComponent<Props> {
|
||||
[styles.variableOptionIconManySelected]: selectedValues.length > 1,
|
||||
})}
|
||||
></span>
|
||||
<Trans i18nKey="variable.picker.option-selected-values">Selected</Trans> ({selectedValues.length})
|
||||
<Trans i18nKey="variable.picker.option-selected-values" values={{ numSelected: selectedValues.length }}>
|
||||
Selected ({'{{numSelected}}'})
|
||||
</Trans>
|
||||
</button>
|
||||
</Tooltip>
|
||||
);
|
||||
|
||||
@@ -87,6 +87,7 @@ export const generateLabel = (feature: FeatureLike, idx: number): string | React
|
||||
|
||||
if (first) {
|
||||
return (
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
<span>
|
||||
{first}: {renderValue(props[first])}
|
||||
</span>
|
||||
@@ -97,6 +98,7 @@ export const generateLabel = (feature: FeatureLike, idx: number): string | React
|
||||
const v = props[k];
|
||||
if (isString(v)) {
|
||||
return (
|
||||
// eslint-disable-next-line @grafana/no-untranslated-strings
|
||||
<span>
|
||||
{k}: {renderValue(v)}
|
||||
</span>
|
||||
|
||||
@@ -16,6 +16,7 @@ import { GlobalStyles, IconButton, ModalRoot, Stack, useSplitter, useStyles2 } f
|
||||
import { AppChrome } from '../core/components/AppChrome/AppChrome';
|
||||
import { AppNotificationList } from '../core/components/AppNotifications/AppNotificationList';
|
||||
import { ModalsContextProvider } from '../core/context/ModalsContextProvider';
|
||||
import { t } from '../core/internationalization';
|
||||
import { QueriesDrawerContextProvider } from '../features/explore/QueriesDrawer/QueriesDrawerContext';
|
||||
|
||||
function ExtraProviders(props: { children: ReactNode; providers: Array<ComponentType<{ children: ReactNode }>> }) {
|
||||
@@ -119,7 +120,7 @@ export function ExperimentalSplitPaneRouterWrapper(props: RouterWrapperProps) {
|
||||
size={'lg'}
|
||||
style={{ margin: '8px' }}
|
||||
name={'times'}
|
||||
aria-label={'close'}
|
||||
aria-label={t('routes-wrapper.close-aria-label', 'Close')}
|
||||
onClick={() => closeApp()}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -6161,7 +6161,8 @@
|
||||
"aria-label-plugin-type-filter": "Plugin type filter",
|
||||
"label-search": "Search",
|
||||
"label-state": "State",
|
||||
"label-type": "Type"
|
||||
"label-type": "Type",
|
||||
"subtitle": "Extend the Grafana experience with panel plugins and apps. To find more data sources go to <2>Connections</2>."
|
||||
},
|
||||
"catalog": {
|
||||
"no-updates-available": "No updates available",
|
||||
@@ -6345,6 +6346,7 @@
|
||||
"text-loading-organizations": "Loading organizations..."
|
||||
},
|
||||
"user-sessions": {
|
||||
"browser-details": "{{browser}} on {{os}} {{osVersion}}",
|
||||
"now": "Now",
|
||||
"sessions": "Sessions"
|
||||
},
|
||||
@@ -6921,6 +6923,7 @@
|
||||
},
|
||||
"query-group": {
|
||||
"add-query": "Add query",
|
||||
"expression": "Expression",
|
||||
"title-data-source-help": "Data source help"
|
||||
},
|
||||
"query-group-options-editor": {
|
||||
@@ -7067,6 +7070,9 @@
|
||||
"reload-button": "Reload",
|
||||
"title": "Unable to find application file"
|
||||
},
|
||||
"routes-wrapper": {
|
||||
"close-aria-label": "Close"
|
||||
},
|
||||
"sandbox": {
|
||||
"test-stuff-page": {
|
||||
"application-notifications-toasts-testing": "Application notifications (toasts) testing",
|
||||
@@ -7198,6 +7204,7 @@
|
||||
"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",
|
||||
"description-token": "Copy the token now as you will not be able to see it again. Losing a token requires creating a new one.",
|
||||
"generate-token": "Generate token",
|
||||
"label-display-name": "Display name",
|
||||
"label-expiration": "Expiration",
|
||||
@@ -7206,8 +7213,10 @@
|
||||
},
|
||||
"get-actions-cell": {
|
||||
"add-token": "Add token",
|
||||
"aria-label-delete-button": "Delete service account {{serviceAccountName}}",
|
||||
"disable": "Disable",
|
||||
"enable": "Enable"
|
||||
"enable": "Enable",
|
||||
"tooltip-managed-service-account-cannot-modified": "This is a managed service account and cannot be modified"
|
||||
},
|
||||
"get-role-cell": {
|
||||
"aria-label-role": "Role"
|
||||
@@ -7217,7 +7226,9 @@
|
||||
"aria-label-role": "Role",
|
||||
"disable": "Disable",
|
||||
"enable": "Enable",
|
||||
"title-tokens": "Tokens"
|
||||
"title-tokens": "Tokens",
|
||||
"tooltip-delete-button": "Delete service account {{serviceAccountName}}",
|
||||
"tooltip-managed-service-account-cannot-modified": "This is a managed service account and cannot be modified"
|
||||
},
|
||||
"service-account-page-unconnected": {
|
||||
"add-service-account-token": "Add service account token",
|
||||
@@ -7226,7 +7237,8 @@
|
||||
"enable-service-account": "Enable service account",
|
||||
"title-delete-service-account": "Delete service account",
|
||||
"title-disable-service-account": "Disable service account",
|
||||
"tokens": "Tokens"
|
||||
"tokens": "Tokens",
|
||||
"tooltip-managed-service-account-cannot-modified": "This is a managed service account and cannot be modified"
|
||||
},
|
||||
"service-account-permissions": {
|
||||
"title-permissions": "Permissions"
|
||||
@@ -7252,6 +7264,7 @@
|
||||
"service-accounts-list-page-unconnected": {
|
||||
"add-service-account": "Add service account",
|
||||
"placeholder-search-service-account-by-name": "Search service account by name",
|
||||
"sub-title": "Service accounts and their tokens can be used to authenticate against the Grafana API. Find out more in our <2>documentation.</2>",
|
||||
"title-delete-service-account": "Delete service account",
|
||||
"title-disable-service-account": "Disable service account"
|
||||
},
|
||||
@@ -7534,16 +7547,21 @@
|
||||
},
|
||||
"support-bundles-create-unconnected": {
|
||||
"cancel": "Cancel",
|
||||
"create": "Create"
|
||||
"create": "Create",
|
||||
"sub-title": "Choose the components for the support bundle. The support bundle will be available for 3 days after creation."
|
||||
},
|
||||
"support-bundles-unconnected": {
|
||||
"created-on": "Created on",
|
||||
"download": "Download",
|
||||
"expires": "Expires",
|
||||
"requested-by": "Requested by",
|
||||
"sub-title": "Support bundles allow you to easily collect and share Grafana logs, configuration, and data with the Grafana Labs team.",
|
||||
"tooltip-remove-bundle": "Remove bundle"
|
||||
}
|
||||
},
|
||||
"swagger": {
|
||||
"login": "Login"
|
||||
},
|
||||
"table": {
|
||||
"container": {
|
||||
"content": "Showing too many columns in a single table may impact performance and make data harder to read. Consider refining your queries.",
|
||||
@@ -7566,6 +7584,8 @@
|
||||
"teams": {
|
||||
"create-team": {
|
||||
"create": "Create",
|
||||
"description-email": "This is optional and is primarily used for allowing custom team avatars",
|
||||
"label-email": "Email",
|
||||
"label-name": "Name",
|
||||
"label-role": "Role"
|
||||
},
|
||||
@@ -7577,24 +7597,36 @@
|
||||
},
|
||||
"team-group-sync": {
|
||||
"add-group": "Add group",
|
||||
"add-group-button": "Add group",
|
||||
"aria-label-remove": "Remove group {{groupName}}",
|
||||
"external-group-id": "External Group ID",
|
||||
"external-group-sync": "External group sync",
|
||||
"title-there-external-groups": "There are no external groups to sync with"
|
||||
"label-add-external-group": "Add external group",
|
||||
"team-sync-upgrade": "Add a group to enable team sync for free during your trial of Grafana Pro",
|
||||
"title-there-external-groups": "There are no external groups to sync with",
|
||||
"tooltip-add-external-group": "LDAP group example: {{example}}"
|
||||
},
|
||||
"team-list": {
|
||||
"columns": {
|
||||
"title-edit-team": "Edit team"
|
||||
"aria-label-delete-button": "Delete team {{teamName}}",
|
||||
"aria-label-edit-team": "Edit team {{teamName}}",
|
||||
"title-edit-team": "Edit team",
|
||||
"tooltip-edit-team": "Edit team"
|
||||
},
|
||||
"new-team": "New Team",
|
||||
"placeholder-search-teams": "Search teams"
|
||||
},
|
||||
"team-settings": {
|
||||
"description-email": "This is optional and is primarily used to set the team profile avatar (via gravatar service)",
|
||||
"label-email": "Email",
|
||||
"label-name": "Name",
|
||||
"label-numerical-identifier": "Numerical identifier",
|
||||
"label-role": "Role",
|
||||
"label-team-details": "Team details",
|
||||
"save": "Save"
|
||||
},
|
||||
"team-sync-upgrade-content": {
|
||||
"description": "Team Sync makes it easier for you to manage users' access in Grafana, by immediately updating each user's Grafana teams and permissions based on their single sign-on group membership, instead of when users sign in"
|
||||
}
|
||||
},
|
||||
"theme-preview": {
|
||||
@@ -7693,6 +7725,7 @@
|
||||
"date-created": "Date created: "
|
||||
},
|
||||
"create-bookmark-saved-notification": {
|
||||
"description": "You can view bookmarks under <1>Explore > Metrics</1>",
|
||||
"view-bookmarks": "View bookmarks"
|
||||
},
|
||||
"data-trail-card": {
|
||||
@@ -7714,11 +7747,13 @@
|
||||
},
|
||||
"label-breakdown-scene": {
|
||||
"label-search": "Search",
|
||||
"label-view": "View"
|
||||
"label-view": "View",
|
||||
"title-warning-there-missing-telemetry-resource-attributes": "Warning: There may be missing Open Telemetry resource attributes"
|
||||
},
|
||||
"metric-action-bar": {
|
||||
"open": "Open",
|
||||
"select-new-metric": "Select new metric",
|
||||
"tooltip-bookmark": "Bookmark",
|
||||
"tooltip-open-in-explore": "Open in explore",
|
||||
"tooltip-remove-existing-metric-choose": "Remove existing metric and choose a new metric"
|
||||
},
|
||||
@@ -7730,6 +7765,7 @@
|
||||
},
|
||||
"metric-select-scene": {
|
||||
"label-otel-experience": "OTel experience",
|
||||
"label-search-metrics": "Search metrics",
|
||||
"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"
|
||||
@@ -7750,7 +7786,8 @@
|
||||
"now": "Now:",
|
||||
"previously": "Previously:",
|
||||
"see-examples": "> See examples",
|
||||
"sentence": "Prometheus native histograms offer high resolution, high precision, simple usage in instrumentation and a way to combine and manipulate histograms in queries and in Grafana."
|
||||
"sentence": "Prometheus native histograms offer high resolution, high precision, simple usage in instrumentation and a way to combine and manipulate histograms in queries and in Grafana.",
|
||||
"title-native-histogram-support": "Native histogram support"
|
||||
},
|
||||
"recent-metrics": {
|
||||
"or-view-a-recent-exploration": "Or view a recent exploration"
|
||||
@@ -7758,11 +7795,15 @@
|
||||
"related-logs-scene": {
|
||||
"tooltip-navigate-to-the-explore-logs-app": "Navigate to the Explore Logs app"
|
||||
},
|
||||
"search-input": {
|
||||
"title-clear-search": "Clear search"
|
||||
},
|
||||
"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": {
|
||||
"placeholder-choose-criteria": "Choose criteria",
|
||||
"tooltip-sorts-values-using-standard-smart-series": "Sorts values using standard or smart time series calculations."
|
||||
}
|
||||
},
|
||||
@@ -7800,11 +7841,17 @@
|
||||
"label-config-query": "Config query"
|
||||
},
|
||||
"convert-field-type-transformer-editor": {
|
||||
"aria-label-add-a-convert-field-type-transformer": "Add a convert field type transformer",
|
||||
"aria-label-remove-convert-field-type-transformer": "Remove convert field type transformer",
|
||||
"label-as": "as",
|
||||
"label-date-format": "Date format",
|
||||
"label-field": "Field",
|
||||
"label-input-format": "Input format",
|
||||
"label-join-with": "Join with",
|
||||
"label-set-timezone": "Set timezone",
|
||||
"placeholder-type": "Type",
|
||||
"tooltip-explicit-separator-joining-array-values": "Use an explicit separator when joining array values",
|
||||
"tooltip-input-format": "Specify the format of the input field so Grafana can parse the date string correctly.",
|
||||
"tooltip-specify-the-output-format": "Specify the output format.",
|
||||
"tooltip-timezone-manually": "Set the timezone of the date manually"
|
||||
},
|
||||
@@ -7814,6 +7861,7 @@
|
||||
"placeholder-field": "Field"
|
||||
},
|
||||
"draggable-field-name": {
|
||||
"rename-placeholder": "Rename {{fieldName}}",
|
||||
"title-drag-and-drop-to-reorder": "Drag and drop to reorder"
|
||||
},
|
||||
"enum-mapping-editor": {
|
||||
@@ -7826,8 +7874,20 @@
|
||||
},
|
||||
"extract-fields-transformer-editor": {
|
||||
"label-delimiter": "Delimiter",
|
||||
"label-format": "Format",
|
||||
"label-keep-time": "Keep time",
|
||||
"label-replace-all-fields": "Replace all fields",
|
||||
"label-source": "Source",
|
||||
"placeholder-auto": "Auto",
|
||||
"placeholder-select-delimiter": "Select delimiter..."
|
||||
},
|
||||
"field-config-mapping-handler-arguments-editor": {
|
||||
"aria-label-threshold-color": "Threshold color"
|
||||
},
|
||||
"field-lookup-transformer-editor": {
|
||||
"label-field": "Field",
|
||||
"label-lookup": "Lookup"
|
||||
},
|
||||
"field-to-config-mapping-editor": {
|
||||
"additional-settings": "Additional settings",
|
||||
"field": "Field",
|
||||
@@ -7854,6 +7914,7 @@
|
||||
"label-filter-type": "Filter type"
|
||||
},
|
||||
"format-string-transfomer-editor": {
|
||||
"label-field": "Field",
|
||||
"label-format": "Format",
|
||||
"label-substring-range": "Substring range"
|
||||
},
|
||||
@@ -7870,8 +7931,13 @@
|
||||
"placeholder-ignored": "Ignored",
|
||||
"placeholder-select-stats": "Select stats"
|
||||
},
|
||||
"group-by-transformer-editor": {
|
||||
"title-calc-alert": "Calculations will not have an effect if no fields are being grouped on"
|
||||
},
|
||||
"group-to-nested-table-transformer-editor": {
|
||||
"label-show-field-names-in-nested-tables": "Show field names in nested tables"
|
||||
"description-show-field-names": "If enabled nested tables will show field names as a table header",
|
||||
"label-show-field-names-in-nested-tables": "Show field names in nested tables",
|
||||
"title-calc-alert": "Calculations will not have an effect if no fields are being grouped on."
|
||||
},
|
||||
"grouping-to-matrix-transformer-editor": {
|
||||
"label-cell-value": "Cell value",
|
||||
@@ -7880,7 +7946,9 @@
|
||||
"label-row": "Row"
|
||||
},
|
||||
"histogram-transformer-editor": {
|
||||
"placeholder-default": "Default: 30"
|
||||
"placeholder-auto": "Auto",
|
||||
"placeholder-default": "Default: 30",
|
||||
"placeholder-none": "None"
|
||||
},
|
||||
"index-options-editor": {
|
||||
"label-as-percentile": "As percentile",
|
||||
@@ -7893,6 +7961,8 @@
|
||||
"title-no-input-found": "No input found",
|
||||
"title-no-labels-found": "No labels found"
|
||||
},
|
||||
"label-join": "Join",
|
||||
"label-value": "Value",
|
||||
"tooltip-select-label-indicating-values": "Select the label indicating the values name"
|
||||
},
|
||||
"jsonpath-editor": {
|
||||
@@ -7903,6 +7973,9 @@
|
||||
"tooltip-remove-path": "Remove path"
|
||||
},
|
||||
"labels-as-fields-transformer-editor": {
|
||||
"label-labels": "Labels",
|
||||
"label-mode": "Mode",
|
||||
"label-value-field-name": "Value field name",
|
||||
"placeholder-optional-select-label": "(Optional) Select label",
|
||||
"tooltip-replace-value-field-label": "Replace the value field name with a label"
|
||||
},
|
||||
@@ -7913,21 +7986,32 @@
|
||||
"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"
|
||||
"st-field-is-time": "1st field is time field",
|
||||
"string-values-separate": "String values are represented as separate fields rather than as labels"
|
||||
},
|
||||
"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",
|
||||
"frame-fields-value": "Each frame has two fields: {{field1}}, {{field2}}",
|
||||
"multiple-frames": "Multiple frames",
|
||||
"string-values-are-represented-as-labels": "String values are represented as labels",
|
||||
"time-in-ascending-order": "Time in ascending order"
|
||||
},
|
||||
"organize-fields-transformer-editor": {
|
||||
"first-frame-warning": "Organize fields only works with a single frame. Consider applying a join transformation or filtering the input first."
|
||||
},
|
||||
"partion-by-values-editor": {
|
||||
"tooltip-naming": "Sets how the names of the selected fields are displayed. As frame name is usually better for tabular data"
|
||||
},
|
||||
"partition-by-values-editor": {
|
||||
"label-field": "Field",
|
||||
"label-keep-fields": "Keep fields",
|
||||
"label-naming": "Naming",
|
||||
"label-select-field": "Select field",
|
||||
"partition-values-works-single-frame": "Partition by values only works with a single frame."
|
||||
"partition-values-works-single-frame": "Partition by values only works with a single frame.",
|
||||
"tooltip-keeps-partition-fields-frames": "Keeps the partition fields in the frames"
|
||||
},
|
||||
"prepare-time-series-editor": {
|
||||
"label-format": "Format",
|
||||
@@ -7957,7 +8041,8 @@
|
||||
"label-model-type": "Model type",
|
||||
"label-predicted-points": "Predicted points",
|
||||
"label-x-field": "X field",
|
||||
"label-y-field": "Y field"
|
||||
"label-y-field": "Y field",
|
||||
"tooltip-number-of-xy-points-to-predict": "Number of X,Y points to predict"
|
||||
},
|
||||
"rename-by-regex-transformer-editor": {
|
||||
"label-match": "Match",
|
||||
@@ -7977,11 +8062,15 @@
|
||||
"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."
|
||||
"tooltip-statistic-should-calculated-series": "The statistic that should be calculated for this time series.",
|
||||
"tooltip-time-field": "The time field that will be used for the time series. If not selected the first found will be used."
|
||||
},
|
||||
"transpose-transfomer-editor": {
|
||||
"label-first-field-name": "First field name",
|
||||
"label-remaining-fields-name": "Remaining fields name",
|
||||
"placeholder-field": "Field",
|
||||
"placeholder-value": "Value"
|
||||
"placeholder-value": "Value",
|
||||
"tooltip-name-for-value-fields": "Name for value fields"
|
||||
},
|
||||
"unary-operation-editor": {
|
||||
"label-operation": "Operation",
|
||||
@@ -8049,6 +8138,7 @@
|
||||
"message": "No users found"
|
||||
},
|
||||
"token-revoked-modal": {
|
||||
"resume-message": "<0>To resume your session, sign in again.</0>Contact your administrator or visit the license page to review your quota if you are repeatedly signed out automatically.",
|
||||
"sign-in": "Sign in",
|
||||
"title-you-have-been-automatically-signed-out": "You have been automatically signed out"
|
||||
},
|
||||
@@ -8063,6 +8153,11 @@
|
||||
"shared-dashboard-users-tab-title": "Shared dashboard users"
|
||||
}
|
||||
},
|
||||
"variabels": {
|
||||
"variable-usages-button": {
|
||||
"usage-title": "Showing usages for: {{variableId}}"
|
||||
}
|
||||
},
|
||||
"variable": {
|
||||
"adhoc": {
|
||||
"placeholder": "Select value"
|
||||
@@ -8073,7 +8168,7 @@
|
||||
"picker": {
|
||||
"link-all": "All",
|
||||
"option-all": "All",
|
||||
"option-selected-values": "Selected",
|
||||
"option-selected-values": "Selected ({{numSelected}})",
|
||||
"option-tooltip": "Clear selections"
|
||||
},
|
||||
"textbox": {
|
||||
@@ -8099,6 +8194,9 @@
|
||||
"no-unknowns": {
|
||||
"no-renamed-or-missing-variables-found": "No renamed or missing variables found."
|
||||
},
|
||||
"picker-renderer": {
|
||||
"couldnt-load-variable": "Couldn't load variable"
|
||||
},
|
||||
"query-variable-refresh-select": {
|
||||
"description-update-values-variable": "When to update the values of this variable",
|
||||
"label-refresh": "Refresh"
|
||||
@@ -8151,9 +8249,12 @@
|
||||
"title-dependencies": "Dependencies"
|
||||
},
|
||||
"variables-unknown-button": {
|
||||
"usage-title": "Showing usages for: {{variableId}}",
|
||||
"VariablesUnknownButton-tooltip-show-usages": "Show usages"
|
||||
},
|
||||
"variables-unknown-table": {
|
||||
"collapse-label": "Renamed or missing variables",
|
||||
"collapse-tooltip": "Click to expand a list with all variable references that have been renamed or are missing from the dashboard.",
|
||||
"loading": "Loading..."
|
||||
}
|
||||
},
|
||||
|
||||
@@ -8,6 +8,8 @@ import { Stack, Select, UserIcon, UserView, Button } from '@grafana/ui';
|
||||
import { setMonacoEnv } from 'app/core/monacoEnv';
|
||||
import { ThemeProvider } from 'app/core/utils/ConfigProvider';
|
||||
|
||||
import { Trans } from '../app/core/internationalization';
|
||||
|
||||
import { NamespaceContext, WrappedPlugins } from './plugins';
|
||||
|
||||
export const Page = () => {
|
||||
@@ -106,7 +108,9 @@ export const Page = () => {
|
||||
<UserIcon userView={userView} />
|
||||
) : (
|
||||
<a href="/login">
|
||||
<Button variant="primary">Login</Button>
|
||||
<Button variant="primary">
|
||||
<Trans i18nKey="swagger.login">Login</Trans>
|
||||
</Button>
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
@@ -124,6 +128,7 @@ export const Page = () => {
|
||||
/>
|
||||
)}
|
||||
|
||||
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
|
||||
{!url?.value && <div>...{/** TODO, we can make an api docs loading page here */}</div>}
|
||||
</NamespaceContext.Provider>
|
||||
</ThemeProvider>
|
||||
|
||||
Reference in New Issue
Block a user