Chore: more typing improvements to @grafana/ui (#56544)

* improve grafana-ui types

* more type improvements

* better useState type
This commit is contained in:
Ashley Harrison 2022-10-07 15:22:21 +01:00 committed by GitHub
parent a4c5801440
commit ff41b9544b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 86 additions and 137 deletions

View File

@ -1356,21 +1356,9 @@ exports[`better eslint`] = {
"packages/grafana-ui/src/components/Layout/Layout.story.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/Link/Link.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/List/List.story.internal.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/Logs/LogRowContext.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/Logs/LogRowContextProvider.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Do not use any type assertions.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"packages/grafana-ui/src/components/Logs/LogRows.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@ -1387,12 +1375,6 @@ exports[`better eslint`] = {
"packages/grafana-ui/src/components/Menu/MenuItem.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-ui/src/components/Menu/hooks.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Do not use any type assertions.", "3"]
],
"packages/grafana-ui/src/components/Modal/ModalsContext.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@ -1419,14 +1401,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"packages/grafana-ui/src/components/QueryField/QueryField.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-ui/src/components/Segment/Segment.story.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@ -1513,9 +1488,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
[0, 0, 0, "Unexpected any. Specify a different type.", "5"]
],
"packages/grafana-ui/src/components/Select/utils.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-ui/src/components/SetInterval/SetInterval.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@ -1553,21 +1525,13 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "19"],
[0, 0, 0, "Unexpected any. Specify a different type.", "20"]
],
"packages/grafana-ui/src/components/Sparkline/Sparkline.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"packages/grafana-ui/src/components/Table/BarGaugeCell.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/Table/CellActions.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"]
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/Table/DefaultCell.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@ -1583,9 +1547,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"packages/grafana-ui/src/components/Table/HeaderRow.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-ui/src/components/Table/JSONViewCell.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@ -1607,11 +1569,10 @@ exports[`better eslint`] = {
"packages/grafana-ui/src/components/Table/TableCell.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Do not use any type assertions.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
[0, 0, 0, "Do not use any type assertions.", "5"],
[0, 0, 0, "Do not use any type assertions.", "6"]
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Do not use any type assertions.", "4"],
[0, 0, 0, "Do not use any type assertions.", "5"]
],
"packages/grafana-ui/src/components/Table/TableCellInspectModal.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@ -1649,21 +1610,15 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
[0, 0, 0, "Do not use any type assertions.", "7"],
[0, 0, 0, "Do not use any type assertions.", "6"],
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
[0, 0, 0, "Unexpected any. Specify a different type.", "8"],
[0, 0, 0, "Unexpected any. Specify a different type.", "9"],
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
[0, 0, 0, "Unexpected any. Specify a different type.", "11"],
[0, 0, 0, "Unexpected any. Specify a different type.", "12"]
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
],
"packages/grafana-ui/src/components/Tags/Tag.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"packages/grafana-ui/src/components/ThemeDemos/EmotionPerfTest.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/ThemeDemos/ThemeDemo.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@ -1671,28 +1626,12 @@ exports[`better eslint`] = {
],
"packages/grafana-ui/src/components/TimeSeries/TimeSeries.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"packages/grafana-ui/src/components/TimeSeries/utils.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"packages/grafana-ui/src/components/Tooltip/Tooltip.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"packages/grafana-ui/src/components/Tooltip/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-ui/src/components/UnitPicker/UnitPicker.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/VizLegend/VizLegendListItem.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"packages/grafana-ui/src/components/VizLegend/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@ -1707,8 +1646,7 @@ exports[`better eslint`] = {
],
"packages/grafana-ui/src/components/VizTooltip/VizTooltip.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"packages/grafana-ui/src/components/uPlot/Plot.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@ -1770,10 +1708,6 @@ exports[`better eslint`] = {
"packages/grafana-ui/src/options/builder/hideSeries.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/options/builder/legend.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"packages/grafana-ui/src/options/builder/stacking.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],

View File

