grafana/public/app/plugins/panel/timeseries/TimezonesEditor.tsx
Laura Benz 24502c4c4a
Add tooltip to instances of IconButton (#68880)
* refactor: tooltip is required

* refactor: add tooltips

* refactor: add tooltips

* refactor: add tooltips

* refactor: add tooltips

* refactor: add tooltips

* refactor: add tooltips

* refactor: adjust tests

* refactor: apply changes from code review

* refactor: adjust component for e2e test

* refactor: adjust fallback

* refactor: apply changes from code review

* refactor: apply changes from code review

* refactor: set IconButton default as type=button and remove from use cases

* refactor:  remove aria-labels when duplicated and type=button from use cases

* refactor: clean up

* refactor: fix tests

* refactor: fix type errors

* refactor: remove changes in order in order to add them to a separate PR

* refactor: set IconButton default as type=button

* refactor: remove tooltip

* refactor: apply changes requested in review
2023-06-08 10:23:28 +02:00

71 lines
1.8 KiB
TypeScript

import { css } from '@emotion/css';
import React from 'react';
import { GrafanaTheme2, InternalTimeZones, StandardEditorProps } from '@grafana/data';
import { OptionsWithTimezones } from '@grafana/schema';
import { IconButton, TimeZonePicker, useStyles2 } from '@grafana/ui';
type Props = StandardEditorProps<string[], unknown, OptionsWithTimezones>;
export const TimezonesEditor = ({ value, onChange }: Props) => {
const styles = useStyles2(getStyles);
if (!value || value.length < 1) {
value = [''];
}
const addTimezone = () => {
onChange([...value, InternalTimeZones.default]);
};
const removeTimezone = (idx: number) => {
const copy = value.slice();
copy.splice(idx, 1);
onChange(copy);
};
const setTimezone = (idx: number, tz?: string) => {
const copy = value.slice();
copy[idx] = tz ?? InternalTimeZones.default;
if (copy.length === 0 || (copy.length === 1 && copy[0] === '')) {
onChange(undefined);
} else {
onChange(copy);
}
};
return (
<div>
{value.map((tz, idx) => (
<div className={styles.wrapper} key={`${idx}.${tz}`}>
<span className={styles.first}>
<TimeZonePicker
onChange={(v) => setTimezone(idx, v)}
includeInternal={true}
value={tz ?? InternalTimeZones.default}
/>
</span>
{idx === value.length - 1 ? (
<IconButton name="plus" onClick={addTimezone} tooltip="Add timezone" />
) : (
<IconButton name="times" onClick={() => removeTimezone(idx)} tooltip="Remove timezone" />
)}
</div>
))}
</div>
);
};
const getStyles = (theme: GrafanaTheme2) => ({
wrapper: css`
width: 100%;
display: flex;
flex-direction: rows;
align-items: center;
`,
first: css`
margin-right: 8px;
flex-grow: 2;
`,
});