Internationalisation: Manual mark up following review (#107625)
* mark up and add confirmText to lint rule * mark up and add ariaLabel to lint rule * add confirmText to propertiesToCheck * mark up and add body to propsToCheck * mark up latest * mark up 'Dashboard saved' * mark up filterbyvalue options * mark up tooltip options * mark up and add lint rules for noOptionsMessage/loadingMessage * mark up 'Convert field type' * mark up placeholderText/noOptionsMessage * mark up run query * mark up variable editor fields * mark up week start options * mark up dashboard link options * mark up prom options * mark up builder/code toggles * make CI happy * kick CI
This commit is contained in:
+19
-1
@@ -24,7 +24,21 @@ const createRule = ESLintUtils.RuleCreator(
|
||||
/**
|
||||
* JSX props to check for untranslated strings
|
||||
*/
|
||||
const propsToCheck = ['content', 'label', 'description', 'placeholder', 'aria-label', 'title', 'text', 'tooltip'];
|
||||
const propsToCheck = [
|
||||
'content',
|
||||
'label',
|
||||
'description',
|
||||
'placeholder',
|
||||
'aria-label',
|
||||
'ariaLabel',
|
||||
'title',
|
||||
'text',
|
||||
'tooltip',
|
||||
'confirmText',
|
||||
'body',
|
||||
'noOptionsMessage',
|
||||
'loadingMessage',
|
||||
];
|
||||
|
||||
/**
|
||||
* Object properties to check for untranslated strings
|
||||
@@ -34,11 +48,15 @@ const propertiesToCheck = [
|
||||
'description',
|
||||
'placeholder',
|
||||
'aria-label',
|
||||
'ariaLabel',
|
||||
'title',
|
||||
'subTitle',
|
||||
'text',
|
||||
'tooltip',
|
||||
'message',
|
||||
'confirmText',
|
||||
'placeholderText',
|
||||
'noFieldsMessage',
|
||||
];
|
||||
|
||||
/** @type {RuleDefinition} */
|
||||
|
||||
@@ -40,11 +40,6 @@ const httpOptions = [
|
||||
{ value: 'GET', label: 'GET' },
|
||||
];
|
||||
|
||||
const editorOptions = [
|
||||
{ value: QueryEditorMode.Builder, label: 'Builder' },
|
||||
{ value: QueryEditorMode.Code, label: 'Code' },
|
||||
];
|
||||
|
||||
const cacheValueOptions = [
|
||||
{ value: PrometheusCacheLevel.Low, label: 'Low' },
|
||||
{ value: PrometheusCacheLevel.Medium, label: 'Medium' },
|
||||
@@ -86,6 +81,17 @@ export const PromSettings = (props: Props) => {
|
||||
const styles = overhaulStyles(theme);
|
||||
const { onOptionsChange } = props;
|
||||
|
||||
const editorOptions = [
|
||||
{
|
||||
value: QueryEditorMode.Builder,
|
||||
label: t('grafana-prometheus.configuration.prom-settings.editor-options.label-builder', 'Builder'),
|
||||
},
|
||||
{
|
||||
value: QueryEditorMode.Code,
|
||||
label: t('grafana-prometheus.configuration.prom-settings.editor-options.label-code', 'Code'),
|
||||
},
|
||||
];
|
||||
|
||||
const optionsWithDefaults = getOptionsWithDefaults(props.options);
|
||||
const [validDuration, updateValidDuration] = useState<ValidDuration>({
|
||||
timeInterval: '',
|
||||
|
||||
@@ -157,6 +157,10 @@
|
||||
"aria-label-prom-type-type": "{{promType}} type",
|
||||
"aria-label-prometheus-type": "Prometheus type",
|
||||
"aria-label-select-http-method": "Select HTTP method",
|
||||
"editor-options": {
|
||||
"label-builder": "Builder",
|
||||
"label-code": "Code"
|
||||
},
|
||||
"label-cache-level": "Cache level",
|
||||
"label-custom-query-parameters": "Custom query parameters",
|
||||
"label-default-editor": "Default editor",
|
||||
@@ -195,6 +199,16 @@
|
||||
"tooltip-use-series-endpoint": "Checking this option will favor the series endpoint with {{exampleParameter}} parameter over the label values endpoint with {{exampleParameter}} parameter. While the label values endpoint is considered more performant, some users may prefer the series because it has a POST method while the label values endpoint only has a GET method."
|
||||
}
|
||||
},
|
||||
"prom-query-legend-editor": {
|
||||
"get-legend-mode-options": {
|
||||
"description-auto": "Only includes unique labels",
|
||||
"description-custom": "Provide a naming template",
|
||||
"description-verbose": "All label names and values",
|
||||
"label-auto": "Auto",
|
||||
"label-custom": "Custom",
|
||||
"label-verbose": "Verbose"
|
||||
}
|
||||
},
|
||||
"querybuilder": {
|
||||
"additional-settings": {
|
||||
"content-filter-metric-names-regex-search-using": "Filter metric names by regex search, using an additional call on the Prometheus API.",
|
||||
@@ -204,6 +218,13 @@
|
||||
"give-feedback": "Give feedback",
|
||||
"title-give-feedback": "The metrics explorer is new, please let us know how we can improve it"
|
||||
},
|
||||
"get-collapsed-info": {
|
||||
"exemplars": "Exemplars: {{value}}",
|
||||
"format": "Format: {{value}}",
|
||||
"legend": "Legend: {{value}}",
|
||||
"step": "Step: {{value}}",
|
||||
"type": "Type: {{value}}"
|
||||
},
|
||||
"handle-function": {
|
||||
"text": {
|
||||
"query-parsing-is-ambiguous": "Query parsing is ambiguous."
|
||||
@@ -219,6 +240,10 @@
|
||||
"label-label-filters": "Label filters",
|
||||
"tooltip-label-filters": "Optional: used to filter the metric select for this query type."
|
||||
},
|
||||
"label-param-editor": {
|
||||
"loadingMessage-loading-labels": "Loading labels",
|
||||
"noOptionsMessage-no-labels-found": "No labels found"
|
||||
},
|
||||
"metric-combobox": {
|
||||
"async-select": {
|
||||
"aria-label-open-metrics-explorer": "Open metrics explorer",
|
||||
@@ -274,6 +299,11 @@
|
||||
"prom-query-builder-options": {
|
||||
"aria-label-lower-limit-parameter": "Set lower limit for the step parameter",
|
||||
"aria-label-select-resolution": "Select resolution",
|
||||
"format-options": {
|
||||
"label-heatmap": "Heatmap",
|
||||
"label-table": "Table",
|
||||
"label-time-series": "Time series"
|
||||
},
|
||||
"label-exemplars": "Exemplars",
|
||||
"label-format": "Format",
|
||||
"label-min-step": "Min step",
|
||||
@@ -288,6 +318,8 @@
|
||||
"tooltip-autocomplete-suggestions-limited": "The number of metric names exceeds the autocomplete limit. Only the {{autocompleteLimit}}-most relevant metrics are displayed. You can adjust the threshold in the data source settings."
|
||||
},
|
||||
"prom-query-editor-selector": {
|
||||
"body-syntax-error": "There is a syntax error, or the query structure cannot be visualized when switching to the builder mode. Parts of the query may be lost.",
|
||||
"confirmText-continue": "Continue",
|
||||
"kick-start-your-query": "Kick start your query",
|
||||
"label-explain": "Explain",
|
||||
"run-queries": "Run queries",
|
||||
@@ -304,6 +336,12 @@
|
||||
"query-editor-hints": {
|
||||
"hint-details": "hint: {{hintDetails}}"
|
||||
},
|
||||
"query-editor-mode-toggle": {
|
||||
"editor-modes": {
|
||||
"label-builder": "Builder",
|
||||
"label-code": "Code"
|
||||
}
|
||||
},
|
||||
"query-pattern": {
|
||||
"apply-query": "Apply query",
|
||||
"aria-label-apply-query-starter-button": "apply query starter button",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
import { useState } from 'react';
|
||||
|
||||
import { DataSourceApi, SelectableValue, TimeRange, toOption } from '@grafana/data';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { Select } from '@grafana/ui';
|
||||
|
||||
import { getOperationParamId } from '../shared/param_utils';
|
||||
@@ -47,8 +48,14 @@ export function LabelParamEditor({
|
||||
}}
|
||||
isLoading={state.isLoading}
|
||||
allowCustomValue
|
||||
noOptionsMessage="No labels found"
|
||||
loadingMessage="Loading labels"
|
||||
noOptionsMessage={t(
|
||||
'grafana-prometheus.querybuilder.label-param-editor.noOptionsMessage-no-labels-found',
|
||||
'No labels found'
|
||||
)}
|
||||
loadingMessage={t(
|
||||
'grafana-prometheus.querybuilder.label-param-editor.loadingMessage-loading-labels',
|
||||
'Loading labels'
|
||||
)}
|
||||
options={state.options}
|
||||
value={toOption(value as string)}
|
||||
onChange={(value) => onChange(index, value.value!)}
|
||||
|
||||
+35
-15
@@ -32,12 +32,6 @@ export interface PromQueryBuilderOptionsProps {
|
||||
onRunQuery: () => void;
|
||||
}
|
||||
|
||||
const FORMAT_OPTIONS: Array<SelectableValue<PromQueryFormat>> = [
|
||||
{ label: 'Time series', value: 'time_series' },
|
||||
{ label: 'Table', value: 'table' },
|
||||
{ label: 'Heatmap', value: 'heatmap' },
|
||||
];
|
||||
|
||||
const INTERVAL_FACTOR_OPTIONS: Array<SelectableValue<number>> = map([1, 2, 3, 4, 5, 10], (value: number) => ({
|
||||
value,
|
||||
label: '1/' + value,
|
||||
@@ -45,6 +39,24 @@ const INTERVAL_FACTOR_OPTIONS: Array<SelectableValue<number>> = map([1, 2, 3, 4,
|
||||
|
||||
export const PromQueryBuilderOptions = React.memo<PromQueryBuilderOptionsProps>(
|
||||
({ query, app, onChange, onRunQuery }) => {
|
||||
const FORMAT_OPTIONS: Array<SelectableValue<PromQueryFormat>> = [
|
||||
{
|
||||
label: t(
|
||||
'grafana-prometheus.querybuilder.prom-query-builder-options.format-options.label-time-series',
|
||||
'Time series'
|
||||
),
|
||||
value: 'time_series',
|
||||
},
|
||||
{
|
||||
label: t('grafana-prometheus.querybuilder.prom-query-builder-options.format-options.label-table', 'Table'),
|
||||
value: 'table',
|
||||
},
|
||||
{
|
||||
label: t('grafana-prometheus.querybuilder.prom-query-builder-options.format-options.label-heatmap', 'Heatmap'),
|
||||
value: 'heatmap',
|
||||
},
|
||||
];
|
||||
|
||||
const onChangeFormat = (value: SelectableValue<PromQueryFormat>) => {
|
||||
onChange({ ...query, format: value.value });
|
||||
onRunQuery();
|
||||
@@ -182,17 +194,25 @@ function getQueryTypeValue(query: PromQuery) {
|
||||
function getCollapsedInfo(query: PromQuery, formatOption: string, queryType: string, app?: CoreApp): string[] {
|
||||
const items: string[] = [];
|
||||
|
||||
items.push(`Legend: ${getLegendModeLabel(query.legendFormat)}`);
|
||||
items.push(`Format: ${formatOption}`);
|
||||
items.push(`Step: ${query.interval ?? 'auto'}`);
|
||||
items.push(`Type: ${queryType}`);
|
||||
items.push(
|
||||
t('grafana-prometheus.querybuilder.get-collapsed-info.legend', 'Legend: {{value}}', {
|
||||
value: getLegendModeLabel(query.legendFormat),
|
||||
})
|
||||
);
|
||||
items.push(
|
||||
t('grafana-prometheus.querybuilder.get-collapsed-info.format', 'Format: {{value}}', { value: formatOption })
|
||||
);
|
||||
items.push(
|
||||
t('grafana-prometheus.querybuilder.get-collapsed-info.step', 'Step: {{value}}', { value: query.interval ?? 'auto' })
|
||||
);
|
||||
items.push(t('grafana-prometheus.querybuilder.get-collapsed-info.type', 'Type: {{value}}', { value: queryType }));
|
||||
|
||||
if (shouldShowExemplarSwitch(query, app)) {
|
||||
if (query.exemplar) {
|
||||
items.push(`Exemplars: true`);
|
||||
} else {
|
||||
items.push(`Exemplars: false`);
|
||||
}
|
||||
items.push(
|
||||
t('grafana-prometheus.querybuilder.get-collapsed-info.exemplars', 'Exemplars: {{value}}', {
|
||||
value: query.exemplar ? 'true' : 'false',
|
||||
})
|
||||
);
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
@@ -98,8 +98,11 @@ export const PromQueryEditorSelector = memo<Props>((props) => {
|
||||
'grafana-prometheus.querybuilder.prom-query-editor-selector.title-parsing-error-switch-builder',
|
||||
'Parsing error: Switch to the builder mode?'
|
||||
)}
|
||||
body="There is a syntax error, or the query structure cannot be visualized when switching to the builder mode. Parts of the query may be lost. "
|
||||
confirmText="Continue"
|
||||
body={t(
|
||||
'grafana-prometheus.querybuilder.prom-query-editor-selector.body-syntax-error',
|
||||
'There is a syntax error, or the query structure cannot be visualized when switching to the builder mode. Parts of the query may be lost.'
|
||||
)}
|
||||
confirmText={t('grafana-prometheus.querybuilder.prom-query-editor-selector.confirmText-continue', 'Continue')}
|
||||
onConfirm={() => {
|
||||
changeEditorMode(query, QueryEditorMode.Builder, onChange);
|
||||
setParseModalOpen(false);
|
||||
|
||||
@@ -16,14 +16,31 @@ export interface PromQueryLegendEditorProps {
|
||||
onRunQuery: () => void;
|
||||
}
|
||||
|
||||
const legendModeOptions = [
|
||||
const getLegendModeOptions = () => [
|
||||
{
|
||||
label: 'Auto',
|
||||
label: t('grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.label-auto', 'Auto'),
|
||||
value: LegendFormatMode.Auto,
|
||||
description: 'Only includes unique labels',
|
||||
description: t(
|
||||
'grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.description-auto',
|
||||
'Only includes unique labels'
|
||||
),
|
||||
},
|
||||
{
|
||||
label: t('grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.label-verbose', 'Verbose'),
|
||||
value: LegendFormatMode.Verbose,
|
||||
description: t(
|
||||
'grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.description-verbose',
|
||||
'All label names and values'
|
||||
),
|
||||
},
|
||||
{
|
||||
label: t('grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.label-custom', 'Custom'),
|
||||
value: LegendFormatMode.Custom,
|
||||
description: t(
|
||||
'grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.description-custom',
|
||||
'Provide a naming template'
|
||||
),
|
||||
},
|
||||
{ label: 'Verbose', value: LegendFormatMode.Verbose, description: 'All label names and values' },
|
||||
{ label: 'Custom', value: LegendFormatMode.Custom, description: 'Provide a naming template' },
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -33,6 +50,7 @@ export const PromQueryLegendEditor = React.memo<PromQueryLegendEditorProps>(
|
||||
({ legendFormat, onChange, onRunQuery }) => {
|
||||
const mode = getLegendMode(legendFormat);
|
||||
const inputRef = useRef<HTMLInputElement | null>(null);
|
||||
const legendModeOptions = getLegendModeOptions();
|
||||
|
||||
const onLegendFormatChanged = (evt: React.FormEvent<HTMLInputElement>) => {
|
||||
let newFormat = evt.currentTarget.value;
|
||||
@@ -124,6 +142,7 @@ function getLegendMode(legendFormat: string | undefined) {
|
||||
}
|
||||
|
||||
export function getLegendModeLabel(legendFormat: string | undefined) {
|
||||
const legendModeOptions = getLegendModeOptions();
|
||||
const mode = getLegendMode(legendFormat);
|
||||
if (mode !== LegendFormatMode.Custom) {
|
||||
return legendModeOptions.find((x) => x.value === mode)?.label;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryEditorModeToggle.tsx
|
||||
import { t } from '@grafana/i18n';
|
||||
import { RadioButtonGroup } from '@grafana/ui';
|
||||
|
||||
import { QueryEditorMode } from './types';
|
||||
@@ -8,12 +9,17 @@ export interface Props {
|
||||
onChange: (mode: QueryEditorMode) => void;
|
||||
}
|
||||
|
||||
const editorModes = [
|
||||
{ label: 'Builder', value: QueryEditorMode.Builder },
|
||||
{ label: 'Code', value: QueryEditorMode.Code },
|
||||
];
|
||||
|
||||
export function QueryEditorModeToggle({ mode, onChange }: Props) {
|
||||
const editorModes = [
|
||||
{
|
||||
label: t('grafana-prometheus.querybuilder.query-editor-mode-toggle.editor-modes.label-builder', 'Builder'),
|
||||
value: QueryEditorMode.Builder,
|
||||
},
|
||||
{
|
||||
label: t('grafana-prometheus.querybuilder.query-editor-mode-toggle.editor-modes.label-code', 'Code'),
|
||||
value: QueryEditorMode.Code,
|
||||
},
|
||||
];
|
||||
return (
|
||||
<div data-testid={'QueryEditorModeToggle'}>
|
||||
<RadioButtonGroup options={editorModes} size="sm" value={mode} onChange={onChange} />
|
||||
|
||||
@@ -28,11 +28,6 @@ export interface QueryHeaderProps {
|
||||
queryRowFilter: QueryRowFilter;
|
||||
}
|
||||
|
||||
const editorModes = [
|
||||
{ label: 'Builder', value: EditorMode.Builder },
|
||||
{ label: 'Code', value: EditorMode.Code },
|
||||
];
|
||||
|
||||
export function QueryHeader({
|
||||
db,
|
||||
dialect,
|
||||
@@ -51,6 +46,14 @@ export function QueryHeader({
|
||||
|
||||
const htmlId = useId();
|
||||
|
||||
const editorModes = [
|
||||
{
|
||||
label: t('grafana-sql.components.query-header.editor-modes.label-builder', 'Builder'),
|
||||
value: EditorMode.Builder,
|
||||
},
|
||||
{ label: t('grafana-sql.components.query-header.editor-modes.label-code', 'Code'), value: EditorMode.Code },
|
||||
];
|
||||
|
||||
const onEditorModeChange = useCallback(
|
||||
(newEditorMode: EditorMode) => {
|
||||
if (newEditorMode === EditorMode.Code) {
|
||||
|
||||
@@ -55,6 +55,10 @@
|
||||
},
|
||||
"query-header": {
|
||||
"content-invalid-query": "Your query is invalid. Check below for details. <1></1>However, you can still run this query.",
|
||||
"editor-modes": {
|
||||
"label-builder": "Builder",
|
||||
"label-code": "Code"
|
||||
},
|
||||
"label-dataset": "Dataset",
|
||||
"label-filter": "Filter",
|
||||
"label-format": "Format",
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { t } from '@grafana/i18n';
|
||||
|
||||
import { ComponentSize } from '../../types/size';
|
||||
import { Button } from '../Button/Button';
|
||||
|
||||
@@ -18,7 +20,7 @@ export interface Props {
|
||||
export const DeleteButton = ({ size, disabled, onConfirm, 'aria-label': ariaLabel, closeOnConfirm }: Props) => {
|
||||
return (
|
||||
<ConfirmButton
|
||||
confirmText="Delete"
|
||||
confirmText={t('grafana-ui.confirm-button.confirmText-delete', 'Delete')}
|
||||
confirmVariant="destructive"
|
||||
size={size || 'md'}
|
||||
disabled={disabled}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { useCallback, useMemo } from 'react';
|
||||
|
||||
import { BootData } from '@grafana/data';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { t } from '@grafana/i18n';
|
||||
|
||||
import { Combobox } from '../Combobox/Combobox';
|
||||
import { ComboboxOption } from '../Combobox/types';
|
||||
@@ -17,12 +18,6 @@ export interface Props {
|
||||
}
|
||||
|
||||
export type WeekStart = 'saturday' | 'sunday' | 'monday';
|
||||
const weekStarts: ComboboxOption[] = [
|
||||
{ value: '', label: 'Default' },
|
||||
{ value: 'saturday', label: 'Saturday' },
|
||||
{ value: 'sunday', label: 'Sunday' },
|
||||
{ value: 'monday', label: 'Monday' },
|
||||
];
|
||||
|
||||
export function isWeekStart(value: string): value is WeekStart {
|
||||
return ['saturday', 'sunday', 'monday'].includes(value);
|
||||
@@ -53,6 +48,15 @@ export function getWeekStart(override?: string): WeekStart {
|
||||
|
||||
export const WeekStartPicker = (props: Props) => {
|
||||
const { onChange, width, autoFocus = false, onBlur, value, disabled = false, inputId } = props;
|
||||
const weekStarts: ComboboxOption[] = useMemo(
|
||||
() => [
|
||||
{ value: '', label: t('grafana-ui.week-start-picker.weekStarts-label-default', 'Default') },
|
||||
{ value: 'saturday', label: t('grafana-ui.week-start-picker.weekStarts-label-saturday', 'Saturday') },
|
||||
{ value: 'sunday', label: t('grafana-ui.week-start-picker.weekStarts-label-sunday', 'Sunday') },
|
||||
{ value: 'monday', label: t('grafana-ui.week-start-picker.weekStarts-label-monday', 'Monday') },
|
||||
],
|
||||
[]
|
||||
);
|
||||
|
||||
const onChangeWeekStart = useCallback(
|
||||
(selectable: ComboboxOption | null) => {
|
||||
@@ -63,7 +67,7 @@ export const WeekStartPicker = (props: Props) => {
|
||||
[onChange]
|
||||
);
|
||||
|
||||
const selected = useMemo(() => weekStarts.find((item) => item.value === value)?.value ?? '', [value]);
|
||||
const selected = useMemo(() => weekStarts.find((item) => item.value === value)?.value ?? '', [value, weekStarts]);
|
||||
|
||||
return (
|
||||
<Combobox
|
||||
|
||||
@@ -344,7 +344,10 @@ export function PanelChrome({
|
||||
>
|
||||
<div className={styles.loadingBarContainer}>
|
||||
{loadingState === LoadingState.Loading ? (
|
||||
<LoadingBar width={loadingBarWidth} ariaLabel="Panel loading bar" />
|
||||
<LoadingBar
|
||||
width={loadingBarWidth}
|
||||
ariaLabel={t('grafana-ui.panel-chrome.ariaLabel-panel-loading', 'Panel loading bar')}
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
@@ -362,7 +365,11 @@ export function PanelChrome({
|
||||
|
||||
{statusMessage && (
|
||||
<div className={styles.errorContainerFloating}>
|
||||
<PanelStatus message={statusMessage} onClick={statusMessageOnClick} ariaLabel="Panel status" />
|
||||
<PanelStatus
|
||||
message={statusMessage}
|
||||
onClick={statusMessageOnClick}
|
||||
ariaLabel={t('grafana-ui.panel-chrome.ariaLabel-panel-status', 'Panel status')}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
@@ -380,7 +387,11 @@ export function PanelChrome({
|
||||
>
|
||||
{statusMessage && (
|
||||
<div className={dragClassCancel}>
|
||||
<PanelStatus message={statusMessage} onClick={statusMessageOnClick} ariaLabel="Panel status" />
|
||||
<PanelStatus
|
||||
message={statusMessage}
|
||||
onClick={statusMessageOnClick}
|
||||
ariaLabel={t('grafana-ui.panel-chrome.ariaLabel-panel-status', 'Panel status')}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ export function FolderFilter({ onChange, maxMenuHeight }: FolderFilterProps): JS
|
||||
loadOptions={debouncedLoadOptions}
|
||||
maxMenuHeight={maxMenuHeight}
|
||||
placeholder={t('folder-filter.select-placeholder', 'Filter by folder')}
|
||||
noOptionsMessage="No folders found"
|
||||
noOptionsMessage={t('folder-filter.noOptionsMessage-no-folders-found', 'No folders found')}
|
||||
prefix={<Icon name="filter" />}
|
||||
aria-label={t('folder-filter.select-aria-label', 'Folder filter')}
|
||||
defaultOptions
|
||||
|
||||
@@ -2,6 +2,7 @@ import { flatten } from 'lodash';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
|
||||
import { SelectableValue } from '@grafana/data';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { Select } from '@grafana/ui';
|
||||
import { Variable } from 'app/types/templates';
|
||||
|
||||
@@ -32,7 +33,7 @@ export const MetricSelect = (props: Props) => {
|
||||
isSearchable={isSearchable}
|
||||
maxMenuHeight={500}
|
||||
placeholder={placeholder}
|
||||
noOptionsMessage="No options found"
|
||||
noOptionsMessage={t('metric-select.noOptionsMessage-no-options-found', 'No options found')}
|
||||
value={selected}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -67,7 +67,7 @@ export function OrgPicker({ onSelected, className, inputId, autoFocus, excludeOr
|
||||
}}
|
||||
value={selected}
|
||||
placeholder={t('org-picker.select-placeholder', 'Select organization')}
|
||||
noOptionsMessage="No organizations found"
|
||||
noOptionsMessage={t('org-picker.noOptionsMessage-no-organizations-found', 'No organizations found')}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -67,7 +67,10 @@ export class ServiceAccountPicker extends Component<Props, State> {
|
||||
loadOptions={this.search}
|
||||
onChange={onSelected}
|
||||
placeholder={t('service-account-picker.select-placeholder', 'Start typing to search for service accounts')}
|
||||
noOptionsMessage="No service accounts found"
|
||||
noOptionsMessage={t(
|
||||
'service-account-picker.noOptionsMessage-no-service-accounts-found',
|
||||
'No service accounts found'
|
||||
)}
|
||||
aria-label={t('service-account-picker.select-aria-label', 'Service account picker')}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -84,7 +84,7 @@ export class TeamPicker extends Component<Props, State> {
|
||||
onChange={onSelected}
|
||||
className={className}
|
||||
placeholder={t('team-picker.select-placeholder', 'Select a team')}
|
||||
noOptionsMessage="No teams found"
|
||||
noOptionsMessage={t('team-picker.noOptionsMessage-no-teams-found', 'No teams found')}
|
||||
aria-label={t('team-picker.select-aria-label', 'Team picker')}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -67,7 +67,7 @@ export class UserPicker extends Component<Props, State> {
|
||||
loadOptions={this.search}
|
||||
onChange={onSelected}
|
||||
placeholder={t('user-picker.select-placeholder', 'Start typing to search for user')}
|
||||
noOptionsMessage="No users found"
|
||||
noOptionsMessage={t('user-picker.noOptionsMessage-no-users-found', 'No users found')}
|
||||
aria-label={t('user-picker.select-aria-label', 'User picker')}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -186,7 +186,7 @@ export function AdminFeatureTogglesTable({ featureToggles, allowEditing, onUpdat
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
confirmText="Save changes"
|
||||
confirmText={t('admin.admin-feature-toggles-table.confirmText-save-changes', 'Save changes')}
|
||||
onConfirm={async () => {
|
||||
showSaveChangesModal(false)();
|
||||
handleSaveChanges();
|
||||
|
||||
@@ -72,7 +72,7 @@ function AdminOrgsTableComponent({ orgs, onDelete }: Props) {
|
||||
</Trans>
|
||||
</div>
|
||||
}
|
||||
confirmText="Delete"
|
||||
confirmText={t('admin.admin-orgs-table.confirmText-delete', 'Delete')}
|
||||
onDismiss={() => setDeleteOrg(undefined)}
|
||||
onConfirm={() => {
|
||||
onDelete(deleteOrg.id);
|
||||
|
||||
@@ -240,7 +240,7 @@ class UnThemedOrgRow extends PureComponent<OrgRowProps> {
|
||||
<td colSpan={1}>
|
||||
{canRemoveFromOrg && (
|
||||
<ConfirmButton
|
||||
confirmText="Confirm removal"
|
||||
confirmText={t('admin.un-themed-org-row.confirmText-confirm-removal', 'Confirm removal')}
|
||||
confirmVariant="destructive"
|
||||
onCancel={this.onCancelClick}
|
||||
onConfirm={this.onOrgRemove}
|
||||
@@ -464,7 +464,7 @@ export function ChangeOrgButton({
|
||||
</>
|
||||
) : (
|
||||
<ConfirmButton
|
||||
confirmText="Save"
|
||||
confirmText={t('admin.change-org-button.confirmText-save', 'Save')}
|
||||
onClick={onChangeRoleClick}
|
||||
onCancel={onCancelClick}
|
||||
onConfirm={onOrgRoleSave}
|
||||
|
||||
@@ -75,7 +75,7 @@ export function UserPermissions({ isGrafanaAdmin, isExternalUser, lockMessage, o
|
||||
onClick={onChangeClick}
|
||||
onConfirm={handleGrafanaAdminChange}
|
||||
onCancel={onCancelClick}
|
||||
confirmText="Change"
|
||||
confirmText={t('admin.user-permissions.confirmText-change', 'Change')}
|
||||
>
|
||||
{t('admin.user-permissions.change-button', 'Change')}
|
||||
</ConfirmButton>
|
||||
|
||||
@@ -142,8 +142,8 @@ export function UserProfile({
|
||||
<ConfirmModal
|
||||
isOpen={showDeleteModal}
|
||||
title={t('admin.user-profile.title-delete-user', 'Delete user')}
|
||||
body="Are you sure you want to delete this user?"
|
||||
confirmText="Delete user"
|
||||
body={t('admin.user-profile.body-delete', 'Are you sure you want to delete this user?')}
|
||||
confirmText={t('admin.user-profile.confirmText-delete-user', 'Delete user')}
|
||||
onConfirm={handleUserDelete}
|
||||
onDismiss={showDeleteUserModal(false)}
|
||||
/>
|
||||
@@ -162,8 +162,8 @@ export function UserProfile({
|
||||
<ConfirmModal
|
||||
isOpen={showDisableModal}
|
||||
title={t('admin.user-profile.title-disable-user', 'Disable user')}
|
||||
body="Are you sure you want to disable this user?"
|
||||
confirmText="Disable user"
|
||||
body={t('admin.user-profile.body-disable', 'Are you sure you want to disable this user?')}
|
||||
confirmText={t('admin.user-profile.confirmText-disable-user', 'Disable user')}
|
||||
onConfirm={handleUserDisable}
|
||||
onDismiss={showDisableUserModal(false)}
|
||||
/>
|
||||
@@ -290,7 +290,7 @@ export class UserProfileRow extends PureComponent<UserProfileRowProps, UserProfi
|
||||
</td>
|
||||
<td>
|
||||
<ConfirmButton
|
||||
confirmText="Save"
|
||||
confirmText={t('admin.user-profile-row.confirmText-save', 'Save')}
|
||||
onClick={this.onEditClick}
|
||||
onConfirm={this.onSave}
|
||||
onCancel={this.onCancelClick}
|
||||
|
||||
@@ -92,7 +92,7 @@ class BaseUserSessions extends PureComponent<Props, State> {
|
||||
<td>
|
||||
{canLogout && (
|
||||
<ConfirmButton
|
||||
confirmText="Confirm logout"
|
||||
confirmText={t('admin.base-user-sessions.confirmText-confirm-logout', 'Confirm logout')}
|
||||
confirmVariant="destructive"
|
||||
onConfirm={this.onSessionRevoke(session.id)}
|
||||
>
|
||||
@@ -115,8 +115,11 @@ class BaseUserSessions extends PureComponent<Props, State> {
|
||||
<ConfirmModal
|
||||
isOpen={showLogoutModal}
|
||||
title={t('admin.base-user-sessions.title-force-logout-from-all-devices', 'Force logout from all devices')}
|
||||
body="Are you sure you want to force logout from all devices?"
|
||||
confirmText="Force logout"
|
||||
body={t(
|
||||
'admin.base-user-sessions.body-force-logout-from-all-devices',
|
||||
'Are you sure you want to force logout from all devices?'
|
||||
)}
|
||||
confirmText={t('admin.base-user-sessions.confirmText-force-logout', 'Force logout')}
|
||||
onConfirm={this.onAllSessionsRevoke}
|
||||
onDismiss={this.dismissLogoutConfirmationModal}
|
||||
/>
|
||||
|
||||
@@ -261,8 +261,10 @@ export const OrgUsersTable = ({
|
||||
</Stack>
|
||||
{Boolean(userToRemove) && (
|
||||
<ConfirmModal
|
||||
body={`Are you sure you want to delete user ${userToRemove?.login}?`}
|
||||
confirmText="Delete"
|
||||
body={t('admin.org-users-table.body-delete', 'Are you sure you want to delete user {{user}}?', {
|
||||
user: userToRemove?.login,
|
||||
})}
|
||||
confirmText={t('admin.org-users-table.confirmText-delete', 'Delete')}
|
||||
title={t('admin.org-users-table.title-delete', 'Delete')}
|
||||
onDismiss={() => {
|
||||
setUserToRemove(null);
|
||||
|
||||
@@ -2,6 +2,7 @@ import { css } from '@emotion/css';
|
||||
import { ComponentProps, useMemo } from 'react';
|
||||
|
||||
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { InlineField, Select, SelectMenuOptions, useStyles2 } from '@grafana/ui';
|
||||
|
||||
import { useAlertmanager } from '../state/AlertmanagerContext';
|
||||
@@ -44,7 +45,10 @@ export const AlertManagerPicker = ({ disabled = false }: Props) => {
|
||||
}
|
||||
}}
|
||||
options={options}
|
||||
noOptionsMessage="No datasources found"
|
||||
noOptionsMessage={t(
|
||||
'alerting.alert-manager-picker.noOptionsMessage-no-datasources-found',
|
||||
'No datasources found'
|
||||
)}
|
||||
value={selectedAlertmanager}
|
||||
getOptionLabel={(o) => o.label}
|
||||
components={{ Option: CustomOption }}
|
||||
|
||||
+2
-2
@@ -100,7 +100,7 @@ export const ContactPointHeader = ({ contactPoint, onDelete }: ContactPointHeade
|
||||
<Menu.Item
|
||||
icon="download-alt"
|
||||
label={t('alerting.contact-point-header.export-label-export', 'Export')}
|
||||
ariaLabel="export"
|
||||
ariaLabel={t('alerting.contact-point-header.export-ariaLabel-export', 'Export')}
|
||||
disabled={!exportAllowed}
|
||||
data-testid="export"
|
||||
onClick={() => openExportDrawer(name)}
|
||||
@@ -159,7 +159,7 @@ export const ContactPointHeader = ({ contactPoint, onDelete }: ContactPointHeade
|
||||
>
|
||||
<Menu.Item
|
||||
label={t('alerting.contact-point-header.label-delete', 'Delete')}
|
||||
ariaLabel="delete"
|
||||
ariaLabel={t('alerting.contact-point-header.ariaLabel-delete', 'Delete')}
|
||||
icon="trash-alt"
|
||||
destructive
|
||||
disabled={!canBeDeleted}
|
||||
|
||||
+5
-1
@@ -87,7 +87,11 @@ export const MuteTimingActionsButtons = ({ muteTiming, alertManagerSourceName }:
|
||||
<ConfirmModal
|
||||
isOpen={showDeleteDrawer}
|
||||
title={t('alerting.mute-timing-actions-buttons.title-delete-mute-timing', 'Delete mute timing')}
|
||||
body={`Are you sure you would like to delete "${muteTiming.name}"?`}
|
||||
body={t(
|
||||
'alerting.mute-timing-actions-button.body-delete-mute-timing',
|
||||
'Are you sure you would like to delete "{{muteTiming}}"?',
|
||||
{ muteTiming: muteTiming.name }
|
||||
)}
|
||||
confirmText={t('alerting.common.delete', 'Delete')}
|
||||
onConfirm={async () => {
|
||||
await deleteMuteTiming.execute({
|
||||
|
||||
@@ -102,8 +102,12 @@ export const TemplatesTable = ({ alertManagerName, templates }: Props) => {
|
||||
<ConfirmModal
|
||||
isOpen={true}
|
||||
title={t('alerting.templates-table.title-delete-template-group', 'Delete template group')}
|
||||
body={`Are you sure you want to delete template group "${templateToDelete.title}"?`}
|
||||
confirmText="Yes, delete"
|
||||
body={t(
|
||||
'alerting.templates-table.body-delete-template-group',
|
||||
'Are you sure you want to delete template group "{{template}}"?',
|
||||
{ template: templateToDelete.title }
|
||||
)}
|
||||
confirmText={t('alerting.templates-table.confirmText-yes-delete', 'Yes, delete')}
|
||||
onConfirm={onDeleteTemplate}
|
||||
onDismiss={() => setTemplateToDelete(undefined)}
|
||||
/>
|
||||
|
||||
+4
-1
@@ -142,7 +142,10 @@ function TemplateSelector({ onSelect, onClose, option, valueInForm }: TemplateSe
|
||||
'alerting.template-selector.template-options.label.select-notification-template',
|
||||
'Select notification template'
|
||||
),
|
||||
ariaLabel: 'Select notification template',
|
||||
ariaLabel: t(
|
||||
'alerting.template-selector.template-options.ariaLabel.select-notification-template',
|
||||
'Select notification template'
|
||||
),
|
||||
value: 'Existing',
|
||||
description: `Select an existing notification template and preview it, or copy it to paste it in the custom tab. ${templateOption === 'Existing' ? 'Clicking Save saves your changes to the selected template.' : ''}`,
|
||||
},
|
||||
|
||||
+4
-1
@@ -213,7 +213,10 @@ export function GrafanaEvaluationBehaviorStep({
|
||||
isLoading={loadingGroups}
|
||||
invalid={Boolean(folder?.uid) && !group && Boolean(fieldState.error)}
|
||||
cacheOptions
|
||||
loadingMessage={'Loading groups...'}
|
||||
loadingMessage={t(
|
||||
'alerting.grafana-evaluation-behavior-step.loadingMessage-loading-groups',
|
||||
'Loading groups...'
|
||||
)}
|
||||
defaultValue={defaultGroupValue}
|
||||
options={groupOptions}
|
||||
getOptionLabel={(option: SelectableValue<string>) => (
|
||||
|
||||
+1
-1
@@ -718,7 +718,7 @@ export const QueryAndExpressionsStep = ({ editingExistingRule, onDataChange, mod
|
||||
<br />
|
||||
</div>
|
||||
}
|
||||
confirmText="Deactivate"
|
||||
confirmText={t('alerting.query-and-expressions-step.confirmText-deactivate', 'Deactivate')}
|
||||
icon="exclamation-triangle"
|
||||
onConfirm={() => {
|
||||
setValue('editorSettings.simplifiedQueryEditor', true);
|
||||
|
||||
@@ -82,7 +82,7 @@ export const useDeleteModal = (redirectToListView = false): DeleteModalHook => {
|
||||
'Deleting this rule will permanently remove it from your alert rule list. Are you sure you want to delete this rule?'
|
||||
)
|
||||
}
|
||||
confirmText="Yes, delete"
|
||||
confirmText={t('alerting.use-delete-modal.modal.confirmText-yes-delete', 'Yes, delete')}
|
||||
icon="exclamation-triangle"
|
||||
onConfirm={deleteRule}
|
||||
onDismiss={dismissModal}
|
||||
|
||||
@@ -56,7 +56,7 @@ export function RedirectToCloneRule({
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
confirmText="Copy"
|
||||
confirmText={t('alerting.redirect-to-clone-rule.confirmText-copy', 'Copy')}
|
||||
onConfirm={() => setStage('redirect')}
|
||||
onDismiss={onDismiss}
|
||||
/>
|
||||
|
||||
@@ -177,7 +177,10 @@ export const MultipleDataSourcePicker = (props: MultipleDataSourcePickerProps) =
|
||||
openMenuOnFocus={openMenuOnFocus}
|
||||
maxMenuHeight={500}
|
||||
placeholder={placeholder}
|
||||
noOptionsMessage="No datasources found"
|
||||
noOptionsMessage={t(
|
||||
'alerting.multiple-data-source-picker.noOptionsMessage-no-datasources-found',
|
||||
'No datasources found'
|
||||
)}
|
||||
value={value ?? []}
|
||||
invalid={Boolean(state?.error) || Boolean(props.invalid)}
|
||||
getOptionLabel={(o) => {
|
||||
|
||||
@@ -209,7 +209,7 @@ export default function AlertmanagerConfig({ alertmanagerName, onDismiss, onSave
|
||||
'Reset Alertmanager configuration'
|
||||
)}
|
||||
body={confirmationText}
|
||||
confirmText="Yes, reset configuration"
|
||||
confirmText={t('alerting.alertmanager-config.confirmText-yes-reset-configuration', 'Yes, reset configuration')}
|
||||
onConfirm={() => {
|
||||
onReset(alertmanagerName);
|
||||
setShowResetConfirmation(false);
|
||||
|
||||
@@ -242,8 +242,14 @@ const AlertmanagerConfigurationVersionManager = ({
|
||||
<ConfirmModal
|
||||
isOpen={confirmRestore}
|
||||
title={t('alerting.alertmanager-configuration-version-manager.title-restore-version', 'Restore version')}
|
||||
body={'Are you sure you want to restore the configuration to this version? All unsaved changes will be lost.'}
|
||||
confirmText={'Yes, restore configuration'}
|
||||
body={t(
|
||||
'alerting.alertmanager-configuration-version-manager.body-restore-configuration-version-unsaved-changes',
|
||||
'Are you sure you want to restore the configuration to this version? All unsaved changes will be lost.'
|
||||
)}
|
||||
confirmText={t(
|
||||
'alerting.alertmanager-configuration-version-manager.confirmText-yes-restore-configuration',
|
||||
'Yes, restore configuration'
|
||||
)}
|
||||
onConfirm={() => {
|
||||
if (activeRestoreVersion) {
|
||||
restoreVersion(activeRestoreVersion);
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
AnnotationEventFieldSource,
|
||||
getValueFormat,
|
||||
} from '@grafana/data';
|
||||
import { Trans } from '@grafana/i18n';
|
||||
import { Trans, t } from '@grafana/i18n';
|
||||
import { Select, Tooltip, Icon } from '@grafana/ui';
|
||||
|
||||
import { annotationEventNames, AnnotationFieldInfo } from '../standardAnnotationSupport';
|
||||
@@ -171,7 +171,10 @@ export class AnnotationFieldMapper extends PureComponent<Props, State> {
|
||||
onChange={(v: SelectableValue<string>) => {
|
||||
this.onFieldNameChange(row.key, v);
|
||||
}}
|
||||
noOptionsMessage="Unknown field names"
|
||||
noOptionsMessage={t(
|
||||
'annotations.annotation-field-mapper.noOptionsMessage-unknown-field-names',
|
||||
'Unknown field names'
|
||||
)}
|
||||
allowCustomValue={true}
|
||||
isClearable
|
||||
/>
|
||||
|
||||
@@ -263,7 +263,7 @@ export const ProviderConfigForm = ({ config, provider, isLoading }: ProviderConf
|
||||
</small>
|
||||
</Stack>
|
||||
}
|
||||
confirmText="Reset"
|
||||
confirmText={t('auth-config.provider-config-form.confirmText-reset', 'Reset')}
|
||||
onDismiss={() => setResetConfig(false)}
|
||||
onConfirm={async () => {
|
||||
await onResetConfig();
|
||||
|
||||
+5
-2
@@ -135,8 +135,11 @@ export function PanelDataTransformationsTabRendered({ model }: SceneComponentPro
|
||||
'dashboard-scene.panel-data-transformations-tab-rendered.title-delete-all-transformations',
|
||||
'Delete all transformations?'
|
||||
)}
|
||||
body="By deleting all transformations, you will go back to the main selection screen."
|
||||
confirmText="Delete all"
|
||||
body={t(
|
||||
'dashboard-scene.panel-data-transformations-tab-rendered.body-delete-all-transformations',
|
||||
'By deleting all transformations, you will go back to the main selection screen.'
|
||||
)}
|
||||
confirmText={t('dashboard-scene.panel-data-transformations-tab-rendered.confirmText-delete-all', 'Delete all')}
|
||||
onConfirm={() => {
|
||||
model.onChangeTransformations([]);
|
||||
setConfirmModalOpen(false);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { useAsyncFn } from 'react-use';
|
||||
|
||||
import { locationUtil } from '@grafana/data';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { locationService, reportInteraction } from '@grafana/runtime';
|
||||
import { Dashboard } from '@grafana/schema';
|
||||
import { Spec as DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen';
|
||||
@@ -59,7 +60,7 @@ export function useSaveDashboard(isCopy = false) {
|
||||
|
||||
// important that these happen before location redirect below
|
||||
appEvents.publish(new DashboardSavedEvent());
|
||||
notifyApp.success('Dashboard saved');
|
||||
notifyApp.success(t('dashboard-scene.use-save-dashboard.message-dashboard-saved', 'Dashboard saved'));
|
||||
|
||||
//Update local storage dashboard to handle things like last used datasource
|
||||
updateDashboardUidLastUsedDatasource(resultData.uid);
|
||||
|
||||
@@ -48,7 +48,7 @@ const onOpenSnapshotOriginalDashboard = (originalUrl: string) => {
|
||||
</>
|
||||
),
|
||||
confirmVariant: 'primary',
|
||||
confirmText: 'Proceed',
|
||||
confirmText: t('dashboard-scene.on-open-snapshot-original-dashboard.confirmText.proceed', 'Proceed'),
|
||||
onConfirm: () => {
|
||||
window.location.href = sanitizedAppUrl.href;
|
||||
},
|
||||
|
||||
@@ -12,9 +12,11 @@ export const UnlinkModal = ({ isOpen, onConfirm, onDismiss }: Props) => {
|
||||
<ConfirmModal
|
||||
title={t('dashboard-scene.unlink-modal.title-really-unlink-panel', 'Do you really want to unlink this panel?')}
|
||||
icon="question-circle"
|
||||
body="If you unlink this panel, you will be able to edit it without affecting any other dashboards.
|
||||
However, once you make a change you will not be able to revert to its original reusable panel."
|
||||
confirmText="Yes, unlink"
|
||||
body={t(
|
||||
'dashboard-scene.unlink-modal.body-unlink-panel',
|
||||
'If you unlink this panel, you will be able to edit it without affecting any other dashboards. However, once you make a change you will not be able to revert to its original reusable panel.'
|
||||
)}
|
||||
confirmText={t('dashboard-scene.unlink-modal.confirmText-yes-unlink', 'Yes, unlink')}
|
||||
onConfirm={() => {
|
||||
onConfirm();
|
||||
onDismiss();
|
||||
|
||||
@@ -35,17 +35,6 @@ import { DashboardEditView, DashboardEditViewState, useDashboardEditPageNav } fr
|
||||
|
||||
export interface GeneralSettingsEditViewState extends DashboardEditViewState {}
|
||||
|
||||
const EDITABLE_OPTIONS = [
|
||||
{ label: 'Editable', value: true },
|
||||
{ label: 'Read-only', value: false },
|
||||
];
|
||||
|
||||
const GRAPH_TOOLTIP_OPTIONS = [
|
||||
{ value: 0, label: 'Default' },
|
||||
{ value: 1, label: 'Shared crosshair' },
|
||||
{ value: 2, label: 'Shared Tooltip' },
|
||||
];
|
||||
|
||||
export class GeneralSettingsEditView
|
||||
extends SceneObjectBase<GeneralSettingsEditViewState>
|
||||
implements DashboardEditView
|
||||
@@ -176,6 +165,37 @@ export class GeneralSettingsEditView
|
||||
const { intervals } = model.getRefreshPicker().useState();
|
||||
const { hideTimeControls } = model.getDashboardControls().useState();
|
||||
const { enabled: liveNow } = model.getLiveNowTimer().useState();
|
||||
const EDITABLE_OPTIONS = [
|
||||
{
|
||||
label: t('dashboard-scene.general-settings-edit-view.editable_options.label.editable', 'Editable'),
|
||||
value: true,
|
||||
},
|
||||
{
|
||||
label: t('dashboard-scene.general-settings-edit-view.editable_options.label.readonly', 'Read-only'),
|
||||
value: false,
|
||||
},
|
||||
];
|
||||
|
||||
const GRAPH_TOOLTIP_OPTIONS = [
|
||||
{
|
||||
value: 0,
|
||||
label: t('dashboard-scene.general-settings-edit-view.graph_tooltip_options.label.default', 'Default'),
|
||||
},
|
||||
{
|
||||
value: 1,
|
||||
label: t(
|
||||
'dashboard-scene.general-settings-edit-view.graph_tooltip_options.label.shared-crosshair',
|
||||
'Shared crosshair'
|
||||
),
|
||||
},
|
||||
{
|
||||
value: 2,
|
||||
label: t(
|
||||
'dashboard-scene.general-settings-edit-view.graph_tooltip_options.label.shared-tooltip',
|
||||
'Shared tooltip'
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<Page navModel={navModel} pageNav={pageNav} layout={PageLayoutType.Standard}>
|
||||
|
||||
@@ -7,11 +7,6 @@ import { CollapsableSection, TagsInput, Select, Field, Input, Checkbox, Button }
|
||||
|
||||
import { LINK_ICON_MAP, NEW_LINK } from './utils';
|
||||
|
||||
const linkTypeOptions = [
|
||||
{ value: 'dashboards', label: 'Dashboards' },
|
||||
{ value: 'link', label: 'Link' },
|
||||
];
|
||||
|
||||
const linkIconOptions = Object.keys(LINK_ICON_MAP).map((key) => ({ label: key, value: key }));
|
||||
|
||||
interface DashboardLinkFormProps {
|
||||
@@ -21,6 +16,13 @@ interface DashboardLinkFormProps {
|
||||
}
|
||||
|
||||
export function DashboardLinkForm({ link, onUpdate, onGoBack }: DashboardLinkFormProps) {
|
||||
const linkTypeOptions = [
|
||||
{
|
||||
value: 'dashboards',
|
||||
label: t('dashboard-scene.dashboard-link-form.link-type-options.label.dashboards', 'Dashboards'),
|
||||
},
|
||||
{ value: 'link', label: t('dashboard-scene.dashboard-link-form.link-type-options.label.link', 'Link') },
|
||||
];
|
||||
const onTagsChange = (tags: string[]) => {
|
||||
onUpdate({ ...link, tags: tags });
|
||||
};
|
||||
|
||||
@@ -85,7 +85,7 @@ export function VariableEditorForm({ variable, onTypeChange, onGoBack, onDelete
|
||||
<Trans i18nKey="dashboard-scene.variable-editor-form.general">General</Trans>
|
||||
</VariableLegend>
|
||||
<VariableTextField
|
||||
name="Name"
|
||||
name={t('dashboard-scene.variable-editor-form.name-name', 'Name')}
|
||||
description={t(
|
||||
'dashboard-scene.variable-editor-form.description-template-variable-characters',
|
||||
'The name of the template variable. (Max. 50 characters)'
|
||||
@@ -101,7 +101,7 @@ export function VariableEditorForm({ variable, onTypeChange, onGoBack, onDelete
|
||||
error={nameError}
|
||||
/>
|
||||
<VariableTextField
|
||||
name="Label"
|
||||
name={t('dashboard-scene.variable-editor-form.name-label', 'Label')}
|
||||
description={t(
|
||||
'dashboard-scene.variable-editor-form.description-optional-display-name',
|
||||
'Optional display name'
|
||||
@@ -112,7 +112,7 @@ export function VariableEditorForm({ variable, onTypeChange, onGoBack, onDelete
|
||||
testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalLabelInputV2}
|
||||
/>
|
||||
<VariableTextAreaField
|
||||
name="Description"
|
||||
name={t('dashboard-scene.variable-editor-form.name-description', 'Description')}
|
||||
defaultValue={description ?? ''}
|
||||
placeholder={t('dashboard-scene.variable-editor-form.placeholder-descriptive-text', 'Descriptive text')}
|
||||
onBlur={onDescriptionBlur}
|
||||
@@ -136,7 +136,10 @@ export function VariableEditorForm({ variable, onTypeChange, onGoBack, onDelete
|
||||
showModal(ConfirmModal, {
|
||||
title: t('dashboard-scene.variable-editor-form.title.delete-variable', 'Delete variable'),
|
||||
body: `Are you sure you want to delete: ${name}?`,
|
||||
confirmText: 'Delete variable',
|
||||
confirmText: t(
|
||||
'dashboard-scene.variable-editor-form.confirmText.delete-variable',
|
||||
'Delete variable'
|
||||
),
|
||||
onConfirm: onDeleteVariable(hideModal),
|
||||
onDismiss: hideModal,
|
||||
isOpen: true,
|
||||
@@ -168,7 +171,7 @@ export function VariableEditorForm({ variable, onTypeChange, onGoBack, onDelete
|
||||
text={t('dashboard-scene.variable-editor-form.text-running-query', 'Running query...')}
|
||||
/>
|
||||
) : (
|
||||
`Run query`
|
||||
t('dashbaord-scene.variable-editor-form.run-query', 'Run query')
|
||||
)}
|
||||
</Button>
|
||||
)}
|
||||
|
||||
@@ -122,8 +122,15 @@ export function VariableEditorListRow({
|
||||
<ConfirmModal
|
||||
isOpen={showDeleteModal}
|
||||
title={t('dashboard-scene.variable-editor-list-row.title-delete-variable', 'Delete variable')}
|
||||
body={`Are you sure you want to delete: ${variableState.name}?`}
|
||||
confirmText="Delete variable"
|
||||
body={t(
|
||||
'dashboard-scene.variable-editor-list-row.body-delete-variable',
|
||||
'Are you sure you want to delete: {{variable}}?',
|
||||
{ variable: variableState.name }
|
||||
)}
|
||||
confirmText={t(
|
||||
'dashboard-scene.variable-editor-list-row.confirmText-delete-variable',
|
||||
'Delete variable'
|
||||
)}
|
||||
onConfirm={onDeleteVariable}
|
||||
onDismiss={handleDeleteVariableModal(false)}
|
||||
/>
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@ export function AdHocVariableForm({
|
||||
{datasourceSupported && onAllowCustomValueChange && (
|
||||
<VariableCheckboxField
|
||||
value={allowCustomValue ?? true}
|
||||
name="Allow custom values"
|
||||
name={t('dashboard-scene.ad-hoc-variable-form.name-allow-custom-values', 'Allow custom values')}
|
||||
description={t(
|
||||
'dashboard-scene.ad-hoc-variable-form.description-enables-users-custom-values',
|
||||
'Enables users to add custom values to the list'
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ export function CustomVariableForm({
|
||||
</VariableLegend>
|
||||
|
||||
<VariableTextAreaField
|
||||
name="Values separated by comma"
|
||||
name={t('dashboard-scene.custom-variable-form.name-values-separated-comma', 'Values separated by comma')}
|
||||
defaultValue={query}
|
||||
// eslint-disable-next-line @grafana/i18n/no-untranslated-strings
|
||||
placeholder="1, 10, mykey : myvalue, myvalue, escaped\,value"
|
||||
|
||||
+3
-3
@@ -2,7 +2,7 @@ import { FormEvent } from 'react';
|
||||
|
||||
import { SelectableValue } from '@grafana/data';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { Trans } from '@grafana/i18n';
|
||||
import { t, Trans } from '@grafana/i18n';
|
||||
|
||||
import { SelectionOptionsForm } from './SelectionOptionsForm';
|
||||
import { VariableLegend } from './VariableLegend';
|
||||
@@ -50,7 +50,7 @@ export function DataSourceVariableForm({
|
||||
<Trans i18nKey="dashboard-scene.data-source-variable-form.data-source-options">Data source options</Trans>
|
||||
</VariableLegend>
|
||||
<VariableSelectField
|
||||
name="Type"
|
||||
name={t('dashboard-scene.data-source-variable-form.name-type', 'Type')}
|
||||
value={typeValue}
|
||||
options={optionTypes}
|
||||
onChange={onChange}
|
||||
@@ -59,7 +59,7 @@ export function DataSourceVariableForm({
|
||||
|
||||
<VariableTextField
|
||||
defaultValue={regex}
|
||||
name="Instance name filter"
|
||||
name={t('dashboard-scene.data-source-variable-form.name-instance-name-filter', 'Instance name filter')}
|
||||
// eslint-disable-next-line @grafana/i18n/no-untranslated-strings
|
||||
placeholder="/.*-(.*)-.*/"
|
||||
onBlur={onRegExBlur}
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@ export function GroupByVariableForm({
|
||||
{datasourceSupported && !inline && onAllowCustomValueChange && (
|
||||
<VariableCheckboxField
|
||||
value={allowCustomValue}
|
||||
name="Allow custom values"
|
||||
name={t('dashboard-scene.group-by-variable-form.name-allow-custom-values', 'Allow custom values')}
|
||||
description={t(
|
||||
'dashboard-scene.group-by-variable-form.description-enables-users-custom-values',
|
||||
'Enables users to add custom values to the list'
|
||||
|
||||
+5
-5
@@ -51,7 +51,7 @@ export function IntervalVariableForm({
|
||||
)}
|
||||
<VariableTextField
|
||||
defaultValue={intervals}
|
||||
name="Values"
|
||||
name={t('dashboard-scene.interval-variable-form.name-values', 'Values')}
|
||||
// eslint-disable-next-line @grafana/i18n/no-untranslated-strings
|
||||
placeholder="1m,10m,1h,6h,1d,7d"
|
||||
onBlur={onIntervalsChange}
|
||||
@@ -62,9 +62,9 @@ export function IntervalVariableForm({
|
||||
|
||||
<VariableCheckboxField
|
||||
value={autoEnabled}
|
||||
name="Auto option"
|
||||
name={t('dashboard-scene.interval-variable-form.name-auto-option', 'Auto option')}
|
||||
description={t(
|
||||
'dashbaord-scene.interval-variable-form.description-auto-option',
|
||||
'dashboard-scene.interval-variable-form.description-auto-option',
|
||||
'Dynamically calculates interval by dividing time range by the count specified'
|
||||
)}
|
||||
onChange={onAutoEnabledChange}
|
||||
@@ -73,7 +73,7 @@ export function IntervalVariableForm({
|
||||
{autoEnabled && (
|
||||
<div className={styles.autoFields}>
|
||||
<VariableSelectField
|
||||
name="Step count"
|
||||
name={t('dashboard-scene.interval-variable-form.name-step-count', 'Step count')}
|
||||
description={t(
|
||||
'dashboard-scene.interval-variable-form.description-step-count',
|
||||
'How many times the current time range should be divided to calculate the value'
|
||||
@@ -86,7 +86,7 @@ export function IntervalVariableForm({
|
||||
/>
|
||||
<VariableTextField
|
||||
value={autoMinInterval}
|
||||
name="Min interval"
|
||||
name={t('dashboard-scene.interval-variable-form.name-min-interval', 'Min interval')}
|
||||
description={t(
|
||||
'dashboard-scene.interval-variable-form.description-calculated-value-below-threshold',
|
||||
'The calculated value will not go below this threshold'
|
||||
|
||||
+1
-1
@@ -106,7 +106,7 @@ export function QueryVariableEditorForm({
|
||||
|
||||
<VariableTextAreaField
|
||||
defaultValue={regex ?? ''}
|
||||
name="Regex"
|
||||
name={t('dashboard-scene.query-variable-editor-form.name-regex', 'Regex')}
|
||||
description={
|
||||
<div>
|
||||
<Trans i18nKey="dashboard-scene.query-variable-editor-form.description-optional">
|
||||
|
||||
+4
-4
@@ -31,7 +31,7 @@ export function SelectionOptionsForm({
|
||||
<Stack direction="column" gap={2} height="inherit" alignItems="start">
|
||||
<VariableCheckboxField
|
||||
value={multi}
|
||||
name="Multi-value"
|
||||
name={t('dashboard-scene.selection-options-form.name-multi-value', 'Multi-value')}
|
||||
description={t(
|
||||
'dashboard-scene.selection-options-form.description-enables-multiple-values-selected',
|
||||
'Enables multiple values to be selected at the same time'
|
||||
@@ -42,7 +42,7 @@ export function SelectionOptionsForm({
|
||||
{onAllowCustomValueChange && ( // backwards compat with old arch, remove on cleanup
|
||||
<VariableCheckboxField
|
||||
value={allowCustomValue ?? true}
|
||||
name="Allow custom values"
|
||||
name={t('dashboard-scene.selection-options-form.name-allow-custom-values', 'Allow custom values')}
|
||||
description={t(
|
||||
'dashboard-scene.selection-options-form.description-enables-users-custom-values',
|
||||
'Enables users to add custom values to the list'
|
||||
@@ -53,7 +53,7 @@ export function SelectionOptionsForm({
|
||||
)}
|
||||
<VariableCheckboxField
|
||||
value={includeAll}
|
||||
name="Include All option"
|
||||
name={t('dashboard-scene.selection-options-form.name-include-all-option', 'Include All option')}
|
||||
description={t(
|
||||
'dashboard-scene.selection-options-form.description-enables-option-include-variables',
|
||||
'Enables an option to include all values'
|
||||
@@ -65,7 +65,7 @@ export function SelectionOptionsForm({
|
||||
<VariableTextField
|
||||
defaultValue={allValue ?? ''}
|
||||
onBlur={onAllValueChange}
|
||||
name="Custom all value"
|
||||
name={t('dashboard-scene.selection-options-form.name-custom-all-value', 'Custom all value')}
|
||||
testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsCustomAllInput}
|
||||
/>
|
||||
)}
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ export function TextBoxVariableForm({ defaultValue, value, onChange, onBlur, inl
|
||||
<VariableTextField
|
||||
value={value}
|
||||
defaultValue={defaultValue}
|
||||
name={inline ? undefined : 'Default value'}
|
||||
name={inline ? undefined : t('dashboard-scene.text-box-variable.name-default-value', 'Default value')}
|
||||
placeholder={t('dashboard-scene.text-box-variable-form.placeholder-default-value-if-any', '(optional)')}
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
|
||||
+21
-7
@@ -10,14 +10,28 @@ interface Props {
|
||||
type: VariableType;
|
||||
}
|
||||
|
||||
const HIDE_OPTIONS = [
|
||||
{ label: 'Nothing', value: VariableHide.dontHide },
|
||||
{ label: 'Variable', value: VariableHide.hideVariable },
|
||||
{ label: 'Label', value: VariableHide.hideLabel },
|
||||
];
|
||||
|
||||
export function VariableHideSelect({ onChange, hide, type }: PropsWithChildren<Props>) {
|
||||
const value = useMemo(() => HIDE_OPTIONS.find((o) => o.value === hide)?.value ?? HIDE_OPTIONS[0].value, [hide]);
|
||||
const HIDE_OPTIONS = useMemo(
|
||||
() => [
|
||||
{
|
||||
label: t('dashboard-scene.variable-hide-select.hide_options.label.nothing', 'Nothing'),
|
||||
value: VariableHide.dontHide,
|
||||
},
|
||||
{
|
||||
label: t('dashboard-scene.variable-hide-select.hide_options.label.variable', 'Variable'),
|
||||
value: VariableHide.hideVariable,
|
||||
},
|
||||
{
|
||||
label: t('dashboard-scene.variable-hide-select.hide_options.label.label', 'Label'),
|
||||
value: VariableHide.hideLabel,
|
||||
},
|
||||
],
|
||||
[]
|
||||
);
|
||||
const value = useMemo(
|
||||
() => HIDE_OPTIONS.find((o) => o.value === hide)?.value ?? HIDE_OPTIONS[0].value,
|
||||
[hide, HIDE_OPTIONS]
|
||||
);
|
||||
|
||||
if (type === 'constant') {
|
||||
return null;
|
||||
|
||||
+2
-1
@@ -2,6 +2,7 @@ import { PropsWithChildren, useMemo } from 'react';
|
||||
|
||||
import { SelectableValue, VariableType } from '@grafana/data';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { VariableSelectField } from 'app/features/dashboard-scene/settings/variables/components/VariableSelectField';
|
||||
|
||||
import { EditableVariableType, getVariableTypeSelectOptions } from '../utils';
|
||||
@@ -20,7 +21,7 @@ export function VariableTypeSelect({ onChange, type }: PropsWithChildren<Props>)
|
||||
|
||||
return (
|
||||
<VariableSelectField
|
||||
name="Variable type"
|
||||
name={t('dashboard-scene.variable-type-select.name-variable-type', 'Variable type')}
|
||||
value={value}
|
||||
options={options}
|
||||
onChange={onChange}
|
||||
|
||||
+1
-1
@@ -227,7 +227,7 @@ export function Editor({ variable }: { variable: QueryVariable }) {
|
||||
|
||||
<VariableTextAreaField
|
||||
defaultValue={regex ?? ''}
|
||||
name="Regex"
|
||||
name={t('dashboard-scene.query-variable-editor-form.name-regex', 'Regex')}
|
||||
description={
|
||||
<div>
|
||||
<Trans i18nKey="dashboard-scene.query-variable-editor-form.description-optional">
|
||||
|
||||
+5
-1
@@ -44,7 +44,11 @@ export const RevertDashboardModal = ({ hideModal, onRestore, version }: RevertDa
|
||||
</Trans>
|
||||
</p>
|
||||
}
|
||||
confirmText={`Yes, restore to version ${version.version}`}
|
||||
confirmText={t(
|
||||
'dashboard-scene.revert-dashboard-modal.confirmText-restore-version',
|
||||
'Yes, restore to version {{version}}',
|
||||
{ version: version.version }
|
||||
)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
+1
-1
@@ -65,7 +65,7 @@ export const VersionHistoryTable = ({ versions, canCompare, onCheck, onRestore }
|
||||
<td>{version.message}</td>
|
||||
<td className="text-right">
|
||||
{idx === 0 ? (
|
||||
<Tag name="Latest" colorIndex={17} />
|
||||
<Tag name={t('dashboard-scene.version-history-table.name-latest', 'Latest')} colorIndex={17} />
|
||||
) : (
|
||||
<ModalsController>
|
||||
{({ showModal, hideModal }) => (
|
||||
|
||||
+4
-1
@@ -47,7 +47,10 @@ export function ConfigPublicDashboard({ model, publicDashboard, isGetLoading }:
|
||||
isOpen: true,
|
||||
title: t('dashboard-scene.config-public-dashboard.title.revoke-public-url', 'Revoke public URL'),
|
||||
icon: 'trash-alt',
|
||||
confirmText: 'Revoke public URL',
|
||||
confirmText: t(
|
||||
'dashboard-scene.config-public-dashboard.confirmText.revoke-public-url',
|
||||
'Revoke public URL'
|
||||
),
|
||||
body: (
|
||||
<p className={styles.description}>
|
||||
<Trans i18nKey="public-dashboard.config.revoke-body">
|
||||
|
||||
@@ -117,7 +117,7 @@ export const DashNav = memo<Props>((props) => {
|
||||
</>
|
||||
),
|
||||
confirmVariant: 'primary',
|
||||
confirmText: 'Proceed',
|
||||
confirmText: t('dashboard.dash-nav.on-open-snapshot-original.confirmText.proceed', 'Proceed'),
|
||||
onConfirm: gotoSnapshotOrigin,
|
||||
},
|
||||
})
|
||||
|
||||
@@ -29,12 +29,6 @@ import { SettingsPageProps } from './types';
|
||||
|
||||
export type Props = SettingsPageProps & ConnectedProps<typeof connector>;
|
||||
|
||||
const GRAPH_TOOLTIP_OPTIONS = [
|
||||
{ value: 0, label: 'Default' },
|
||||
{ value: 1, label: 'Shared crosshair' },
|
||||
{ value: 2, label: 'Shared Tooltip' },
|
||||
];
|
||||
|
||||
export function GeneralSettingsUnconnected({
|
||||
dashboard,
|
||||
updateTimeZone,
|
||||
@@ -44,6 +38,20 @@ export function GeneralSettingsUnconnected({
|
||||
const [renderCounter, setRenderCounter] = useState(0);
|
||||
const [dashboardTitle, setDashboardTitle] = useState(dashboard.title);
|
||||
const [dashboardDescription, setDashboardDescription] = useState(dashboard.description);
|
||||
const GRAPH_TOOLTIP_OPTIONS = [
|
||||
{ value: 0, label: t('dashboard.general-settings-unconnected.graph_tooltip_options.label.default', 'Default') },
|
||||
{
|
||||
value: 1,
|
||||
label: t(
|
||||
'dashboard.general-settings-unconnected.graph_tooltip_options.label.shared-crosshair',
|
||||
'Shared crosshair'
|
||||
),
|
||||
},
|
||||
{
|
||||
value: 2,
|
||||
label: t('dashboard.general-settings-unconnected.graph_tooltip_options.label.shared-tooltip', 'Shared tooltip'),
|
||||
},
|
||||
];
|
||||
|
||||
const pageNav = sectionNav.node.parentItem;
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ export const SaveDashboardErrorProxy = ({
|
||||
</Trans>
|
||||
</div>
|
||||
}
|
||||
confirmText="Save and overwrite"
|
||||
confirmText={t('dashboard.save-dashboard-error-proxy.confirmText-save-and-overwrite', 'Save and overwrite')}
|
||||
onConfirm={async () => {
|
||||
await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard);
|
||||
onDismiss();
|
||||
@@ -90,7 +90,10 @@ export const SaveDashboardErrorProxy = ({
|
||||
</Trans>
|
||||
</div>
|
||||
}
|
||||
confirmText="Save and overwrite"
|
||||
confirmText={t(
|
||||
'dashboard.save-dashboard-error-proxy.confirmText-save-and-overwrite',
|
||||
'Save and overwrite'
|
||||
)}
|
||||
onConfirm={async () => {
|
||||
await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard);
|
||||
onDismiss();
|
||||
|
||||
@@ -2,6 +2,7 @@ import { cloneDeep } from 'lodash';
|
||||
import { useAsyncFn } from 'react-use';
|
||||
|
||||
import { locationUtil } from '@grafana/data';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { locationService, reportInteraction } from '@grafana/runtime';
|
||||
import { Dashboard } from '@grafana/schema';
|
||||
import appEvents from 'app/core/app_events';
|
||||
@@ -54,7 +55,7 @@ export const useDashboardSave = (isCopy = false) => {
|
||||
|
||||
// important that these happen before location redirect below
|
||||
appEvents.publish(new DashboardSavedEvent());
|
||||
notifyApp.success('Dashboard saved');
|
||||
notifyApp.success(t('dashboard.save-dashboard.message-dashboard-saved', 'Dashboard saved'));
|
||||
|
||||
//Update local storage dashboard to handle things like last used datasource
|
||||
updateDashboardUidLastUsedDatasource(result.uid);
|
||||
|
||||
+5
-2
@@ -197,8 +197,11 @@ export const TransformationOperationRow = ({
|
||||
title={t('dashboard.transformation-operation-row.title-delete', 'Delete {{name}}?', {
|
||||
name: uiConfig.name,
|
||||
})}
|
||||
body="Note that removing one transformation may break others. If there is only a single transformation, you will go back to the main selection screen."
|
||||
confirmText="Delete"
|
||||
body={t(
|
||||
'dashboard.transformation-operation-row.body-delete',
|
||||
'Note that removing one transformation may break others. If there is only a single transformation, you will go back to the main selection screen.'
|
||||
)}
|
||||
confirmText={t('dashboard.transformation-operation-row.render-actions.confirmText-delete', 'Delete')}
|
||||
onConfirm={() => {
|
||||
setShowDeleteModal(false);
|
||||
onRemove(index);
|
||||
|
||||
+5
-2
@@ -397,8 +397,11 @@ class UnThemedTransformationsEditor extends React.PureComponent<TransformationsE
|
||||
'dashboard.un-themed-transformations-editor.title-delete-all-transformations',
|
||||
'Delete all transformations?'
|
||||
)}
|
||||
body="By deleting all transformations, you will go back to the main selection screen."
|
||||
confirmText="Delete all"
|
||||
body={t(
|
||||
'dashboard.un-theme-transformations-editor.body-delete-all-transformations',
|
||||
'By deleting all transformations, you will go back to the main selection screen.'
|
||||
)}
|
||||
confirmText={t('dashboard.un-themed-transformations-editor.confirmText-delete-all', 'Delete all')}
|
||||
onConfirm={() => this.onTransformationRemoveAll()}
|
||||
onDismiss={() => this.setState({ showRemoveAllModal: false })}
|
||||
/>
|
||||
|
||||
@@ -34,7 +34,11 @@ export const RevertDashboardModal = ({ hideModal, id, version }: RevertDashboard
|
||||
</Trans>
|
||||
</p>
|
||||
}
|
||||
confirmText={`Yes, restore to version ${version}`}
|
||||
confirmText={t(
|
||||
'dashboard.revert-dashboard-modal.confirmText-restore-version',
|
||||
'Yes, restore to version {{version}}',
|
||||
{ version }
|
||||
)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -63,7 +63,7 @@ export const VersionHistoryTable = ({ versions, canCompare, onCheck }: VersionsT
|
||||
<td>{version.message}</td>
|
||||
<td className="text-right">
|
||||
{idx === 0 ? (
|
||||
<Tag name="Latest" colorIndex={17} />
|
||||
<Tag name={t('dashboard.version-history-table.name-latest', 'Latest')} colorIndex={17} />
|
||||
) : (
|
||||
<ModalsController>
|
||||
{({ showModal, hideModal }) => (
|
||||
|
||||
@@ -74,7 +74,7 @@ export const ColorDimensionEditor = (props: StandardEditorProps<ColorDimensionCo
|
||||
value={selectedOption}
|
||||
options={selectOptions}
|
||||
onChange={onSelectChange}
|
||||
noOptionsMessage="No fields found"
|
||||
noOptionsMessage={t('dimensions.color-dimension-editor.noOptionsMessage-no-fields-found', 'No fields found')}
|
||||
isClearable={item.settings?.isClearable}
|
||||
placeholder={item.settings?.placeholder}
|
||||
/>
|
||||
|
||||
@@ -107,7 +107,7 @@ export const ScalarDimensionEditor = ({ value, context, onChange, item }: Props)
|
||||
value={selectedOption}
|
||||
options={selectOptions}
|
||||
onChange={onSelectChange}
|
||||
noOptionsMessage="No fields found"
|
||||
noOptionsMessage={t('dimensions.scalar-dimension-editor.noOptionsMessage-no-fields-found', 'No fields found')}
|
||||
/>
|
||||
</div>
|
||||
<div className={styles.range}>
|
||||
|
||||
@@ -104,7 +104,7 @@ export const ScaleDimensionEditor = (props: StandardEditorProps<ScaleDimensionCo
|
||||
value={selectedOption}
|
||||
options={selectOptions}
|
||||
onChange={onSelectChange}
|
||||
noOptionsMessage="No fields found"
|
||||
noOptionsMessage={t('dimensions.scale-dimension-editor.noOptionsMessage-no-fields-found', 'No fields found')}
|
||||
/>
|
||||
</div>
|
||||
<div className={styles.range}>
|
||||
|
||||
+2
-2
@@ -88,7 +88,7 @@ export default function TracePageActions(props: TracePageActionsProps) {
|
||||
|
||||
<ActionButton
|
||||
onClick={copyTraceId}
|
||||
ariaLabel={'Copy Trace ID'}
|
||||
ariaLabel={t('explore.trace-page-actions.ariaLabel-copy-trace-id', 'Copy Trace ID')}
|
||||
label={
|
||||
copyTraceIdClicked
|
||||
? t('explore.trace-page-actions.label-copied', 'Copied!')
|
||||
@@ -98,7 +98,7 @@ export default function TracePageActions(props: TracePageActionsProps) {
|
||||
/>
|
||||
<ActionButton
|
||||
onClick={exportTrace}
|
||||
ariaLabel={'Export Trace'}
|
||||
ariaLabel={t('explore.trace-page-actions.ariaLabel-export-trace', 'Export Trace')}
|
||||
label={t('explore.trace-page-actions.label-export', 'Export')}
|
||||
icon={'save'}
|
||||
/>
|
||||
|
||||
+2
-2
@@ -211,7 +211,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => {
|
||||
/>
|
||||
<div className={styles.intervalInput}>
|
||||
<IntervalInput
|
||||
ariaLabel="Select min span duration"
|
||||
ariaLabel={t('explore.span-filters.ariaLabel-select-min-span-duration', 'Select min span duration')}
|
||||
onChange={(val) => setSpanFiltersSearch({ ...search, from: val })}
|
||||
isInvalidError="Invalid duration"
|
||||
// eslint-disable-next-line @grafana/i18n/no-untranslated-strings
|
||||
@@ -228,7 +228,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => {
|
||||
value={search.toOperator}
|
||||
/>
|
||||
<IntervalInput
|
||||
ariaLabel="Select max span duration"
|
||||
ariaLabel={t('explore.span-filters.ariaLabel-select-max-span-duration', 'Select max span duration')}
|
||||
onChange={(val) => setSpanFiltersSearch({ ...search, to: val })}
|
||||
isInvalidError="Invalid duration"
|
||||
// eslint-disable-next-line @grafana/i18n/no-untranslated-strings
|
||||
|
||||
+6
-1
@@ -1,3 +1,4 @@
|
||||
import { t } from '@grafana/i18n';
|
||||
import { ConfirmModal } from '@grafana/ui';
|
||||
|
||||
import { PanelModel } from '../../../dashboard/state/PanelModel';
|
||||
@@ -19,7 +20,11 @@ export const ChangeLibraryPanelModal = ({ onConfirm, onDismiss, panel }: ChangeL
|
||||
<ConfirmModal
|
||||
onConfirm={onConfirm}
|
||||
onDismiss={onDismiss}
|
||||
confirmText={isLibraryPanel ? 'Change' : 'Replace'}
|
||||
confirmText={
|
||||
isLibraryPanel
|
||||
? t('library-panels.change-library-panel-modal.confirmText-change', 'Change')
|
||||
: t('library-panels.change-library-panel-modal.confirmText-replace', 'Replace')
|
||||
}
|
||||
title={title}
|
||||
body={body}
|
||||
dismissText="Cancel"
|
||||
|
||||
@@ -104,8 +104,12 @@ export const SnapshotListTable = () => {
|
||||
isOpen={!!removeSnapshot}
|
||||
icon="trash-alt"
|
||||
title={t('manage-dashboards.snapshot-list-table.title-delete', 'Delete')}
|
||||
body={`Are you sure you want to delete '${removeSnapshot?.name}'?`}
|
||||
confirmText="Delete"
|
||||
body={t(
|
||||
'manage-dashboards.snapshot-list-table.body-delete',
|
||||
"Are you sure you want to delete '{{snapshotToRemove}}'?",
|
||||
{ snapshotToRemove: removeSnapshot?.name }
|
||||
)}
|
||||
confirmText={t('manage-dashboards.snapshot-list-table.confirmText-delete', 'Delete')}
|
||||
onDismiss={() => setRemoveSnapshot(undefined)}
|
||||
onConfirm={() => {
|
||||
doRemoveSnapshot(removeSnapshot!);
|
||||
|
||||
+5
-2
@@ -139,8 +139,11 @@ export function InstallControlsButton({
|
||||
title={t('plugins.install-controls-button.title-uninstall-modal', 'Uninstall {{plugin}}', {
|
||||
plugin: plugin.name,
|
||||
})}
|
||||
body="Are you sure you want to uninstall this plugin?"
|
||||
confirmText="Confirm"
|
||||
body={t(
|
||||
'plugins.install-controls-button.uninstall-controls.body-uninstall-plugin',
|
||||
'Are you sure you want to uninstall this plugin?'
|
||||
)}
|
||||
confirmText={t('plugins.install-controls-button.uninstall-controls.confirmText-confirm', 'Confirm')}
|
||||
icon="exclamation-triangle"
|
||||
onConfirm={onUninstall}
|
||||
onDismiss={hideConfirmModal}
|
||||
|
||||
@@ -121,7 +121,11 @@ export const VersionInstallButton = ({
|
||||
<ConfirmModal
|
||||
isOpen={isModalOpen}
|
||||
title={t('plugins.catalog.versions.downgrade-title', 'Downgrade plugin version')}
|
||||
body={`${t('plugins.catalog.versions.confirmation-text-1', 'Are you really sure you want to downgrade to version')} ${version.version}? ${t('plugins.catalog.versions.confirmation-text-2', 'You should normally not be doing this')}`}
|
||||
body={t(
|
||||
'plugins.catalog.versions.confirmation-text',
|
||||
'Are you really sure you want to downgrade to version {{version}}? You should normally not be doing this',
|
||||
{ version: version.version }
|
||||
)}
|
||||
confirmText={t('plugins.catalog.versions.downgrade-confirm', 'Downgrade')}
|
||||
onConfirm={onConfirm}
|
||||
onDismiss={onDismiss}
|
||||
|
||||
@@ -228,8 +228,14 @@ export const ServiceAccountPageUnconnected = ({
|
||||
'serviceaccounts.service-account-page-unconnected.title-delete-service-account',
|
||||
'Delete service account'
|
||||
)}
|
||||
body="Are you sure you want to delete this service account?"
|
||||
confirmText="Delete service account"
|
||||
body={t(
|
||||
'serviceaccounts.service-account-page-unconnected.body-delete-service-account',
|
||||
'Are you sure you want to delete this service account?'
|
||||
)}
|
||||
confirmText={t(
|
||||
'serviceaccounts.service-account-page-unconnected.confirmText-delete-service-account',
|
||||
'Delete service account'
|
||||
)}
|
||||
onConfirm={handleServiceAccountDelete}
|
||||
onDismiss={showDeleteServiceAccountModal(false)}
|
||||
/>
|
||||
@@ -239,8 +245,14 @@ export const ServiceAccountPageUnconnected = ({
|
||||
'serviceaccounts.service-account-page-unconnected.title-disable-service-account',
|
||||
'Disable service account'
|
||||
)}
|
||||
body="Are you sure you want to disable this service account?"
|
||||
confirmText="Disable service account"
|
||||
body={t(
|
||||
'serviceaccounts.service-account-page-unconnected.body-disable-service-account',
|
||||
'Are you sure you want to disable this service account?'
|
||||
)}
|
||||
confirmText={t(
|
||||
'serviceaccounts.service-account-page-unconnected.confirmText-disable-service-account',
|
||||
'Disable service account'
|
||||
)}
|
||||
onConfirm={handleServiceAccountDisable}
|
||||
onDismiss={showDisableServiceAccountModal(false)}
|
||||
/>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { css } from '@emotion/css';
|
||||
import pluralize from 'pluralize';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { connect, ConnectedProps } from 'react-redux';
|
||||
|
||||
@@ -268,15 +267,25 @@ export const ServiceAccountsListPageUnconnected = ({
|
||||
<>
|
||||
<ConfirmModal
|
||||
isOpen={isRemoveModalOpen}
|
||||
body={`Are you sure you want to delete '${currentServiceAccount.name}'${
|
||||
body={
|
||||
!!currentServiceAccount.tokens
|
||||
? ` and ${currentServiceAccount.tokens} accompanying ${pluralize(
|
||||
'token',
|
||||
currentServiceAccount.tokens
|
||||
)}`
|
||||
: ''
|
||||
}?`}
|
||||
confirmText="Delete"
|
||||
? t(
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.body-delete',
|
||||
'Are you sure you want to delete {{serviceAccountName}} and {{count}} accompanying tokens?',
|
||||
{
|
||||
serviceAccountName: currentServiceAccount.name,
|
||||
count: currentServiceAccount.tokens,
|
||||
}
|
||||
)
|
||||
: t(
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.body-delete-with-tokens',
|
||||
'Are you sure you want to delete {{serviceAccountName}}?',
|
||||
{
|
||||
serviceAccountName: currentServiceAccount.name,
|
||||
}
|
||||
)
|
||||
}
|
||||
confirmText={t('serviceaccounts.service-accounts-list-page-unconnected.confirmText-delete', 'Delete')}
|
||||
title={t(
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.title-delete-service-account',
|
||||
'Delete service account'
|
||||
@@ -290,8 +299,15 @@ export const ServiceAccountsListPageUnconnected = ({
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.title-disable-service-account',
|
||||
'Disable service account'
|
||||
)}
|
||||
body={`Are you sure you want to disable '${currentServiceAccount.name}'?`}
|
||||
confirmText="Disable service account"
|
||||
body={t(
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.body-disable-service-account',
|
||||
"Are you sure you want to disable '{{accountToDisable}}'?",
|
||||
{ accountToDisable: currentServiceAccount.name }
|
||||
)}
|
||||
confirmText={t(
|
||||
'serviceaccounts.service-accounts-list-page-unconnected.confirmText-disable-service-account',
|
||||
'Disable service account'
|
||||
)}
|
||||
onConfirm={onDisable}
|
||||
onDismiss={onDisableModalClose}
|
||||
/>
|
||||
|
||||
@@ -85,7 +85,7 @@ export const ServiceAccountProfileRow = ({ label, value, inputType, disabled, on
|
||||
{onChange && (
|
||||
<ConfirmButton
|
||||
closeOnConfirm
|
||||
confirmText="Save"
|
||||
confirmText={t('serviceaccounts.service-account-profile-row.confirmText-save', 'Save')}
|
||||
onConfirm={onSave}
|
||||
onClick={onEditClick}
|
||||
onCancel={onCancelClick}
|
||||
|
||||
+22
-10
@@ -27,20 +27,32 @@ import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
import { DataFrameFieldsInfo, FilterByValueFilterEditor } from './FilterByValueFilterEditor';
|
||||
|
||||
const filterTypes: Array<SelectableValue<FilterByValueType>> = [
|
||||
{ label: 'Include', value: FilterByValueType.include },
|
||||
{ label: 'Exclude', value: FilterByValueType.exclude },
|
||||
];
|
||||
|
||||
const filterMatch: Array<SelectableValue<FilterByValueMatch>> = [
|
||||
{ label: 'Match all', value: FilterByValueMatch.all },
|
||||
{ label: 'Match any', value: FilterByValueMatch.any },
|
||||
];
|
||||
|
||||
export const FilterByValueTransformerEditor = (props: TransformerUIProps<FilterByValueTransformerOptions>) => {
|
||||
const { input, options, onChange } = props;
|
||||
const fieldsInfo = useFieldsInfo(input);
|
||||
|
||||
const filterTypes: Array<SelectableValue<FilterByValueType>> = [
|
||||
{
|
||||
label: t('transformers.filter-by-value-transformer-editor.filter-types.label.include', 'Include'),
|
||||
value: FilterByValueType.include,
|
||||
},
|
||||
{
|
||||
label: t('transformers.filter-by-value-transformer-editor.filter-types.label.exclude', 'Exclude'),
|
||||
value: FilterByValueType.exclude,
|
||||
},
|
||||
];
|
||||
|
||||
const filterMatch: Array<SelectableValue<FilterByValueMatch>> = [
|
||||
{
|
||||
label: t('transformers.filter-by-value-transformer-editor.filter-match.label.match-all', 'Match all'),
|
||||
value: FilterByValueMatch.all,
|
||||
},
|
||||
{
|
||||
label: t('transformers.filter-by-value-transformer-editor.filter-match.label.match-any', 'Match any'),
|
||||
value: FilterByValueMatch.any,
|
||||
},
|
||||
];
|
||||
|
||||
const onAddFilter = useCallback(() => {
|
||||
const frame = input[0];
|
||||
const field = frame.fields.find((f) => f.type !== FieldType.time);
|
||||
|
||||
@@ -13,7 +13,7 @@ import {
|
||||
getTimeZones,
|
||||
} from '@grafana/data';
|
||||
import { ConvertFieldTypeOptions, ConvertFieldTypeTransformerOptions } from '@grafana/data/internal';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { t, Trans } from '@grafana/i18n';
|
||||
import { Button, InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';
|
||||
import { allFieldTypeIconOptions, FieldNamePicker } from '@grafana/ui/internal';
|
||||
import { findField } from 'app/features/dimensions/utils';
|
||||
@@ -259,7 +259,9 @@ export const ConvertFieldTypeTransformerEditor = ({
|
||||
'Add a convert field type transformer'
|
||||
)}
|
||||
>
|
||||
{'Convert field type'}
|
||||
<Trans i18nKey="transformers.convert-field-type-transformer-editor.convert-field-type">
|
||||
Convert field type
|
||||
</Trans>
|
||||
</Button>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -18,23 +18,29 @@ import { Select, InlineFieldRow, InlineField } from '@grafana/ui';
|
||||
import { FieldNamePicker } from '@grafana/ui/internal';
|
||||
import { NumberInput } from 'app/core/components/OptionsUI/NumberInput';
|
||||
|
||||
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {
|
||||
settings: {
|
||||
width: 30,
|
||||
filter: (f) => f.type === FieldType.string,
|
||||
placeholderText: 'Select text field',
|
||||
noFieldsMessage: 'No text fields found',
|
||||
},
|
||||
name: '',
|
||||
id: '',
|
||||
editor: () => null,
|
||||
};
|
||||
|
||||
function FormatStringTransfomerEditor({
|
||||
input,
|
||||
options,
|
||||
onChange,
|
||||
}: TransformerUIProps<FormatStringTransformerOptions>) {
|
||||
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {
|
||||
settings: {
|
||||
width: 30,
|
||||
filter: (f) => f.type === FieldType.string,
|
||||
placeholderText: t(
|
||||
'transformers.format-string-transfomer-editor.field-name-picker-settings.placeholderText.select-text-field',
|
||||
'Select text field'
|
||||
),
|
||||
noFieldsMessage: t(
|
||||
'transformers.format-string-transfomer-editor.field-name-picker-settings.noFieldsMessage.no-text-fields-found',
|
||||
'No text fields found'
|
||||
),
|
||||
},
|
||||
name: '',
|
||||
id: '',
|
||||
editor: () => null,
|
||||
};
|
||||
|
||||
const onSelectField = useCallback(
|
||||
(value: string | undefined) => {
|
||||
const val = value ?? '';
|
||||
|
||||
@@ -20,21 +20,24 @@ import { extractFieldsTransformer } from './extractFields';
|
||||
import { fieldExtractors } from './fieldExtractors';
|
||||
import { ExtractFieldsOptions, FieldExtractorID, JSONPath } from './types';
|
||||
|
||||
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {
|
||||
settings: {
|
||||
width: 30,
|
||||
placeholderText: 'Select field',
|
||||
},
|
||||
name: '',
|
||||
id: '',
|
||||
editor: () => null,
|
||||
};
|
||||
|
||||
export const extractFieldsTransformerEditor = ({
|
||||
input,
|
||||
options = { delimiter: ',' },
|
||||
onChange,
|
||||
}: TransformerUIProps<ExtractFieldsOptions>) => {
|
||||
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {
|
||||
settings: {
|
||||
width: 30,
|
||||
placeholderText: t(
|
||||
'transformers.extract-fields-transformer-editor.field-name-picker-settings.placeholderText.select-field',
|
||||
'Select field'
|
||||
),
|
||||
},
|
||||
name: '',
|
||||
id: '',
|
||||
editor: () => null,
|
||||
};
|
||||
|
||||
const onPickSourceField = (source?: string) => {
|
||||
onChange({
|
||||
...options,
|
||||
|
||||
@@ -19,23 +19,29 @@ import { getTransformationContent } from '../docs/getTransformationContent';
|
||||
|
||||
import { FieldLookupOptions, fieldLookupTransformer } from './fieldLookup';
|
||||
|
||||
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {
|
||||
settings: {
|
||||
width: 30,
|
||||
filter: (f) => f.type === FieldType.string,
|
||||
placeholderText: 'Select text field',
|
||||
noFieldsMessage: 'No text fields found',
|
||||
},
|
||||
name: '',
|
||||
id: '',
|
||||
editor: () => null,
|
||||
};
|
||||
|
||||
const fieldLookupSettings = {
|
||||
settings: {},
|
||||
} as StandardEditorsRegistryItem<string, GazetteerPathEditorConfigSettings>;
|
||||
|
||||
export const FieldLookupTransformerEditor = ({ input, options, onChange }: TransformerUIProps<FieldLookupOptions>) => {
|
||||
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {
|
||||
settings: {
|
||||
width: 30,
|
||||
filter: (f) => f.type === FieldType.string,
|
||||
placeholderText: t(
|
||||
'transformers.field-lookup-transformer-editor.field-name-picker-settings.placeholderText.select-text-field',
|
||||
'Select text field'
|
||||
),
|
||||
noFieldsMessage: t(
|
||||
'transformers.field-lookup-transformer-editor.field-name-picker-settings.noFieldsMessage.no-text-fields-found',
|
||||
'No text fields found'
|
||||
),
|
||||
},
|
||||
name: '',
|
||||
id: '',
|
||||
editor: () => null,
|
||||
};
|
||||
|
||||
const onPickLookupField = useCallback(
|
||||
(value: string | undefined) => {
|
||||
onChange({
|
||||
|
||||
@@ -17,11 +17,13 @@ export function ConfirmDeleteModal({ varName, isOpen = false, onConfirm, onDismi
|
||||
isOpen={isOpen}
|
||||
onConfirm={onConfirm}
|
||||
onDismiss={onDismiss}
|
||||
body={`
|
||||
Are you sure you want to delete variable "${varName}"?
|
||||
`}
|
||||
body={t(
|
||||
'variables.confirm-delete-modal.body-delete-variable',
|
||||
'Are you sure you want to delete variable "{{variableToDelete}}"?',
|
||||
{ variableToDelete: varName }
|
||||
)}
|
||||
modalClass={styles.modal}
|
||||
confirmText="Delete"
|
||||
confirmText={t('variables.confirm-delete-modal.confirmText-delete', 'Delete')}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ export class VariableEditorEditorUnConnected extends PureComponent<Props, State>
|
||||
<VariableTextField
|
||||
value={this.props.editor.name}
|
||||
onChange={this.onNameChange}
|
||||
name="Name"
|
||||
name={t('variables.variable-editor-editor-un-connected.name-name', 'Name')}
|
||||
placeholder={t('variables.variable-editor-editor-un-connected.placeholder-variable-name', 'Variable name')}
|
||||
description={t(
|
||||
'variables.variable-editor-editor-un-connected.description-template-variable-characters',
|
||||
@@ -188,7 +188,7 @@ export class VariableEditorEditorUnConnected extends PureComponent<Props, State>
|
||||
/>
|
||||
|
||||
<VariableTextField
|
||||
name="Label"
|
||||
name={t('variables.variable-editor-editor-un-connected.name-label', 'Label')}
|
||||
description={t(
|
||||
'variables.variable-editor-editor-un-connected.description-optional-display-name',
|
||||
'Optional display name'
|
||||
@@ -199,7 +199,7 @@ export class VariableEditorEditorUnConnected extends PureComponent<Props, State>
|
||||
testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalLabelInputV2}
|
||||
/>
|
||||
<VariableTextAreaField
|
||||
name="Description"
|
||||
name={t('variables.variable-editor-un-connected.name-description', 'Description')}
|
||||
value={variable.description ?? ''}
|
||||
placeholder={t(
|
||||
'variables.variable-editor-editor-un-connected.placeholder-descriptive-text',
|
||||
|
||||
@@ -2,6 +2,7 @@ import { PropsWithChildren, useMemo } from 'react';
|
||||
|
||||
import { SelectableValue, VariableType } from '@grafana/data';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
import { t } from '@grafana/i18n';
|
||||
|
||||
import { VariableSelectField } from '../../dashboard-scene/settings/variables/components/VariableSelectField';
|
||||
import { getVariableTypes } from '../utils';
|
||||
@@ -17,7 +18,7 @@ export function VariableTypeSelect({ onChange, type }: PropsWithChildren<Props>)
|
||||
|
||||
return (
|
||||
<VariableSelectField
|
||||
name="Select variable type"
|
||||
name={t('variables.variable-type-select.name-select-variable-type', 'Select variable type')}
|
||||
value={value}
|
||||
options={options}
|
||||
onChange={onChange}
|
||||
|
||||
@@ -11,24 +11,60 @@ interface Props {
|
||||
testId?: string;
|
||||
}
|
||||
|
||||
const SORT_OPTIONS = [
|
||||
{ label: 'Disabled', value: VariableSort.disabled },
|
||||
{ label: 'Alphabetical (asc)', value: VariableSort.alphabeticalAsc },
|
||||
{ label: 'Alphabetical (desc)', value: VariableSort.alphabeticalDesc },
|
||||
{ label: 'Numerical (asc)', value: VariableSort.numericalAsc },
|
||||
{ label: 'Numerical (desc)', value: VariableSort.numericalDesc },
|
||||
{ label: 'Alphabetical (case-insensitive, asc)', value: VariableSort.alphabeticalCaseInsensitiveAsc },
|
||||
{ label: 'Alphabetical (case-insensitive, desc)', value: VariableSort.alphabeticalCaseInsensitiveDesc },
|
||||
{ label: 'Natural (asc)', value: VariableSort.naturalAsc },
|
||||
{ label: 'Natural (desc)', value: VariableSort.naturalDesc },
|
||||
];
|
||||
|
||||
export function QueryVariableSortSelect({ onChange, sort, testId }: PropsWithChildren<Props>) {
|
||||
const value = useMemo(() => SORT_OPTIONS.find((o) => o.value === sort) ?? SORT_OPTIONS[0], [sort]);
|
||||
const SORT_OPTIONS = useMemo(
|
||||
() => [
|
||||
{
|
||||
label: t('variables.query-variable-sort-select.sort_options.label.disabled', 'Disabled'),
|
||||
value: VariableSort.disabled,
|
||||
},
|
||||
{
|
||||
label: t('variables.query-variable-sort-select.sort_options.label.alphabetical-asc', 'Alphabetical (asc)'),
|
||||
value: VariableSort.alphabeticalAsc,
|
||||
},
|
||||
{
|
||||
label: t('variables.query-variable-sort-select.sort_options.label.alphabetical-desc', 'Alphabetical (desc)'),
|
||||
value: VariableSort.alphabeticalDesc,
|
||||
},
|
||||
{
|
||||
label: t('variables.query-variable-sort-select.sort_options.label.numerical-asc', 'Numerical (asc)'),
|
||||
value: VariableSort.numericalAsc,
|
||||
},
|
||||
{
|
||||
label: t('variables.query-variable-sort-select.sort_options.label.numerical-desc', 'Numerical (desc)'),
|
||||
value: VariableSort.numericalDesc,
|
||||
},
|
||||
{
|
||||
label: t(
|
||||
'variables.query-variable-sort-select.sort_options.label.alphabetical-caseinsensitive-asc',
|
||||
'Alphabetical (case-insensitive, asc)'
|
||||
),
|
||||
value: VariableSort.alphabeticalCaseInsensitiveAsc,
|
||||
},
|
||||
{
|
||||
label: t(
|
||||
'variables.query-variable-sort-select.sort_options.label.alphabetical-caseinsensitive-desc',
|
||||
'Alphabetical (case-insensitive, desc)'
|
||||
),
|
||||
value: VariableSort.alphabeticalCaseInsensitiveDesc,
|
||||
},
|
||||
{
|
||||
label: t('variables.query-variable-sort-select.sort_options.label.natural-asc', 'Natural (asc)'),
|
||||
value: VariableSort.naturalAsc,
|
||||
},
|
||||
{
|
||||
label: t('variables.query-variable-sort-select.sort_options.label.natural-desc', 'Natural (desc)'),
|
||||
value: VariableSort.naturalDesc,
|
||||
},
|
||||
],
|
||||
[]
|
||||
);
|
||||
|
||||
const value = useMemo(() => SORT_OPTIONS.find((o) => o.value === sort) ?? SORT_OPTIONS[0], [sort, SORT_OPTIONS]);
|
||||
|
||||
return (
|
||||
<VariableSelectField
|
||||
name="Sort"
|
||||
name={t('variables.query-variable-sort-select.name-sort', 'Sort')}
|
||||
description={t(
|
||||
'variables.query-variable-sort-select.description-values-variable',
|
||||
'How to sort the values of this variable'
|
||||
|
||||
@@ -30,7 +30,7 @@ export function TextBoxVariableEditor({ onPropChange, variable: { query } }: Pro
|
||||
</VariableLegend>
|
||||
<VariableTextField
|
||||
value={query}
|
||||
name="Default value"
|
||||
name={t('variables.text-box-variable-editor.name-default-value', 'Default value')}
|
||||
placeholder={t('variables.text-box-variable-editor.placeholder-default-value-if-any', 'default value, if any')}
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
|
||||
+4
-1
@@ -155,7 +155,10 @@ const AzureCheatSheet = (props: AzureCheatSheetProps) => {
|
||||
backspaceRemovesValue={true}
|
||||
placeholder={t('components.azure-cheat-sheet.placeholder-all-categories', 'All categories')}
|
||||
isClearable={true}
|
||||
noOptionsMessage="Unable to list all categories"
|
||||
noOptionsMessage={t(
|
||||
'components.azure-cheat-sheet.noOptionsMessage-unable-to-list-categories',
|
||||
'Unable to list all categories'
|
||||
)}
|
||||
formatCreateLabel={(input: string) => `Category: ${input}`}
|
||||
isSearchable={true}
|
||||
isMulti={true}
|
||||
|
||||
+2
-2
@@ -15,12 +15,12 @@ export function LogsManagement({ query, onQueryChange: onChange }: AzureQueryEdi
|
||||
<ConfirmModal
|
||||
isOpen={basicLogsAckOpen}
|
||||
title={t('components.logs-management.title-basic-logs-queries', 'Basic Logs Queries')}
|
||||
body="Are you sure you want to switch to Basic Logs?"
|
||||
body={t('components.logs-management.body-basic-logs-queries', 'Are you sure you want to switch to Basic Logs?')}
|
||||
description={t(
|
||||
'components.logs-management.description-basic-logs-queries',
|
||||
'Basic Logs queries incur cost based on the amount of data scanned.'
|
||||
)}
|
||||
confirmText="Confirm"
|
||||
confirmText={t('components.logs-management.confirmText-confirm', 'Confirm')}
|
||||
onConfirm={() => {
|
||||
setBasicLogsAckOpen(false);
|
||||
let updatedBasicLogsQuery = setBasicLogsQuery(query, true);
|
||||
|
||||
@@ -19,11 +19,6 @@ interface QueryTypeFieldProps {
|
||||
app: CoreApp | undefined;
|
||||
}
|
||||
|
||||
const EDITOR_MODES = [
|
||||
{ label: 'Builder', value: LogsEditorMode.Builder },
|
||||
{ label: 'KQL', value: LogsEditorMode.Raw },
|
||||
];
|
||||
|
||||
export const QueryHeader = ({
|
||||
query,
|
||||
onQueryChange,
|
||||
@@ -37,6 +32,11 @@ export const QueryHeader = ({
|
||||
const [showModeSwitchWarning, setShowModeSwitchWarning] = useState(false);
|
||||
const [pendingModeChange, setPendingModeChange] = useState<LogsEditorMode | null>(null);
|
||||
|
||||
const EDITOR_MODES = [
|
||||
{ label: t('components.query-header.editor-modes.label-builder', 'Builder'), value: LogsEditorMode.Builder },
|
||||
{ label: t('components.query-header.editor-modes.label-kql', 'KQL'), value: LogsEditorMode.Raw },
|
||||
];
|
||||
|
||||
const currentMode = query.azureLogAnalytics?.mode;
|
||||
|
||||
const queryTypes: Array<{ value: AzureQueryType; label: string }> = [
|
||||
@@ -113,10 +113,18 @@ export const QueryHeader = ({
|
||||
title={t('components.query-header.title-switch-mode', 'Switch editor mode?')}
|
||||
body={
|
||||
pendingModeChange === LogsEditorMode.Builder
|
||||
? 'Switching to Builder will discard your current KQL query and clear the KQL editor. Are you sure?'
|
||||
: 'Switching to KQL will discard your current builder settings. Are you sure?'
|
||||
? t(
|
||||
'components.query-header.body-switching-to-builder',
|
||||
'Switching to Builder will discard your current KQL query and clear the KQL editor. Are you sure?'
|
||||
)
|
||||
: t(
|
||||
'components.query-header.body-switching-to-kql',
|
||||
'Switching to KQL will discard your current builder settings. Are you sure?'
|
||||
)
|
||||
}
|
||||
confirmText={`Switch to ${pendingModeChange === LogsEditorMode.Builder ? 'Builder' : 'KQL'}`}
|
||||
confirmText={t('components.query-header.confirmText-switch-to', 'Switch to {{newMode}}', {
|
||||
newMode: pendingModeChange === LogsEditorMode.Builder ? 'Builder' : 'KQL',
|
||||
})}
|
||||
onConfirm={() => {
|
||||
if (pendingModeChange) {
|
||||
applyModeChange(pendingModeChange);
|
||||
|
||||
+10
@@ -52,6 +52,7 @@
|
||||
"button-use-query": "Use this query",
|
||||
"label-categories": "Categories",
|
||||
"label-query-results": "Query results: {{numResults}}",
|
||||
"noOptionsMessage-unable-to-list-categories": "Unable to list all categories",
|
||||
"placeholder-all-categories": "All categories",
|
||||
"placeholder-search-logs": "Search Logs queries",
|
||||
"text-loading": "Loading..."
|
||||
@@ -161,6 +162,8 @@
|
||||
"tooltip-limit": "Restrict the number of rows returned (default is 1000)."
|
||||
},
|
||||
"logs-management": {
|
||||
"body-basic-logs-queries": "Are you sure you want to switch to Basic Logs?",
|
||||
"confirmText-confirm": "Confirm",
|
||||
"description-basic-logs-queries": "Basic Logs queries incur cost based on the amount of data scanned.",
|
||||
"label-logs": "Logs",
|
||||
"title-basic-logs-queries": "Basic Logs Queries",
|
||||
@@ -194,8 +197,15 @@
|
||||
},
|
||||
"query-header": {
|
||||
"aria-label-kick-start": "Azure logs kick start your query button",
|
||||
"body-switching-to-builder": "Switching to Builder will discard your current KQL query and clear the KQL editor. Are you sure?",
|
||||
"body-switching-to-kql": "Switching to KQL will discard your current builder settings. Are you sure?",
|
||||
"button-kick-start-your-query": "Kick start your query",
|
||||
"button-run-query": "Run query",
|
||||
"confirmText-switch-to": "Switch to {{newMode}}",
|
||||
"editor-modes": {
|
||||
"label-builder": "Builder",
|
||||
"label-kql": "KQL"
|
||||
},
|
||||
"label-service": "Service",
|
||||
"placeholder-service": "Service...",
|
||||
"title-switch-mode": "Switch editor mode?"
|
||||
|
||||
@@ -138,7 +138,12 @@ export const StyleEditor = (props: Props) => {
|
||||
settings: {
|
||||
resourceType: 'icon',
|
||||
folderName: ResourceFolderName.Marker,
|
||||
placeholderText: hasTextLabel ? 'Select a symbol' : 'Select a symbol or add a text label',
|
||||
placeholderText: hasTextLabel
|
||||
? t('geomap.style-editor.placeholderText-select-symbol', 'Select a symbol')
|
||||
: t(
|
||||
'geomap.style-editor.placeholderText-select-symbol-or-add-text',
|
||||
'Select a symbol or add a text label'
|
||||
),
|
||||
placeholderValue: defaultStyleConfig.symbol.fixed,
|
||||
showSourceRadio: false,
|
||||
maxFiles,
|
||||
@@ -228,7 +233,12 @@ export const StyleEditor = (props: Props) => {
|
||||
settings: {
|
||||
resourceType: MediaType.Icon,
|
||||
folderName: ResourceFolderName.Marker,
|
||||
placeholderText: hasTextLabel ? 'Select a symbol' : 'Select a symbol or add a text label',
|
||||
placeholderText: hasTextLabel
|
||||
? t('geomap.style-editor.placeholderText-select-symbol', 'Select a symbol')
|
||||
: t(
|
||||
'geomap.style-editor.placeholderText-select-symbol-or-add-text',
|
||||
'Select a symbol or add a text label'
|
||||
),
|
||||
placeholderValue: defaultStyleConfig.symbol.fixed,
|
||||
showSourceRadio: false,
|
||||
maxFiles,
|
||||
|
||||
@@ -5,6 +5,7 @@ import { Stroke, Style } from 'ol/style';
|
||||
import Photo from 'ol-ext/style/Photo';
|
||||
|
||||
import { MapLayerRegistryItem, PanelData, GrafanaTheme2, EventBus, PluginState, FieldType, Field } from '@grafana/data';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { FrameGeometrySourceMode, MapLayerOptions } from '@grafana/schema';
|
||||
import { findField } from 'app/features/dimensions/utils';
|
||||
import { FrameVectorSource } from 'app/features/geo/utils/frameVectorSource';
|
||||
@@ -187,7 +188,7 @@ export const photosLayer: MapLayerRegistryItem<PhotoConfig> = {
|
||||
name: 'Image Source field',
|
||||
settings: {
|
||||
filter: (f: Field) => f.type === FieldType.string,
|
||||
noFieldsMessage: 'No string fields found',
|
||||
noFieldsMessage: t('geomap.photos-layer.noFieldsMessage-no-string-fields', 'No string fields found'),
|
||||
},
|
||||
})
|
||||
.addRadio({
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
"admin-feature-toggles-table": {
|
||||
"confirm-modal-body-1": "Some features are stable (GA) and enabled by default, whereas some are currently in their preliminary Beta phase, available for early adoption.",
|
||||
"confirm-modal-body-2": "We advise understanding the implications of each feature change before making modifications.",
|
||||
"confirmText-save-changes": "Save changes",
|
||||
"get-stage-cell": {
|
||||
"beta": "Beta",
|
||||
"content-general-availability": "General availability",
|
||||
@@ -96,14 +97,21 @@
|
||||
},
|
||||
"admin-orgs-table": {
|
||||
"aria-label-delete-org": "Delete org",
|
||||
"confirmText-delete": "Delete",
|
||||
"title-delete": "Delete"
|
||||
},
|
||||
"anon-users": {
|
||||
"not-found": "No anonymous users found."
|
||||
},
|
||||
"base-user-sessions": {
|
||||
"body-force-logout-from-all-devices": "Are you sure you want to force logout from all devices?",
|
||||
"confirmText-confirm-logout": "Confirm logout",
|
||||
"confirmText-force-logout": "Force logout",
|
||||
"title-force-logout-from-all-devices": "Force logout from all devices"
|
||||
},
|
||||
"change-org-button": {
|
||||
"confirmText-save": "Save"
|
||||
},
|
||||
"edit-org": {
|
||||
"access-denied": "You do not have permission to see users in this organization. To update this organization, contact your server administrator.",
|
||||
"heading": "Edit Organization",
|
||||
@@ -208,9 +216,11 @@
|
||||
"not-editable": "This user's role is not editable because it is synchronized from your auth provider. Refer to the <1>Grafana authentication docs</1> for details."
|
||||
},
|
||||
"org-users-table": {
|
||||
"body-delete": "Are you sure you want to delete user {{user}}?",
|
||||
"columns": {
|
||||
"aria-label-role": "Role"
|
||||
},
|
||||
"confirmText-delete": "Delete",
|
||||
"delete-aria-label": "Delete user: {{name}}",
|
||||
"title-delete": "Delete"
|
||||
},
|
||||
@@ -241,6 +251,9 @@
|
||||
"settings": {
|
||||
"info-description": "These system settings are defined in grafana.ini or custom.ini (or overridden in ENV variables). To change these you currently need to restart Grafana."
|
||||
},
|
||||
"un-themed-org-row": {
|
||||
"confirmText-confirm-removal": "Confirm removal"
|
||||
},
|
||||
"upgrade-info": {
|
||||
"title": "Enterprise license"
|
||||
},
|
||||
@@ -293,12 +306,17 @@
|
||||
},
|
||||
"user-permissions": {
|
||||
"change-button": "Change",
|
||||
"confirmText-change": "Change",
|
||||
"grafana-admin-key": "Grafana Admin",
|
||||
"grafana-admin-no": "No",
|
||||
"grafana-admin-yes": "Yes",
|
||||
"title": "Permissions"
|
||||
},
|
||||
"user-profile": {
|
||||
"body-delete": "Are you sure you want to delete this user?",
|
||||
"body-disable": "Are you sure you want to disable this user?",
|
||||
"confirmText-delete-user": "Delete user",
|
||||
"confirmText-disable-user": "Disable user",
|
||||
"delete-button": "Delete user",
|
||||
"disable-button": "Disable user",
|
||||
"edit-button": "Edit",
|
||||
@@ -312,6 +330,9 @@
|
||||
"title-delete-user": "Delete user",
|
||||
"title-disable-user": "Disable user"
|
||||
},
|
||||
"user-profile-row": {
|
||||
"confirmText-save": "Save"
|
||||
},
|
||||
"user-sessions": {
|
||||
"browser-column": "Browser and OS",
|
||||
"force-logout-all-button": "Force logout from all devices",
|
||||
@@ -461,6 +482,9 @@
|
||||
"label-muting-grouping-and-timings-optional": "Muting, grouping and timings (optional)",
|
||||
"title-muting-grouping-and-timings": "Muting, grouping, and timings"
|
||||
},
|
||||
"alert-manager-picker": {
|
||||
"noOptionsMessage-no-datasources-found": "No datasources found"
|
||||
},
|
||||
"alert-menu": {
|
||||
"copy-link": "Copy link",
|
||||
"duplicate": "Duplicate",
|
||||
@@ -550,6 +574,7 @@
|
||||
"view-configuration": "View configuration"
|
||||
},
|
||||
"alertmanager-config": {
|
||||
"confirmText-yes-reset-configuration": "Yes, reset configuration",
|
||||
"gma-manual-configuration-description": "The internal Grafana Alertmanager configuration cannot be manually changed. To change this configuration, edit the individual resources through the UI.",
|
||||
"gma-manual-configuration-is-not-supported": "Manual configuration changes not supported",
|
||||
"message": {
|
||||
@@ -564,11 +589,13 @@
|
||||
"title-resetting-alertmanager-configuration": "Resetting Alertmanager configuration"
|
||||
},
|
||||
"alertmanager-configuration-version-manager": {
|
||||
"body-restore-configuration-version-unsaved-changes": "Are you sure you want to restore the configuration to this version? All unsaved changes will be lost.",
|
||||
"columns": {
|
||||
"compare": "Compare",
|
||||
"restore": "Restore",
|
||||
"text-latest": "Latest"
|
||||
},
|
||||
"confirmText-yes-restore-configuration": "Yes, restore configuration",
|
||||
"loading": "Loading...",
|
||||
"no-previous-configurations": "No previous configurations",
|
||||
"this-might-take-a-while": "This might take a while...",
|
||||
@@ -848,8 +875,10 @@
|
||||
},
|
||||
"contact-point-header": {
|
||||
"aria-label-more-actions": "More actions for contact point \"{{contactPointName}}\"",
|
||||
"ariaLabel-delete": "Delete",
|
||||
"button-edit": "Edit",
|
||||
"button-view": "View",
|
||||
"export-ariaLabel-export": "Export",
|
||||
"export-label-export": "Export",
|
||||
"label-delete": "Delete",
|
||||
"label-manage-permissions": "Manage permissions",
|
||||
@@ -1384,6 +1413,7 @@
|
||||
"label-disable-resolved-message": "Disable resolved message"
|
||||
},
|
||||
"grafana-evaluation-behavior-step": {
|
||||
"loadingMessage-loading-groups": "Loading groups...",
|
||||
"message": {
|
||||
"must-be-a-positive-integer": "Must be a positive integer.",
|
||||
"must-enter-a-group-name": "Must enter a group name"
|
||||
@@ -1842,7 +1872,11 @@
|
||||
"other-data-sources": "Other data sources"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"noOptionsMessage-no-datasources-found": "No datasources found"
|
||||
},
|
||||
"mute-timing-actions-button": {
|
||||
"body-delete-mute-timing": "Are you sure you would like to delete \"{{muteTiming}}\"?"
|
||||
},
|
||||
"mute-timing-actions-buttons": {
|
||||
"text-disabled": "Disabled",
|
||||
@@ -2153,6 +2187,7 @@
|
||||
"query-and-expressions-step": {
|
||||
"add-query": "Add query",
|
||||
"body-queries-expressions-configured": "Create at least one query or expression to be alerted on",
|
||||
"confirmText-deactivate": "Deactivate",
|
||||
"expressions": "Expressions",
|
||||
"loading-data-sources": "Loading data sources...",
|
||||
"manipulate-returned-queries-other-operations": "Manipulate data returned from queries with math and other operations.",
|
||||
@@ -2220,6 +2255,7 @@
|
||||
"redirect-to-clone-rule": {
|
||||
"body-evaluation-group": "You will need to set a new evaluation group for the copied rule because the original one has been provisioned and cannot be used for rules created in the UI.",
|
||||
"body-not-provisioned": "The new rule will <1>not</1> be marked as a provisioned rule.",
|
||||
"confirmText-copy": "Copy",
|
||||
"title-copy-provisioned-alert-rule": "Copy provisioned alert rule"
|
||||
},
|
||||
"redirect-to-rule-viewer": {
|
||||
@@ -2766,6 +2802,9 @@
|
||||
"existing-templates-selector-placeholder-choose-notification-template": "Choose notification template",
|
||||
"loading": "Loading...",
|
||||
"template-options": {
|
||||
"ariaLabel": {
|
||||
"select-notification-template": "Select notification template"
|
||||
},
|
||||
"label": {
|
||||
"select-notification-template": "Select notification template"
|
||||
}
|
||||
@@ -2792,6 +2831,8 @@
|
||||
},
|
||||
"templates-table": {
|
||||
"actions": "Actions",
|
||||
"body-delete-template-group": "Are you sure you want to delete template group \"{{template}}\"?",
|
||||
"confirmText-yes-delete": "Yes, delete",
|
||||
"no-templates-defined": "No templates defined.",
|
||||
"template-group": "Template group",
|
||||
"title-delete-template-group": "Delete template group"
|
||||
@@ -2919,6 +2960,11 @@
|
||||
"title-delete-contact-point": "Delete contact point"
|
||||
}
|
||||
},
|
||||
"use-delete-modal": {
|
||||
"modal": {
|
||||
"confirmText-yes-delete": "Yes, delete"
|
||||
}
|
||||
},
|
||||
"use-delete-policy-modal": {
|
||||
"modal-element": {
|
||||
"title-delete-notification-policy": "Delete notification policy"
|
||||
@@ -3075,7 +3121,8 @@
|
||||
"annotation-field-mapper": {
|
||||
"annotation": "Annotation",
|
||||
"first-value": "First value",
|
||||
"from": "From"
|
||||
"from": "From",
|
||||
"noOptionsMessage-unknown-field-names": "Unknown field names"
|
||||
},
|
||||
"empty-state": {
|
||||
"button-title": "Add annotation query",
|
||||
@@ -3209,7 +3256,7 @@
|
||||
"team-ids-github": "Integer list of Team IDs.",
|
||||
"team-ids-label": "Team IDs",
|
||||
"team-ids-numbers": "Team IDs must be numbers.",
|
||||
"team-ids-other": "String list of Team Ids.",
|
||||
"team-ids-other": "String list of Team IDs.",
|
||||
"team-ids-placeholder": "Enter Team IDs and press Enter to add",
|
||||
"teams-url-description": "The URL used to query for Team IDs. If not set, the default value is /teams.",
|
||||
"teams-url-description-oauth": "If you configure \"{{ teamsURLLabel }}\", you must also configure \"{{ teamIDsAttributePathLabel }}\".",
|
||||
@@ -3253,6 +3300,7 @@
|
||||
"additional-actions-menu": {
|
||||
"label-reset-to-default-values": "Reset to default values"
|
||||
},
|
||||
"confirmText-reset": "Reset",
|
||||
"disable": "Disable",
|
||||
"disabling": "Disabling...",
|
||||
"discard": "Discard",
|
||||
@@ -4180,8 +4228,8 @@
|
||||
}
|
||||
},
|
||||
"dashbaord-scene": {
|
||||
"interval-variable-form": {
|
||||
"description-auto-option": "Dynamically calculates interval by dividing time range by the count specified"
|
||||
"variable-editor-form": {
|
||||
"run-query": "Run query"
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
@@ -4343,6 +4391,9 @@
|
||||
},
|
||||
"dash-nav": {
|
||||
"on-open-snapshot-original": {
|
||||
"confirmText": {
|
||||
"proceed": "Proceed"
|
||||
},
|
||||
"title": {
|
||||
"proceed-to-external-site": "Proceed to external site?"
|
||||
}
|
||||
@@ -4557,6 +4608,13 @@
|
||||
"editable": "Editable",
|
||||
"readonly": "Read-only"
|
||||
}
|
||||
},
|
||||
"graph_tooltip_options": {
|
||||
"label": {
|
||||
"default": "Default",
|
||||
"shared-crosshair": "Shared crosshair",
|
||||
"shared-tooltip": "Shared tooltip"
|
||||
}
|
||||
}
|
||||
},
|
||||
"get-debug-dashboard": {
|
||||
@@ -4861,6 +4919,7 @@
|
||||
},
|
||||
"revert-dashboard-modal": {
|
||||
"body-restore-version": "Are you sure you want to restore the dashboard to version {{version}}? All unsaved changes will be lost.",
|
||||
"confirmText-restore-version": "Yes, restore to version {{version}}",
|
||||
"title-restore-version": "Restore version"
|
||||
},
|
||||
"row-options-button": {
|
||||
@@ -4911,6 +4970,9 @@
|
||||
"title-not-unique": "This title is not unique"
|
||||
}
|
||||
},
|
||||
"save-dashboard": {
|
||||
"message-dashboard-saved": "Dashboard saved"
|
||||
},
|
||||
"save-dashboard-as-button": {
|
||||
"save-as": "Save as"
|
||||
},
|
||||
@@ -4945,6 +5007,7 @@
|
||||
"save-dashboard-error-proxy": {
|
||||
"body-name-exists": "A dashboard with the same name in selected folder already exists.<1></1><2>Would you still like to save this dashboard?</2>",
|
||||
"body-version-mismatch": "Someone else has updated this dashboard<1></1><2>Would you still like to save this dashboard?</2>",
|
||||
"confirmText-save-and-overwrite": "Save and overwrite",
|
||||
"title-name-exists": "Conflict",
|
||||
"title-version-mismatch": "Conflict"
|
||||
},
|
||||
@@ -5141,7 +5204,9 @@
|
||||
"label-apply-transformation-to": "Apply transformation to"
|
||||
},
|
||||
"transformation-operation-row": {
|
||||
"body-delete": "Note that removing one transformation may break others. If there is only a single transformation, you will go back to the main selection screen.",
|
||||
"render-actions": {
|
||||
"confirmText-delete": "Delete",
|
||||
"title-debug": "Debug",
|
||||
"title-disable-transformation": "Disable transformation",
|
||||
"title-filter": "Filter",
|
||||
@@ -5163,10 +5228,14 @@
|
||||
"show-images": "Show images",
|
||||
"title-add-another-transformation": "Add another transformation"
|
||||
},
|
||||
"un-theme-transformations-editor": {
|
||||
"body-delete-all-transformations": "By deleting all transformations, you will go back to the main selection screen."
|
||||
},
|
||||
"un-themed-transformations-editor": {
|
||||
"actions": {
|
||||
"add-another-transformation": "Add another transformation"
|
||||
},
|
||||
"confirmText-delete-all": "Delete all",
|
||||
"delete-all-transformations": "Delete all transformations",
|
||||
"title-delete-all-transformations": "Delete all transformations?",
|
||||
"tooltip-clear-search": "Clear search",
|
||||
@@ -5203,6 +5272,7 @@
|
||||
"version-history-table": {
|
||||
"aria-label-toggle-selection": "Toggle selection of version {{version}}",
|
||||
"date": "Date",
|
||||
"name-latest": "Latest",
|
||||
"notes": "Notes",
|
||||
"restore": "Restore",
|
||||
"updated-by": "Updated by",
|
||||
@@ -5279,7 +5349,8 @@
|
||||
"description-enables-users-custom-values": "Enables users to add custom values to the list",
|
||||
"description-provide-dimensions-as-csv-dimension-name-dimension-id": "Provide dimensions as CSV: {{name}}, {{value}}",
|
||||
"label-data-source": "Data source",
|
||||
"label-use-static-key-dimensions": "Use static key dimensions"
|
||||
"label-use-static-key-dimensions": "Use static key dimensions",
|
||||
"name-allow-custom-values": "Allow custom values"
|
||||
},
|
||||
"add-to-dashboard": {
|
||||
"message": {
|
||||
@@ -5352,6 +5423,9 @@
|
||||
}
|
||||
},
|
||||
"config-public-dashboard": {
|
||||
"confirmText": {
|
||||
"revoke-public-url": "Revoke public URL"
|
||||
},
|
||||
"title": {
|
||||
"revoke-public-url": "Revoke public URL"
|
||||
}
|
||||
@@ -5363,6 +5437,7 @@
|
||||
},
|
||||
"custom-variable-form": {
|
||||
"custom-options": "Custom options",
|
||||
"name-values-separated-comma": "Values separated by comma",
|
||||
"selection-options": "Selection options"
|
||||
},
|
||||
"dashboard-edit-pane-renderer": {
|
||||
@@ -5381,6 +5456,12 @@
|
||||
"label-type": "Type",
|
||||
"label-url": "URL",
|
||||
"label-with-tags": "With tags",
|
||||
"link-type-options": {
|
||||
"label": {
|
||||
"dashboards": "Dashboards",
|
||||
"link": "Link"
|
||||
}
|
||||
},
|
||||
"placeholder-open-dashboard": "Open dashboard"
|
||||
},
|
||||
"dashboard-link-list": {
|
||||
@@ -5427,6 +5508,8 @@
|
||||
"data-source-options": "Data source options",
|
||||
"description-instance-name-filter": "Regex filter for which data source instances to choose from in the variable value list. Leave empty for all.",
|
||||
"example-instance-name-filter": "Example: <codeExample />",
|
||||
"name-instance-name-filter": "Instance name filter",
|
||||
"name-type": "Type",
|
||||
"selection-options": "Selection options"
|
||||
},
|
||||
"default-grid-layout-manager": {
|
||||
@@ -5472,6 +5555,21 @@
|
||||
"empty-transformations-message": {
|
||||
"add-transformation": "Add transformation"
|
||||
},
|
||||
"general-settings-edit-view": {
|
||||
"editable_options": {
|
||||
"label": {
|
||||
"editable": "Editable",
|
||||
"readonly": "Read-only"
|
||||
}
|
||||
},
|
||||
"graph_tooltip_options": {
|
||||
"label": {
|
||||
"default": "Default",
|
||||
"shared-crosshair": "Shared crosshair",
|
||||
"shared-tooltip": "Shared tooltip"
|
||||
}
|
||||
}
|
||||
},
|
||||
"get-edit-options": {
|
||||
"title": {
|
||||
"column-options": "Column options",
|
||||
@@ -5502,7 +5600,8 @@
|
||||
"description-provide-dimensions-as-csv-dimension-name-dimension-id": "Provide dimensions as CSV: {{name}}, {{value}}",
|
||||
"group-by-options": "Group by options",
|
||||
"label-data-source": "Data source",
|
||||
"label-use-static-group-by-dimensions": "Use static group dimensions"
|
||||
"label-use-static-group-by-dimensions": "Use static group dimensions",
|
||||
"name-allow-custom-values": "Allow custom values"
|
||||
},
|
||||
"help-wizard": {
|
||||
"copy-to-clipboard": "Copy to clipboard",
|
||||
@@ -5538,9 +5637,14 @@
|
||||
"apply": "Apply"
|
||||
},
|
||||
"interval-variable-form": {
|
||||
"description-auto-option": "Dynamically calculates interval by dividing time range by the count specified",
|
||||
"description-calculated-value-below-threshold": "The calculated value will not go below this threshold",
|
||||
"description-step-count": "How many times the current time range should be divided to calculate the value",
|
||||
"interval-options": "Interval options"
|
||||
"interval-options": "Interval options",
|
||||
"name-auto-option": "Auto option",
|
||||
"name-min-interval": "Min interval",
|
||||
"name-step-count": "Step count",
|
||||
"name-values": "Values"
|
||||
},
|
||||
"json-model-edit-view": {
|
||||
"cancel-button": {
|
||||
@@ -5565,6 +5669,9 @@
|
||||
"title-name-already-exists": "Name already exists"
|
||||
},
|
||||
"on-open-snapshot-original-dashboard": {
|
||||
"confirmText": {
|
||||
"proceed": "Proceed"
|
||||
},
|
||||
"title": {
|
||||
"proceed-to-external-site": "Proceed to external site?"
|
||||
}
|
||||
@@ -5600,6 +5707,8 @@
|
||||
},
|
||||
"panel-data-transformations-tab-rendered": {
|
||||
"add-another-transformation": "Add another transformation",
|
||||
"body-delete-all-transformations": "By deleting all transformations, you will go back to the main selection screen.",
|
||||
"confirmText-delete-all": "Delete all",
|
||||
"delete-all-transformations": "Delete all transformations",
|
||||
"title-delete-all-transformations": "Delete all transformations?"
|
||||
},
|
||||
@@ -5653,6 +5762,7 @@
|
||||
"description-optional": "Optional, if you want to extract part of a series name or metric node segment.",
|
||||
"label-data-source": "Data source",
|
||||
"label-target-data-source": "Target data source",
|
||||
"name-regex": "Regex",
|
||||
"query-options": "Query options",
|
||||
"selection-options": "Selection options"
|
||||
},
|
||||
@@ -5667,6 +5777,7 @@
|
||||
},
|
||||
"revert-dashboard-modal": {
|
||||
"body-restore-version": "Are you sure you want to restore the dashboard to version {{version}}? All unsaved changes will be lost.",
|
||||
"confirmText-restore-version": "Yes, restore to version {{version}}",
|
||||
"title-restore-version": "Restore version"
|
||||
},
|
||||
"save-button": {
|
||||
@@ -5760,7 +5871,11 @@
|
||||
"selection-options-form": {
|
||||
"description-enables-multiple-values-selected": "Enables multiple values to be selected at the same time",
|
||||
"description-enables-option-include-variables": "Enables an option to include all values",
|
||||
"description-enables-users-custom-values": "Enables users to add custom values to the list"
|
||||
"description-enables-users-custom-values": "Enables users to add custom values to the list",
|
||||
"name-allow-custom-values": "Allow custom values",
|
||||
"name-custom-all-value": "Custom all value",
|
||||
"name-include-all-option": "Include All option",
|
||||
"name-multi-value": "Multi-value"
|
||||
},
|
||||
"share-button": {
|
||||
"aria-label-sharedropdownmenu": "Toggle share menu"
|
||||
@@ -5780,6 +5895,9 @@
|
||||
"copy-to-clipboard-failed": "Copy to clipboard failed"
|
||||
}
|
||||
},
|
||||
"text-box-variable": {
|
||||
"name-default-value": "Default value"
|
||||
},
|
||||
"text-box-variable-form": {
|
||||
"placeholder-default-value-if-any": "(optional)",
|
||||
"text-options": "Text options"
|
||||
@@ -5803,6 +5921,8 @@
|
||||
}
|
||||
},
|
||||
"unlink-modal": {
|
||||
"body-unlink-panel": "If you unlink this panel, you will be able to edit it without affecting any other dashboards. However, once you make a change you will not be able to revert to its original reusable panel.",
|
||||
"confirmText-yes-unlink": "Yes, unlink",
|
||||
"title-really-unlink-panel": "Do you really want to unlink this panel?"
|
||||
},
|
||||
"unsaved-changes-modal": {
|
||||
@@ -5819,6 +5939,9 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"use-save-dashboard": {
|
||||
"message-dashboard-saved": "Dashboard saved"
|
||||
},
|
||||
"variable-check-indicator": {
|
||||
"aria-label-variable-referenced-dashboard": "This variable is not referenced by any variable or dashboard.",
|
||||
"aria-label-variable-referenced-other-variables-dashboard": "This variable is referenced by other variables or dashboard.",
|
||||
@@ -5828,10 +5951,16 @@
|
||||
"variable-editor-form": {
|
||||
"aria-label-variable-editor-form": "Variable editor form",
|
||||
"back-to-list": "Back to list",
|
||||
"confirmText": {
|
||||
"delete-variable": "Delete variable"
|
||||
},
|
||||
"delete": "Delete",
|
||||
"description-optional-display-name": "Optional display name",
|
||||
"description-template-variable-characters": "The name of the template variable. (Max. 50 characters)",
|
||||
"general": "General",
|
||||
"name-description": "Description",
|
||||
"name-label": "Label",
|
||||
"name-name": "Name",
|
||||
"placeholder-descriptive-text": "Descriptive text",
|
||||
"placeholder-label-name": "Label name",
|
||||
"placeholder-variable-name": "Variable name",
|
||||
@@ -5846,13 +5975,25 @@
|
||||
"variable": "Variable"
|
||||
},
|
||||
"variable-editor-list-row": {
|
||||
"body-delete-variable": "Are you sure you want to delete: {{variable}}?",
|
||||
"confirmText-delete-variable": "Delete variable",
|
||||
"title-delete-variable": "Delete variable",
|
||||
"tooltip-duplicate-variable": "Duplicate variable",
|
||||
"tooltip-remove-variable": "Remove variable"
|
||||
},
|
||||
"variable-hide-select": {
|
||||
"hide_options": {
|
||||
"label": {
|
||||
"label": "Label",
|
||||
"nothing": "Nothing",
|
||||
"variable": "Variable"
|
||||
}
|
||||
},
|
||||
"label": "Hide"
|
||||
},
|
||||
"variable-type-select": {
|
||||
"name-variable-type": "Variable type"
|
||||
},
|
||||
"variable-usages-button": {
|
||||
"title-show-usages": "Showing usages for: {{variableId}}",
|
||||
"tooltip-show-usages": "Show usages"
|
||||
@@ -5879,6 +6020,7 @@
|
||||
"version-history-table": {
|
||||
"aria-label-toggle-selection": "Toggle selection of version {{version}}",
|
||||
"date": "Date",
|
||||
"name-latest": "Latest",
|
||||
"notes": "Notes",
|
||||
"restore": "Restore",
|
||||
"updated-by": "Updated by",
|
||||
@@ -6266,7 +6408,8 @@
|
||||
}
|
||||
},
|
||||
"color-dimension-editor": {
|
||||
"label-fixed-color": "Fixed color"
|
||||
"label-fixed-color": "Fixed color",
|
||||
"noOptionsMessage-no-fields-found": "No fields found"
|
||||
},
|
||||
"file-dropzone-custom-children": {
|
||||
"upload": "Upload"
|
||||
@@ -6304,6 +6447,7 @@
|
||||
},
|
||||
"label-limit": "Limit",
|
||||
"label-value": "Value",
|
||||
"noOptionsMessage-no-fields-found": "No fields found",
|
||||
"scalar-options": {
|
||||
"description-clamped": "Use field values, clamped to max and min",
|
||||
"description-mod": "Use field values, mod from max",
|
||||
@@ -6319,7 +6463,8 @@
|
||||
},
|
||||
"label-max": "Max",
|
||||
"label-min": "Min",
|
||||
"label-value": "Value"
|
||||
"label-value": "Value",
|
||||
"noOptionsMessage-no-fields-found": "No fields found"
|
||||
},
|
||||
"text-dimension-editor": {
|
||||
"description-field": "Display field value",
|
||||
@@ -6891,6 +7036,8 @@
|
||||
"aria-label-select-service-name-operator": "Select service name operator",
|
||||
"aria-label-select-span-name": "Select span name",
|
||||
"aria-label-select-span-name-operator": "Select span name operator",
|
||||
"ariaLabel-select-max-span-duration": "Select max span duration",
|
||||
"ariaLabel-select-min-span-duration": "Select min span duration",
|
||||
"label-collapse": "Span Filters",
|
||||
"label-duration": "Duration",
|
||||
"label-service-name": "Service name",
|
||||
@@ -6961,6 +7108,8 @@
|
||||
"split-widen": "Widen pane"
|
||||
},
|
||||
"trace-page-actions": {
|
||||
"ariaLabel-copy-trace-id": "Copy Trace ID",
|
||||
"ariaLabel-export-trace": "Export Trace",
|
||||
"give-feedback": "Give feedback",
|
||||
"label-copied": "Copied!",
|
||||
"label-export": "Export",
|
||||
@@ -7098,6 +7247,7 @@
|
||||
},
|
||||
"folder-filter": {
|
||||
"clear-folder-button": "Clear folders",
|
||||
"noOptionsMessage-no-folders-found": "No folders found",
|
||||
"select-aria-label": "Folder filter",
|
||||
"select-placeholder": "Filter by folder"
|
||||
},
|
||||
@@ -7289,6 +7439,9 @@
|
||||
"name-show-scale": "Show scale",
|
||||
"name-show-zoom": "Show zoom control",
|
||||
"name-tooltip": "Tooltip",
|
||||
"photos-layer": {
|
||||
"noFieldsMessage-no-string-fields": "No string fields found"
|
||||
},
|
||||
"plugin": {
|
||||
"basemap-layer-configured-server-admin": "The basemap layer is configured by the server admin."
|
||||
},
|
||||
@@ -7312,6 +7465,8 @@
|
||||
"label-text-label": "Text label",
|
||||
"label-x-offset": "X offset",
|
||||
"label-y-offset": "Y offset",
|
||||
"placeholderText-select-symbol": "Select a symbol",
|
||||
"placeholderText-select-symbol-or-add-text": "Select a symbol or add a text label",
|
||||
"vertical-align-options": {
|
||||
"label-bottom": "Bottom",
|
||||
"label-center": "Center",
|
||||
@@ -7585,7 +7740,8 @@
|
||||
"aria-label-selected-color": "{{colorLabel}} color"
|
||||
},
|
||||
"confirm-button": {
|
||||
"cancel": "Cancel"
|
||||
"cancel": "Cancel",
|
||||
"confirmText-delete": "Delete"
|
||||
},
|
||||
"confirm-content": {
|
||||
"placeholder": "Type \"{{confirmPromptText}}\" to confirm"
|
||||
@@ -7767,6 +7923,8 @@
|
||||
},
|
||||
"panel-chrome": {
|
||||
"aria-label-toggle-collapse": "toggle collapse panel",
|
||||
"ariaLabel-panel-loading": "Panel loading bar",
|
||||
"ariaLabel-panel-status": "Panel status",
|
||||
"tooltip-cancel": "Cancel query",
|
||||
"tooltip-cancel-loading": "Cancel query",
|
||||
"tooltip-stop-streaming": "Stop streaming",
|
||||
@@ -7934,6 +8092,12 @@
|
||||
"footer-click-to-action": "Click to {{actionTitle}}",
|
||||
"footer-click-to-navigate": "Click to open {{linkTitle}}",
|
||||
"timestamp": "Timestamp"
|
||||
},
|
||||
"week-start-picker": {
|
||||
"weekStarts-label-default": "Default",
|
||||
"weekStarts-label-monday": "Monday",
|
||||
"weekStarts-label-saturday": "Saturday",
|
||||
"weekStarts-label-sunday": "Sunday"
|
||||
}
|
||||
},
|
||||
"graph": {
|
||||
@@ -8312,6 +8476,10 @@
|
||||
"add-library-panel-modal": {
|
||||
"title-create-library-panel": "Create library panel"
|
||||
},
|
||||
"change-library-panel-modal": {
|
||||
"confirmText-change": "Change",
|
||||
"confirmText-replace": "Replace"
|
||||
},
|
||||
"confirm": {
|
||||
"delete-panel": "Do you want to delete this panel?"
|
||||
},
|
||||
@@ -8756,6 +8924,8 @@
|
||||
"updated-on": "Updated on"
|
||||
},
|
||||
"snapshot-list-table": {
|
||||
"body-delete": "Are you sure you want to delete '{{snapshotToRemove}}'?",
|
||||
"confirmText-delete": "Delete",
|
||||
"title-delete": "Delete"
|
||||
},
|
||||
"unthemed-dashboard-import": {
|
||||
@@ -8767,6 +8937,9 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"metric-select": {
|
||||
"noOptionsMessage-no-options-found": "No options found"
|
||||
},
|
||||
"migrate-to-cloud": {
|
||||
"build-snapshot": {
|
||||
"description": "This tool can migrate some resources from this installation to your cloud stack. To get started, you'll need to create a snapshot of this installation. Creating a snapshot typically takes less than two minutes. The snapshot is stored alongside this Grafana installation.",
|
||||
@@ -9465,7 +9638,7 @@
|
||||
"marker": {
|
||||
"100-node-count": ">100 nodes",
|
||||
"aria-label-hidden-marker": "Hidden nodes marker: {{marker}}",
|
||||
"node-count_one": "{{count}} node",
|
||||
"node-count_one": "{{count}} nodes",
|
||||
"node-count_other": "{{count}} nodes"
|
||||
},
|
||||
"node": {
|
||||
@@ -9475,10 +9648,10 @@
|
||||
"aria-label-layered-layout-performance-warning": "Layered layout performance warning",
|
||||
"aria-label-nodes-hidden-warning": "Nodes hidden warning",
|
||||
"computing-layout": "Computing layout",
|
||||
"hidden-nodes_one": "<0></0> {{count}} node is hidden for performance reasons.",
|
||||
"hidden-nodes_one": "<0></0> {{count}} nodes are hidden for performance reasons.",
|
||||
"hidden-nodes_other": "<0></0> {{count}} nodes are hidden for performance reasons.",
|
||||
"no-data": "No data",
|
||||
"processed-nodes_one": "<0></0> Layered layout may be slow with {{count}} node.",
|
||||
"processed-nodes_one": "<0></0> Layered layout may be slow with {{count}} nodes.",
|
||||
"processed-nodes_other": "<0></0> Layered layout may be slow with {{count}} nodes."
|
||||
},
|
||||
"node-graph-panel": {
|
||||
@@ -9605,6 +9778,7 @@
|
||||
}
|
||||
},
|
||||
"org-picker": {
|
||||
"noOptionsMessage-no-organizations-found": "No organizations found",
|
||||
"select-placeholder": "Select organization"
|
||||
},
|
||||
"page": {
|
||||
@@ -9871,8 +10045,7 @@
|
||||
"update-status-text": "plugins updated"
|
||||
},
|
||||
"versions": {
|
||||
"confirmation-text-1": "Are you really sure you want to downgrade to version",
|
||||
"confirmation-text-2": "You should normally not be doing this",
|
||||
"confirmation-text": "Are you really sure you want to downgrade to version {{version}}? You should normally not be doing this",
|
||||
"downgrade-confirm": "Downgrade",
|
||||
"downgrade-title": "Downgrade plugin version"
|
||||
}
|
||||
@@ -9963,7 +10136,11 @@
|
||||
"updating": "Updating"
|
||||
},
|
||||
"install-controls-button": {
|
||||
"title-uninstall-modal": "Uninstall {{plugin}}"
|
||||
"title-uninstall-modal": "Uninstall {{plugin}}",
|
||||
"uninstall-controls": {
|
||||
"body-uninstall-plugin": "Are you sure you want to uninstall this plugin?",
|
||||
"confirmText-confirm": "Confirm"
|
||||
}
|
||||
},
|
||||
"install-controls-warning": {
|
||||
"body-not-published": "This plugin is not published to <2>grafana.com/plugins</2> and can't be managed via the catalog.",
|
||||
@@ -10999,6 +11176,7 @@
|
||||
}
|
||||
},
|
||||
"service-account-picker": {
|
||||
"noOptionsMessage-no-service-accounts-found": "No service accounts found",
|
||||
"select-aria-label": "Service account picker",
|
||||
"select-placeholder": "Start typing to search for service accounts"
|
||||
},
|
||||
@@ -11044,6 +11222,10 @@
|
||||
},
|
||||
"service-account-page-unconnected": {
|
||||
"add-service-account-token": "Add service account token",
|
||||
"body-delete-service-account": "Are you sure you want to delete this service account?",
|
||||
"body-disable-service-account": "Are you sure you want to disable this service account?",
|
||||
"confirmText-delete-service-account": "Delete service account",
|
||||
"confirmText-disable-service-account": "Disable service account",
|
||||
"delete-service-account": "Delete service account",
|
||||
"disable-service-account": "Disable service account",
|
||||
"enable-service-account": "Enable service account",
|
||||
@@ -11070,6 +11252,7 @@
|
||||
"used-by": "Used by"
|
||||
},
|
||||
"service-account-profile-row": {
|
||||
"confirmText-save": "Save",
|
||||
"edit": "Edit"
|
||||
},
|
||||
"service-account-role-row": {
|
||||
@@ -11083,6 +11266,12 @@
|
||||
},
|
||||
"service-accounts-list-page-unconnected": {
|
||||
"add-service-account": "Add service account",
|
||||
"body-delete_one": "Are you sure you want to delete {{serviceAccountName}} and {{count}} accompanying tokens?",
|
||||
"body-delete_other": "Are you sure you want to delete {{serviceAccountName}} and {{count}} accompanying tokens?",
|
||||
"body-delete-with-tokens": "Are you sure you want to delete {{serviceAccountName}}?",
|
||||
"body-disable-service-account": "Are you sure you want to disable '{{accountToDisable}}'?",
|
||||
"confirmText-delete": "Delete",
|
||||
"confirmText-disable-service-account": "Disable 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",
|
||||
@@ -11478,7 +11667,7 @@
|
||||
"label-never": "Never"
|
||||
},
|
||||
"status-history-panel": {
|
||||
"too-many-points_one": "Too many points to visualize properly. <1></1>Update the query to return fewer points. <3></3>({{count}} point received)",
|
||||
"too-many-points_one": "Too many points to visualize properly. <1></1>Update the query to return fewer points. <3></3>({{count}} points received)",
|
||||
"too-many-points_other": "Too many points to visualize properly. <1></1>Update the query to return fewer points. <3></3>({{count}} points received)"
|
||||
}
|
||||
},
|
||||
@@ -11623,6 +11812,7 @@
|
||||
"tag-option-label": "Tag option"
|
||||
},
|
||||
"team-picker": {
|
||||
"noOptionsMessage-no-teams-found": "No teams found",
|
||||
"select-aria-label": "Team picker",
|
||||
"select-placeholder": "Select a team"
|
||||
},
|
||||
@@ -11948,6 +12138,7 @@
|
||||
"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",
|
||||
"convert-field-type": "Convert field type",
|
||||
"label": {
|
||||
"browser": "Browser",
|
||||
"utc": "UTC"
|
||||
@@ -11990,6 +12181,11 @@
|
||||
"remove-enum-row-tooltip-delete": "Delete"
|
||||
},
|
||||
"extract-fields-transformer-editor": {
|
||||
"field-name-picker-settings": {
|
||||
"placeholderText": {
|
||||
"select-field": "Select field"
|
||||
}
|
||||
},
|
||||
"label-delimiter": "Delimiter",
|
||||
"label-format": "Format",
|
||||
"label-keep-time": "Keep time",
|
||||
@@ -12003,6 +12199,14 @@
|
||||
"aria-label-threshold-color": "Threshold color"
|
||||
},
|
||||
"field-lookup-transformer-editor": {
|
||||
"field-name-picker-settings": {
|
||||
"noFieldsMessage": {
|
||||
"no-text-fields-found": "No text fields found"
|
||||
},
|
||||
"placeholderText": {
|
||||
"select-text-field": "Select text field"
|
||||
}
|
||||
},
|
||||
"label-field": "Field",
|
||||
"label-lookup": "Lookup"
|
||||
},
|
||||
@@ -12028,10 +12232,30 @@
|
||||
},
|
||||
"filter-by-value-transformer-editor": {
|
||||
"add-condition": "Add condition",
|
||||
"filter-match": {
|
||||
"label": {
|
||||
"match-all": "Match all",
|
||||
"match-any": "Match any"
|
||||
}
|
||||
},
|
||||
"filter-types": {
|
||||
"label": {
|
||||
"exclude": "Exclude",
|
||||
"include": "Include"
|
||||
}
|
||||
},
|
||||
"label-conditions": "Conditions",
|
||||
"label-filter-type": "Filter type"
|
||||
},
|
||||
"format-string-transfomer-editor": {
|
||||
"field-name-picker-settings": {
|
||||
"noFieldsMessage": {
|
||||
"no-text-fields-found": "No text fields found"
|
||||
},
|
||||
"placeholderText": {
|
||||
"select-text-field": "Select text field"
|
||||
}
|
||||
},
|
||||
"label-field": "Field",
|
||||
"label-format": "Format",
|
||||
"label-substring-range": "Substring range"
|
||||
@@ -12342,6 +12566,7 @@
|
||||
"title": "Organizations"
|
||||
},
|
||||
"user-picker": {
|
||||
"noOptionsMessage-no-users-found": "No users found",
|
||||
"select-aria-label": "User picker",
|
||||
"select-placeholder": "Start typing to search for user"
|
||||
},
|
||||
@@ -12427,6 +12652,8 @@
|
||||
}
|
||||
},
|
||||
"confirm-delete-modal": {
|
||||
"body-delete-variable": "Are you sure you want to delete variable \"{{variableToDelete}}\"?",
|
||||
"confirmText-delete": "Delete",
|
||||
"title-delete-variable": "Delete variable"
|
||||
},
|
||||
"create-ad-hoc-variable-adapter": {
|
||||
@@ -12475,9 +12702,24 @@
|
||||
"label-refresh": "Refresh"
|
||||
},
|
||||
"query-variable-sort-select": {
|
||||
"description-values-variable": "How to sort the values of this variable"
|
||||
"description-values-variable": "How to sort the values of this variable",
|
||||
"name-sort": "Sort",
|
||||
"sort_options": {
|
||||
"label": {
|
||||
"alphabetical-asc": "Alphabetical (asc)",
|
||||
"alphabetical-caseinsensitive-asc": "Alphabetical (case-insensitive, asc)",
|
||||
"alphabetical-caseinsensitive-desc": "Alphabetical (case-insensitive, desc)",
|
||||
"alphabetical-desc": "Alphabetical (desc)",
|
||||
"disabled": "Disabled",
|
||||
"natural-asc": "Natural (asc)",
|
||||
"natural-desc": "Natural (desc)",
|
||||
"numerical-asc": "Numerical (asc)",
|
||||
"numerical-desc": "Numerical (desc)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"text-box-variable-editor": {
|
||||
"name-default-value": "Default value",
|
||||
"placeholder-default-value-if-any": "default value, if any",
|
||||
"text-options": "Text options"
|
||||
},
|
||||
@@ -12506,6 +12748,8 @@
|
||||
"description-optional-display-name": "Optional display name",
|
||||
"description-template-variable-characters": "The name of the template variable. (Max. 50 characters)",
|
||||
"general": "General",
|
||||
"name-label": "Label",
|
||||
"name-name": "Name",
|
||||
"placeholder-descriptive-text": "Descriptive text",
|
||||
"placeholder-label-name": "Label name",
|
||||
"placeholder-variable-name": "Variable name",
|
||||
@@ -12520,9 +12764,15 @@
|
||||
"tooltip-duplicate-variable": "Duplicate variable",
|
||||
"tooltip-remove-variable": "Remove variable"
|
||||
},
|
||||
"variable-editor-un-connected": {
|
||||
"name-description": "Description"
|
||||
},
|
||||
"variable-options": {
|
||||
"aria-label-toggle-all-values": "Toggle all values"
|
||||
},
|
||||
"variable-type-select": {
|
||||
"name-select-variable-type": "Select variable type"
|
||||
},
|
||||
"variable-usages-button": {
|
||||
"tooltip-show-usages": "Show usages"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user