@ -12,8 +12,7 @@ export const Link = forwardRef<HTMLAnchorElement, Props>(({ href, children, ...r
const validUrl = locationUtil.stripBaseFromUrl(textUtil.sanitizeUrl(href ?? ''));
return (
// @ts-ignore
<RouterLink ref={ref as React.Ref<HTMLAnchorElement>} to={validUrl} {...rest}>
<RouterLink ref={ref} to={validUrl} {...rest}>
{children}
</RouterLink>
);

View File

@ -6,7 +6,7 @@ import tinycolor from 'tinycolor2';
import { InlineList } from './InlineList';
import { List } from './List';
export default {
const meta: Meta = {
title: 'Layout/List',
component: List,
parameters: {
@ -26,7 +26,9 @@ export default {
},
},
},
} as Meta;
};
export default meta;
const generateListItems = (numberOfItems: number) => {
return [...new Array(numberOfItems)].map((item, i) => {

View File

@ -135,7 +135,7 @@ export const LogRowContextGroup: React.FunctionComponent<LogRowContextGroupProps
}) => {
const { commonStyles, logs } = useStyles2(getLogRowContextStyles);
const [scrollTop, setScrollTop] = useState(0);
const listContainerRef = useRef<HTMLDivElement>() as React.RefObject<HTMLDivElement>;
const listContainerRef = useRef<HTMLDivElement>(null);
useLayoutEffect(() => {
// We want to scroll to bottom only when we receive first 10 log lines

View File

@ -151,7 +151,7 @@ export const LogRowContextProvider: React.FunctionComponent<LogRowContextProvide
// React Hook that creates an object state value called result to component state and a setter function called setResult
// The initial value for result is null
// Used for sorting the response from backend
const [result, setResult] = useState<ResultType>(null as any as ResultType);
const [result, setResult] = useState<ResultType | null>(null);
// React Hook that creates an object state value called hasMoreContextRows to component state and a setter function called setHasMoreContextRows
// The initial value for hasMoreContextRows is {before: true, after: true}
@ -177,20 +177,22 @@ export const LogRowContextProvider: React.FunctionComponent<LogRowContextProvide
let hasMoreLogsBefore = true,
hasMoreLogsAfter = true;
const currentResultBefore = currentResult?.data[0];
const currentResultAfter = currentResult?.data[1];
const valueBefore = value.data[0];
const valueAfter = value.data[1];
if (currentResult) {
const currentResultBefore = currentResult.data[0];
const currentResultAfter = currentResult.data[1];
const valueBefore = value.data[0];
const valueAfter = value.data[1];
// checks if there are more log rows in a given direction
// if after fetching additional rows the length of result is the same,
// we can assume there are no logs in that direction within a given time range
if (currentResult && (!valueBefore || currentResultBefore.length === valueBefore.length)) {
hasMoreLogsBefore = false;
}
// checks if there are more log rows in a given direction
// if after fetching additional rows the length of result is the same,
// we can assume there are no logs in that direction within a given time range
if (!valueBefore || currentResultBefore.length === valueBefore.length) {
hasMoreLogsBefore = false;
}
if (currentResult && (!valueAfter || currentResultAfter.length === valueAfter.length)) {
hasMoreLogsAfter = false;
if (!valueAfter || currentResultAfter.length === valueAfter.length) {
hasMoreLogsAfter = false;
}
}
setHasMoreContextRows({

View File

@ -1,8 +1,6 @@
import { RefObject, useEffect, useState } from 'react';
import { useEffectOnce } from 'react-use';
import { MenuItemElement } from './MenuItem';
const modulo = (a: number, n: number) => ((a % n) + n) % n;
const UNFOCUSED = -1;
@ -42,15 +40,19 @@ export const useMenuFocus = ({
}, [isMenuOpen, openedWithArrow, setOpenedWithArrow]);
useEffect(() => {
const menuItems = localRef?.current?.querySelectorAll(`[data-role="menuitem"]`);
(menuItems?.[focusedItem] as MenuItemElement)?.focus();
const menuItems = localRef?.current?.querySelectorAll<HTMLElement | HTMLButtonElement | HTMLAnchorElement>(
`[data-role="menuitem"]`
);
menuItems?.[focusedItem]?.focus();
menuItems?.forEach((menuItem, i) => {
(menuItem as MenuItemElement).tabIndex = i === focusedItem ? 0 : -1;
menuItem.tabIndex = i === focusedItem ? 0 : -1;
});
}, [localRef, focusedItem]);
useEffectOnce(() => {
const firstMenuItem = localRef?.current?.querySelector(`[data-role="menuitem"]`) as MenuItemElement | null;
const firstMenuItem = localRef?.current?.querySelector<HTMLElement | HTMLButtonElement | HTMLAnchorElement>(
`[data-role="menuitem"]`
);
if (firstMenuItem) {
firstMenuItem.tabIndex = 0;
}
@ -58,7 +60,9 @@ export const useMenuFocus = ({
});
const handleKeys = (event: React.KeyboardEvent) => {
const menuItems = localRef?.current?.querySelectorAll(`[data-role="menuitem"]`);
const menuItems = localRef?.current?.querySelectorAll<HTMLElement | HTMLButtonElement | HTMLAnchorElement>(
`[data-role="menuitem"]`
);
const menuItemsCount = menuItems?.length ?? 0;
switch (event.key) {
@ -91,7 +95,7 @@ export const useMenuFocus = ({
case 'Enter':
event.preventDefault();
event.stopPropagation();
(menuItems?.[focusedItem] as MenuItemElement)?.click();
menuItems?.[focusedItem]?.click();
break;
case 'Escape':
event.preventDefault();

View File

@ -4,7 +4,7 @@ import { debounce } from 'lodash';
import React, { Context, PureComponent } from 'react';
import { Value } from 'slate';
import Plain from 'slate-plain-serializer';
import { Editor, Plugin } from 'slate-react';
import { Editor, EventHook, Plugin } from 'slate-react';
import { GrafanaTheme2 } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
@ -42,7 +42,7 @@ export interface QueryFieldProps extends Themeable2 {
onBlur?: () => void;
onChange?: (value: string) => void;
onRichValueChange?: (value: Value) => void;
onClick?: (event: Event | React.MouseEvent, editor: Editor, next: () => any) => any;
onClick?: EventHook<React.MouseEvent<Element, MouseEvent>>;
onTypeahead?: (typeahead: TypeaheadInput) => Promise<TypeaheadOutput>;
onWillApplySuggestion?: (suggestion: string, state: SuggestionsState) => string;
placeholder?: string;

View File

@ -13,7 +13,7 @@ export const defaultIntervals = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '
export interface Props {
intervals?: string[];
onRefresh?: () => any;
onRefresh?: () => void;
onIntervalChanged: (interval: string) => void;
value?: string;
tooltip?: string;
@ -50,8 +50,7 @@ export class RefreshPicker extends PureComponent<Props> {
onChangeSelect = (item: SelectableValue<string>) => {
const { onIntervalChanged } = this.props;
if (onIntervalChanged) {
// @ts-ignore
if (onIntervalChanged && item.value) {
onIntervalChanged(item.value);
}
};
@ -127,7 +126,7 @@ export class RefreshPicker extends PureComponent<Props> {
<ButtonSelect
value={selectedValue}
options={options}
onChange={this.onChangeSelect as any}
onChange={this.onChangeSelect}
variant={variant}
title="Set auto refresh interval"
data-testid={selectors.components.RefreshPicker.intervalButtonV2}

View File

@ -5,7 +5,10 @@ import { SelectableOptGroup } from './types';
/**
* Normalize the value format to SelectableValue[] | []. Only used for single select
*/
export const cleanValue = (value: any, options: Array<SelectableValue | SelectableOptGroup | SelectableOptGroup[]>) => {
export const cleanValue = (
value: unknown,
options: Array<SelectableValue | SelectableOptGroup | SelectableOptGroup[]>
) => {
if (Array.isArray(value)) {
const filtered = value.filter(Boolean);
return filtered?.length ? filtered : undefined;

View File

@ -148,7 +148,7 @@ export class Sparkline extends PureComponent<SparklineProps, State> {
for (let i = 0; i < data.fields.length; i++) {
const field = data.fields[i];
const config = field.config as FieldConfig<GraphFieldConfig>;
const config: FieldConfig<GraphFieldConfig> = field.config;
const customConfig: GraphFieldConfig = {
...defaultConfig,
...config.custom,

View File

@ -1,7 +1,7 @@
import { isFunction } from 'lodash';
import React, { FC } from 'react';
import { ThresholdsConfig, ThresholdsMode, VizOrientation, getFieldConfigWithMinMax, LinkModel } from '@grafana/data';
import { ThresholdsConfig, ThresholdsMode, VizOrientation, getFieldConfigWithMinMax } from '@grafana/data';
import { BarGauge, BarGaugeDisplayMode } from '../BarGauge/BarGauge';
import { DataLinksContextMenu, DataLinksContextMenuApi } from '../DataLinks/DataLinksContextMenu';
@ -44,7 +44,7 @@ export const BarGaugeCell: FC<TableCellProps> = (props) => {
const getLinks = () => {
if (!isFunction(field.getLinks)) {
return [] as LinkModel[];
return [];
}
return field.getLinks({ valueRowIndex: row.index });

View File

@ -13,15 +13,20 @@ interface CellActionProps extends TableCellProps {
previewMode: 'text' | 'code';
}
interface CommonButtonProps {
size: IconSize;
tooltipPlacement: TooltipPlacement;
}
export function CellActions({ field, cell, previewMode, onCellFilterAdded }: CellActionProps) {
const [isInspecting, setIsInspecting] = useState(false);
const isRightAligned = getTextAlign(field) === 'flex-end';
const showFilters = Boolean(field.config.filterable) && cell.value !== undefined;
const inspectEnabled = Boolean((field.config.custom as TableFieldOptions)?.inspect);
const commonButtonProps = {
size: 'sm' as IconSize,
tooltipPlacement: 'top' as TooltipPlacement,
const commonButtonProps: CommonButtonProps = {
size: 'sm',
tooltipPlacement: 'top',
};
const onFilterFor = useCallback(

View File

@ -51,7 +51,7 @@ function renderHeaderCell(column: any, tableStyles: TableStyles, showTypeIcons?:
}
headerProps.style.position = 'absolute';
headerProps.style.justifyContent = (column as any).justifyContent;
headerProps.style.justifyContent = column.justifyContent;
return (
<div className={tableStyles.headerCell} {...headerProps} role="columnheader">

View File

@ -15,7 +15,7 @@ export interface Props {
export const TableCell: FC<Props> = ({ cell, tableStyles, onCellFilterAdded, columnIndex, columnCount, userProps }) => {
const cellProps = cell.getCellProps();
const field = (cell.column as any as GrafanaTableColumn).field;
const field = (cell.column as unknown as GrafanaTableColumn).field;
if (!field?.display) {
return null;

View File

@ -174,7 +174,7 @@ export function calculateUniqueFieldValues(rows: any[], field?: Field) {
return {};
}
const set: Record<string, any> = {};
const set: Record<string, string> = {};
for (let index = 0; index < rows.length; index++) {
const value = rowToFieldValue(rows[index], field);

View File

@ -11,7 +11,7 @@ import { Icon } from '../Icon/Icon';
/**
* @public
*/
export type OnTagClick = (name: string, event: React.MouseEvent<HTMLElement>) => any;
export type OnTagClick = (name: string, event: React.MouseEvent<HTMLElement>) => void;
export interface Props extends Omit<HTMLAttributes<HTMLElement>, 'onClick'> {
/** Name of the tag to display */

View File

@ -1,6 +1,6 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { css, cx } from '@emotion/css';
import { css, CSSInterpolation, cx } from '@emotion/css';
import { jsx } from '@emotion/react';
import classnames from 'classnames';
import { Profiler, ProfilerOnRenderCallback, useState, FC } from 'react';
@ -174,7 +174,7 @@ const getStylesObjects = (theme: GrafanaTheme2) => {
};
};
function getStylesObjectMain(theme: GrafanaTheme2): any {
function getStylesObjectMain(theme: GrafanaTheme2): CSSInterpolation {
return {
background: 'blue',
border: '1px solid red',
@ -187,7 +187,7 @@ function getStylesObjectMain(theme: GrafanaTheme2): any {
};
}
function getStylesObjectChild(theme: GrafanaTheme2): any {
function getStylesObjectChild(theme: GrafanaTheme2): CSSInterpolation {
return {
padding: '2px',
fontSize: '10px',

View File

@ -53,7 +53,7 @@ export class UnthemedTimeSeries extends Component<TimeSeriesProps> {
{...this.props}
prepConfig={this.prepConfig}
propsToDiff={propsToDiff}
renderLegend={this.renderLegend as any}
renderLegend={this.renderLegend}
/>
);
}

View File

@ -173,13 +173,13 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn<{
for (let i = 1; i < frame.fields.length; i++) {
const field = frame.fields[i];
const config = {
const config: FieldConfig<GraphFieldConfig> = {
...field.config,
custom: {
...defaultConfig,
...field.config.custom,
},
} as FieldConfig<GraphFieldConfig>;
};
const customConfig: GraphFieldConfig = config.custom!;

View File

@ -66,8 +66,9 @@ export const Tooltip = React.memo(({ children, theme, interactive, show, placeme
{typeof content === 'string' && content}
{React.isValidElement(content) && React.cloneElement(content)}
{typeof content === 'function' &&
update &&
content({
updatePopperPosition: update as any,
updatePopperPosition: update,
})}
</div>
</Portal>

View File

@ -7,7 +7,7 @@ export interface PopoverContentProps {
updatePopperPosition?: () => void;
}
export type PopoverContent = string | React.ReactElement<any> | ((props: PopoverContentProps) => JSX.Element);
export type PopoverContent = string | React.ReactElement | ((props: PopoverContentProps) => JSX.Element);
export type TooltipPlacement =
| 'auto-start'

View File

@ -29,7 +29,7 @@ export class UnitPicker extends PureComponent<UnitPickerProps> {
const unitGroups = getValueFormats();
// Need to transform the data structure to work well with Select
const groupOptions = unitGroups.map((group) => {
const groupOptions: CascaderOption[] = unitGroups.map((group) => {
const options = group.submenu.map((unit) => {
const sel = {
label: unit.text,
@ -60,7 +60,7 @@ export class UnitPicker extends PureComponent<UnitPickerProps> {
allowCustomValue
changeOnSelect={false}
formatCreateLabel={formatCreateLabel}
options={groupOptions as CascaderOption[]}
options={groupOptions}
placeholder="Choose"
onSelect={this.props.onChange}
/>

View File

@ -22,7 +22,7 @@ export interface Props<T> {
/**
* @internal
*/
export const VizLegendListItem = <T extends unknown = any>({
export const VizLegendListItem = <T = unknown,>({
item,
onLabelClick,
onLabelMouseEnter,

View File

@ -31,7 +31,7 @@ export interface VizTooltipContentProps<T extends Dimensions = any> {
export interface VizTooltipProps {
/** Element used as tooltips content */
content?: React.ReactElement<any>;
content?: React.ReactElement;
/** Optional component to be used as a tooltip content */
tooltipComponent?: React.ComponentType<VizTooltipContentProps>;

View File

@ -61,7 +61,7 @@ export function addLegendOptions<T extends OptionsWithLegend>(
name: 'Values',
category: ['Legend'],
description: 'Select values or calculations to show in legend',
editor: standardEditorsRegistry.get('stats-picker').editor as any,
editor: standardEditorsRegistry.get('stats-picker').editor,
defaultValue: [],
settings: {
allowMultiple: true,