Skip to content
Snippets Groups Projects
Unverified Commit 6a0b46e5 authored by Uladzimir Havenchyk's avatar Uladzimir Havenchyk Committed by GitHub
Browse files

rework ChartSettings to typescript (#48877)

* rework ChartSettings to typescript

* lint
parent 2882692b
No related branches found
No related tags found
No related merge requests found
Showing
with 161 additions and 78 deletions
...@@ -47,7 +47,7 @@ import { ...@@ -47,7 +47,7 @@ import {
} from "./View.styled"; } from "./View.styled";
import { ViewFooter } from "./ViewFooter"; import { ViewFooter } from "./ViewFooter";
import ViewSidebar from "./ViewSidebar"; import ViewSidebar from "./ViewSidebar";
import ChartSettingsSidebar from "./sidebars/ChartSettingsSidebar"; import { ChartSettingsSidebar } from "./sidebars/ChartSettingsSidebar";
import { ChartTypeSidebar } from "./sidebars/ChartTypeSidebar"; import { ChartTypeSidebar } from "./sidebars/ChartTypeSidebar";
import { QuestionInfoSidebar } from "./sidebars/QuestionInfoSidebar"; import { QuestionInfoSidebar } from "./sidebars/QuestionInfoSidebar";
import { QuestionSettingsSidebar } from "./sidebars/QuestionSettingsSidebar"; import { QuestionSettingsSidebar } from "./sidebars/QuestionSettingsSidebar";
......
/* eslint-disable react/prop-types */ import { memo, useCallback, useMemo } from "react";
import { memo, useCallback, useMemo, useState } from "react";
import { t } from "ttag"; import { t } from "ttag";
import ErrorBoundary from "metabase/ErrorBoundary"; import ErrorBoundary from "metabase/ErrorBoundary";
import CS from "metabase/css/core/index.css"; import CS from "metabase/css/core/index.css";
import SidebarContent from "metabase/query_builder/components/SidebarContent"; import SidebarContent from "metabase/query_builder/components/SidebarContent";
import visualizations from "metabase/visualizations"; import visualizations from "metabase/visualizations";
import ChartSettings from "metabase/visualizations/components/ChartSettings"; import {
ChartSettings,
type Widget,
} from "metabase/visualizations/components/ChartSettings";
import type Question from "metabase-lib/v1/Question";
import type { Dataset, VisualizationSettings } from "metabase-types/api";
function ChartSettingsSidebar(props) { interface ChartSettingsSidebarProps {
const [sidebarPropsOverride, setSidebarPropsOverride] = useState(null); question: Question;
const handleSidebarPropsOverride = useCallback( result: Dataset;
sidebarPropsOverride => { addField: () => void;
setSidebarPropsOverride(sidebarPropsOverride); initialChartSetting: { section: string; widget?: Widget };
}, onReplaceAllVisualizationSettings: (settings: VisualizationSettings) => void;
[setSidebarPropsOverride], onClose: () => void;
); onOpenChartType: () => void;
visualizationSettings: VisualizationSettings;
showSidebarTitle?: boolean;
}
function ChartSettingsSidebarInner(props: ChartSettingsSidebarProps) {
const { const {
question, question,
result, result,
...@@ -30,7 +38,7 @@ function ChartSettingsSidebar(props) { ...@@ -30,7 +38,7 @@ function ChartSettingsSidebar(props) {
} = props; } = props;
const sidebarContentProps = showSidebarTitle const sidebarContentProps = showSidebarTitle
? { ? {
title: t`${visualizations.get(question.display()).uiName} options`, title: t`${visualizations.get(question.display())?.uiName} options`,
onBack: () => onOpenChartType(), onBack: () => onOpenChartType(),
} }
: {}; : {};
...@@ -55,7 +63,6 @@ function ChartSettingsSidebar(props) { ...@@ -55,7 +63,6 @@ function ChartSettingsSidebar(props) {
className={CS.fullHeight} className={CS.fullHeight}
onDone={handleClose} onDone={handleClose}
{...sidebarContentProps} {...sidebarContentProps}
{...sidebarPropsOverride}
> >
<ErrorBoundary> <ErrorBoundary>
<ChartSettings <ChartSettings
...@@ -66,7 +73,6 @@ function ChartSettingsSidebar(props) { ...@@ -66,7 +73,6 @@ function ChartSettingsSidebar(props) {
onClose={handleClose} onClose={handleClose}
noPreview noPreview
initial={initialChartSetting} initial={initialChartSetting}
setSidebarPropsOverride={handleSidebarPropsOverride}
computedSettings={visualizationSettings} computedSettings={visualizationSettings}
/> />
</ErrorBoundary> </ErrorBoundary>
...@@ -75,4 +81,4 @@ function ChartSettingsSidebar(props) { ...@@ -75,4 +81,4 @@ function ChartSettingsSidebar(props) {
); );
} }
export default memo(ChartSettingsSidebar); export const ChartSettingsSidebar = memo(ChartSettingsSidebarInner);
import { fireEvent, render, screen } from "@testing-library/react"; import { fireEvent, render, screen } from "@testing-library/react";
import { createMockMetadata } from "__support__/metadata"; import { createMockMetadata } from "__support__/metadata";
import ChartSettingsSidebar from "metabase/query_builder/components/view/sidebars/ChartSettingsSidebar"; import { ChartSettingsSidebar } from "metabase/query_builder/components/view/sidebars/ChartSettingsSidebar";
import registerVisualizations from "metabase/visualizations/register"; import registerVisualizations from "metabase/visualizations/register";
import { import {
SAMPLE_DB_ID, SAMPLE_DB_ID,
......
/* eslint-disable react/prop-types */
import { assocIn } from "icepick"; import { assocIn } from "icepick";
import { Component } from "react"; import { Component } from "react";
import * as React from "react"; import * as React from "react";
...@@ -23,7 +22,18 @@ import { ...@@ -23,7 +22,18 @@ import {
import { getSettingDefinitionsForColumn } from "metabase/visualizations/lib/settings/column"; import { getSettingDefinitionsForColumn } from "metabase/visualizations/lib/settings/column";
import { keyForSingleSeries } from "metabase/visualizations/lib/settings/series"; import { keyForSingleSeries } from "metabase/visualizations/lib/settings/series";
import { getSettingsWidgetsForSeries } from "metabase/visualizations/lib/settings/visualization"; import { getSettingsWidgetsForSeries } from "metabase/visualizations/lib/settings/visualization";
import type Question from "metabase-lib/v1/Question";
import { getColumnKey } from "metabase-lib/v1/queries/utils/column-key"; import { getColumnKey } from "metabase-lib/v1/queries/utils/column-key";
import type {
Dashboard,
DashboardCard,
DatasetColumn,
RawSeries,
Series,
VisualizationSettings,
} from "metabase-types/api";
import type { ComputedVisualizationSettings } from "../types";
import { import {
ChartSettingsFooterRoot, ChartSettingsFooterRoot,
...@@ -44,20 +54,25 @@ const DEFAULT_TAB_PRIORITY = [t`Data`]; ...@@ -44,20 +54,25 @@ const DEFAULT_TAB_PRIORITY = [t`Data`];
/** /**
* @deprecated HOCs are deprecated * @deprecated HOCs are deprecated
*/ */
const withTransientSettingState = ComposedComponent => function withTransientSettingState(
class extends React.Component { ComposedComponent: React.ComponentType<ChartSettingsProps>,
) {
return class extends React.Component<
ChartSettingsProps,
{ settings?: VisualizationSettings }
> {
static displayName = `withTransientSettingState[${ static displayName = `withTransientSettingState[${
ComposedComponent.displayName || ComposedComponent.name ComposedComponent.displayName || ComposedComponent.name
}]`; }]`;
constructor(props) { constructor(props: ChartSettingsProps) {
super(props); super(props);
this.state = { this.state = {
settings: props.settings, settings: props.settings,
}; };
} }
UNSAFE_componentWillReceiveProps(nextProps) { UNSAFE_componentWillReceiveProps(nextProps: ChartSettingsProps) {
if (this.props.settings !== nextProps.settings) { if (this.props.settings !== nextProps.settings) {
this.setState({ settings: nextProps.settings }); this.setState({ settings: nextProps.settings });
} }
...@@ -68,17 +83,61 @@ const withTransientSettingState = ComposedComponent => ...@@ -68,17 +83,61 @@ const withTransientSettingState = ComposedComponent =>
<ComposedComponent <ComposedComponent
{...this.props} {...this.props}
settings={this.state.settings} settings={this.state.settings}
onChange={settings => this.setState({ settings })} onChange={(settings: VisualizationSettings) =>
onDone={settings => this.setState({ settings })
this.props.onChange(settings || this.state.settings) }
onDone={(settings: VisualizationSettings) =>
this.props.onChange?.(settings || this.state.settings)
} }
/> />
); );
} }
}; };
}
// this type is not full, we need to extend it later
export interface Widget {
id: string;
section: string;
hidden?: boolean;
props: Record<string, unknown>;
title?: string;
widget: (() => JSX.Element | null) | undefined;
}
class ChartSettings extends Component { export interface ChartSettingsProps {
constructor(props) { className?: string;
dashboard?: Dashboard;
dashcard?: DashboardCard;
initial?: { section: string; widget?: Widget };
onCancel?: () => void;
onDone?: (settings: VisualizationSettings) => void;
onReset?: () => void;
onChange?: (
settings: ComputedVisualizationSettings,
question?: Question,
) => void;
onClose?: () => void;
rawSeries?: RawSeries[];
settings?: VisualizationSettings;
widgets?: Widget[];
series: Series;
computedSettings?: ComputedVisualizationSettings;
isDashboard?: boolean;
question?: Question;
addField?: () => void;
noPreview?: boolean;
}
interface ChartSettingsState {
currentSection: string | null;
currentWidget: Widget | null;
popoverRef?: HTMLElement | null;
warnings?: string[];
}
class ChartSettings extends Component<ChartSettingsProps, ChartSettingsState> {
constructor(props: ChartSettingsProps) {
super(props); super(props);
this.state = { this.state = {
currentSection: (props.initial && props.initial.section) || null, currentSection: (props.initial && props.initial.section) || null,
...@@ -86,7 +145,7 @@ class ChartSettings extends Component { ...@@ -86,7 +145,7 @@ class ChartSettings extends Component {
}; };
} }
componentDidUpdate(prevProps) { componentDidUpdate(prevProps: ChartSettingsProps) {
const { initial } = this.props; const { initial } = this.props;
if (!_.isEqual(initial, prevProps.initial)) { if (!_.isEqual(initial, prevProps.initial)) {
this.setState({ this.setState({
...@@ -96,7 +155,7 @@ class ChartSettings extends Component { ...@@ -96,7 +155,7 @@ class ChartSettings extends Component {
} }
} }
handleShowSection = section => { handleShowSection = (section: string) => {
this.setState({ this.setState({
currentSection: section, currentSection: section,
currentWidget: null, currentWidget: null,
...@@ -104,7 +163,7 @@ class ChartSettings extends Component { ...@@ -104,7 +163,7 @@ class ChartSettings extends Component {
}; };
// allows a widget to temporarily replace itself with a different widget // allows a widget to temporarily replace itself with a different widget
handleShowWidget = (widget, ref) => { handleShowWidget = (widget: Widget, ref: HTMLElement | null) => {
this.setState({ popoverRef: ref, currentWidget: widget }); this.setState({ popoverRef: ref, currentWidget: widget });
}; };
...@@ -115,32 +174,38 @@ class ChartSettings extends Component { ...@@ -115,32 +174,38 @@ class ChartSettings extends Component {
handleResetSettings = () => { handleResetSettings = () => {
const originalCardSettings = const originalCardSettings =
this.props.dashcard.card.visualization_settings; this.props.dashcard?.card.visualization_settings;
const clickBehaviorSettings = getClickBehaviorSettings(this._getSettings()); const clickBehaviorSettings = getClickBehaviorSettings(this._getSettings());
this.props.onChange({ ...originalCardSettings, ...clickBehaviorSettings }); this.props.onChange?.({
...originalCardSettings,
...clickBehaviorSettings,
});
}; };
handleChangeSettings = (changedSettings, question) => { handleChangeSettings = (
this.props.onChange( changedSettings: VisualizationSettings,
question: Question,
) => {
this.props.onChange?.(
updateSettings(this._getSettings(), changedSettings), updateSettings(this._getSettings(), changedSettings),
question, question,
); );
}; };
handleChangeSeriesColor = (seriesKey, color) => { handleChangeSeriesColor = (seriesKey: string, color: string) => {
this.props.onChange( this.props.onChange?.(
updateSeriesColor(this._getSettings(), seriesKey, color), updateSeriesColor(this._getSettings(), seriesKey, color),
); );
}; };
handleDone = () => { handleDone = () => {
this.props.onDone(this._getSettings()); this.props.onDone?.(this._getSettings());
this.props.onClose(); this.props.onClose?.();
}; };
handleCancel = () => { handleCancel = () => {
this.props.onClose(); this.props.onClose?.();
}; };
_getSettings() { _getSettings() {
...@@ -153,7 +218,7 @@ class ChartSettings extends Component { ...@@ -153,7 +218,7 @@ class ChartSettings extends Component {
return this.props.computedSettings || {}; return this.props.computedSettings || {};
} }
_getWidgets() { _getWidgets(): Widget[] {
if (this.props.widgets) { if (this.props.widgets) {
return this.props.widgets; return this.props.widgets;
} else { } else {
...@@ -188,7 +253,7 @@ class ChartSettings extends Component { ...@@ -188,7 +253,7 @@ class ChartSettings extends Component {
return transformedSeries; return transformedSeries;
} }
columnHasSettings(col) { columnHasSettings(col: DatasetColumn) {
const { series } = this.props; const { series } = this.props;
const settings = this._getSettings() || {}; const settings = this._getSettings() || {};
const settingsDefs = getSettingDefinitionsForColumn(series, col); const settingsDefs = getSettingDefinitionsForColumn(series, col);
...@@ -206,7 +271,7 @@ class ChartSettings extends Component { ...@@ -206,7 +271,7 @@ class ChartSettings extends Component {
).some(widget => !widget.hidden); ).some(widget => !widget.hidden);
} }
getStyleWidget = widgets => { getStyleWidget = (widgets: Widget[]): Widget | null => {
const series = this._getTransformedSeries(); const series = this._getTransformedSeries();
const settings = this._getComputedSettings(); const settings = this._getComputedSettings();
const { currentWidget } = this.state; const { currentWidget } = this.state;
...@@ -235,7 +300,8 @@ class ChartSettings extends Component { ...@@ -235,7 +300,8 @@ class ChartSettings extends Component {
}, },
}; };
} else if (currentWidget.props?.initialKey) { } else if (currentWidget.props?.initialKey) {
const hasBreakouts = settings["graph.dimensions"]?.length > 1; const hasBreakouts =
settings["graph.dimensions"] && settings["graph.dimensions"].length > 1;
if (hasBreakouts) { if (hasBreakouts) {
return null; return null;
...@@ -244,7 +310,9 @@ class ChartSettings extends Component { ...@@ -244,7 +310,9 @@ class ChartSettings extends Component {
const singleSeriesForColumn = series.find(single => { const singleSeriesForColumn = series.find(single => {
const metricColumn = single.data.cols[1]; const metricColumn = single.data.cols[1];
if (metricColumn) { if (metricColumn) {
return getColumnKey(metricColumn) === currentWidget.props.initialKey; return (
getColumnKey(metricColumn) === currentWidget?.props?.initialKey
);
} }
}); });
...@@ -262,7 +330,7 @@ class ChartSettings extends Component { ...@@ -262,7 +330,7 @@ class ChartSettings extends Component {
return null; return null;
}; };
getFormattingWidget = widgets => { getFormattingWidget = (widgets: Widget[]): Widget | null => {
const { currentWidget } = this.state; const { currentWidget } = this.state;
const widget = const widget =
currentWidget && widgets.find(widget => widget.id === currentWidget.id); currentWidget && widgets.find(widget => widget.id === currentWidget.id);
...@@ -279,10 +347,10 @@ class ChartSettings extends Component { ...@@ -279,10 +347,10 @@ class ChartSettings extends Component {
className, className,
question, question,
addField, addField,
noPreview, noPreview = false,
dashboard, dashboard,
dashcard, dashcard,
isDashboard, isDashboard = false,
} = this.props; } = this.props;
const { popoverRef } = this.state; const { popoverRef } = this.state;
...@@ -290,8 +358,8 @@ class ChartSettings extends Component { ...@@ -290,8 +358,8 @@ class ChartSettings extends Component {
const widgets = this._getWidgets(); const widgets = this._getWidgets();
const rawSeries = this._getRawSeries(); const rawSeries = this._getRawSeries();
const widgetsById = {}; const widgetsById: Record<string, Widget> = {};
const sections = {}; const sections: Record<string, Widget[]> = {};
for (const widget of widgets) { for (const widget of widgets) {
widgetsById[widget.id] = widget; widgetsById[widget.id] = widget;
...@@ -338,7 +406,7 @@ class ChartSettings extends Component { ...@@ -338,7 +406,7 @@ class ChartSettings extends Component {
// overriding the sidebar title. // overriding the sidebar title.
const currentSectionHasColumnSettings = ( const currentSectionHasColumnSettings = (
sections[currentSection] || [] sections[currentSection] || []
).some(widget => widget.id === "column_settings"); ).some((widget: Widget) => widget.id === "column_settings");
const extraWidgetProps = { const extraWidgetProps = {
// NOTE: special props to support adding additional fields // NOTE: special props to support adding additional fields
...@@ -347,8 +415,8 @@ class ChartSettings extends Component { ...@@ -347,8 +415,8 @@ class ChartSettings extends Component {
onShowWidget: this.handleShowWidget, onShowWidget: this.handleShowWidget,
onEndShowWidget: this.handleEndShowWidget, onEndShowWidget: this.handleEndShowWidget,
currentSectionHasColumnSettings, currentSectionHasColumnSettings,
columnHasSettings: col => this.columnHasSettings(col), columnHasSettings: (col: DatasetColumn) => this.columnHasSettings(col),
onChangeSeriesColor: (seriesKey, color) => onChangeSeriesColor: (seriesKey: string, color: string) =>
this.handleChangeSeriesColor(seriesKey, color), this.handleChangeSeriesColor(seriesKey, color),
}; };
...@@ -409,7 +477,9 @@ class ChartSettings extends Component { ...@@ -409,7 +477,9 @@ class ChartSettings extends Component {
isSettings isSettings
showWarnings showWarnings
onUpdateVisualizationSettings={this.handleChangeSettings} onUpdateVisualizationSettings={this.handleChangeSettings}
onUpdateWarnings={warnings => this.setState({ warnings })} onUpdateWarnings={(warnings: string[]) =>
this.setState({ warnings })
}
/> />
</ChartSettingsVisualizationContainer> </ChartSettingsVisualizationContainer>
<ChartSettingsFooter <ChartSettingsFooter
...@@ -420,11 +490,11 @@ class ChartSettings extends Component { ...@@ -420,11 +490,11 @@ class ChartSettings extends Component {
</ChartSettingsPreview> </ChartSettingsPreview>
)} )}
<ChartSettingsWidgetPopover <ChartSettingsWidgetPopover
anchor={popoverRef} anchor={popoverRef as HTMLElement}
widgets={[ widgets={[
this.getStyleWidget(widgets), this.getStyleWidget(widgets),
this.getFormattingWidget(widgets), this.getFormattingWidget(widgets),
].filter(widget => !!widget)} ].filter((widget): widget is Widget => !!widget)}
handleEndShowWidget={this.handleEndShowWidget} handleEndShowWidget={this.handleEndShowWidget}
/> />
</ChartSettingsRoot> </ChartSettingsRoot>
...@@ -432,7 +502,15 @@ class ChartSettings extends Component { ...@@ -432,7 +502,15 @@ class ChartSettings extends Component {
} }
} }
const ChartSettingsFooter = ({ onDone, onCancel, onReset }) => ( const ChartSettingsFooter = ({
onDone,
onCancel,
onReset,
}: {
onDone: () => void;
onCancel: () => void;
onReset: (() => void) | null;
}) => (
<ChartSettingsFooterRoot> <ChartSettingsFooterRoot>
{onReset && ( {onReset && (
<Button <Button
...@@ -446,6 +524,6 @@ const ChartSettingsFooter = ({ onDone, onCancel, onReset }) => ( ...@@ -446,6 +524,6 @@ const ChartSettingsFooter = ({ onDone, onCancel, onReset }) => (
</ChartSettingsFooterRoot> </ChartSettingsFooterRoot>
); );
export default ChartSettings; export { ChartSettings };
export const ChartSettingsWithState = withTransientSettingState(ChartSettings); export const ChartSettingsWithState = withTransientSettingState(ChartSettings);
import userEvent from "@testing-library/user-event"; import userEvent from "@testing-library/user-event";
import { fireEvent, renderWithProviders, screen } from "__support__/ui"; import { fireEvent, renderWithProviders, screen } from "__support__/ui";
import ChartSettings from "metabase/visualizations/components/ChartSettings"; import {
ChartSettings,
type ChartSettingsProps,
type Widget,
} from "metabase/visualizations/components/ChartSettings";
import registerVisualizations from "metabase/visualizations/register"; import registerVisualizations from "metabase/visualizations/register";
import type { DashboardCard, Series } from "metabase-types/api";
import { import {
createMockCard, createMockCard,
createMockDashboardCard, createMockDashboardCard,
createMockDataset,
createMockVisualizationSettings, createMockVisualizationSettings,
} from "metabase-types/api/mocks"; } from "metabase-types/api/mocks";
import type { ComputedVisualizationSettings } from "../types";
registerVisualizations(); registerVisualizations();
const DEFAULT_PROPS = { const DEFAULT_PROPS = {
series: [ series: [
{ card: { visualization_settings: {} }, data: { rows: [], cols: [] } }, {
card: createMockCard({ visualization_settings: {} }),
...createMockDataset({ data: { rows: [], cols: [] } }),
},
], ],
settings: {}, settings: {},
}; };
function widget(widget = {}) { function widget(widget: Partial<Widget> = {}): Widget {
return { return {
id: "id-" + Math.random(), id: "id-" + Math.random(),
title: "title-" + Math.random(), title: "title-" + Math.random(),
widget: () => null, widget: () => null,
section: "section-" + Math.random(),
props: {},
...widget, ...widget,
}; };
} }
// TODO Use ChartSettingsProps after ChartSettings is converted to TypeScript type SetupOpts = Partial<ChartSettingsProps>;
type SetupOpts = {
series?: Series;
settings?: ComputedVisualizationSettings;
dashcard?: DashboardCard;
widgets?: any[];
initial?: { section: string };
onChange?: (settings: ComputedVisualizationSettings) => void;
};
const setup = (props: SetupOpts) => { const setup = (props: SetupOpts) => {
return renderWithProviders(<ChartSettings {...DEFAULT_PROPS} {...props} />); return renderWithProviders(<ChartSettings {...DEFAULT_PROPS} {...props} />);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import userEvent from "@testing-library/user-event"; import userEvent from "@testing-library/user-event";
import { renderWithProviders, screen, within } from "__support__/ui"; import { renderWithProviders, screen, within } from "__support__/ui";
import ChartSettings from "metabase/visualizations/components/ChartSettings"; import { ChartSettings } from "metabase/visualizations/components/ChartSettings";
import registerVisualizations from "metabase/visualizations/register"; import registerVisualizations from "metabase/visualizations/register";
registerVisualizations(); registerVisualizations();
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import { within } from "@testing-library/react"; import { within } from "@testing-library/react";
import { renderWithProviders, screen } from "__support__/ui"; import { renderWithProviders, screen } from "__support__/ui";
import ChartSettings from "metabase/visualizations/components/ChartSettings"; import { ChartSettings } from "metabase/visualizations/components/ChartSettings";
import registerVisualizations from "metabase/visualizations/register"; import registerVisualizations from "metabase/visualizations/register";
registerVisualizations(); registerVisualizations();
......
// these tests use ChartSettings directly, but logic we're testing lives in ChartNestedSettingSeries // these tests use ChartSettings directly, but logic we're testing lives in ChartNestedSettingSeries
import { renderWithProviders, screen } from "__support__/ui"; import { renderWithProviders, screen } from "__support__/ui";
import ChartSettings from "metabase/visualizations/components/ChartSettings"; import { ChartSettings } from "metabase/visualizations/components/ChartSettings";
import registerVisualizations from "metabase/visualizations/register"; import registerVisualizations from "metabase/visualizations/register";
registerVisualizations(); registerVisualizations();
......
import { createMockMetadata } from "__support__/metadata"; import { createMockMetadata } from "__support__/metadata";
import { renderWithProviders, screen } from "__support__/ui"; import { renderWithProviders, screen } from "__support__/ui";
import ChartSettings from "metabase/visualizations/components/ChartSettings"; import { ChartSettings } from "metabase/visualizations/components/ChartSettings";
import registerVisualizations from "metabase/visualizations/register"; import registerVisualizations from "metabase/visualizations/register";
import Question from "metabase-lib/v1/Question"; import Question from "metabase-lib/v1/Question";
import type { Series } from "metabase-types/api"; import type { Series } from "metabase-types/api";
......
...@@ -4,7 +4,7 @@ import { useState } from "react"; ...@@ -4,7 +4,7 @@ import { useState } from "react";
import { createMockMetadata } from "__support__/metadata"; import { createMockMetadata } from "__support__/metadata";
import { render, screen } from "__support__/ui"; import { render, screen } from "__support__/ui";
import ChartSettings from "metabase/visualizations/components/ChartSettings"; import { ChartSettings } from "metabase/visualizations/components/ChartSettings";
import registerVisualizations from "metabase/visualizations/register"; import registerVisualizations from "metabase/visualizations/register";
import Question from "metabase-lib/v1/Question"; import Question from "metabase-lib/v1/Question";
import { createMockColumn } from "metabase-types/api/mocks"; import { createMockColumn } from "metabase-types/api/mocks";
......
...@@ -4,7 +4,7 @@ import { useState } from "react"; ...@@ -4,7 +4,7 @@ import { useState } from "react";
import { createMockMetadata } from "__support__/metadata"; import { createMockMetadata } from "__support__/metadata";
import { renderWithProviders, screen, within } from "__support__/ui"; import { renderWithProviders, screen, within } from "__support__/ui";
import ChartSettings from "metabase/visualizations/components/ChartSettings"; import { ChartSettings } from "metabase/visualizations/components/ChartSettings";
import registerVisualizations from "metabase/visualizations/register"; import registerVisualizations from "metabase/visualizations/register";
import Question from "metabase-lib/v1/Question"; import Question from "metabase-lib/v1/Question";
import { createMockVisualizationSettings } from "metabase-types/api/mocks"; import { createMockVisualizationSettings } from "metabase-types/api/mocks";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment