Skip to content
Snippets Groups Projects
Unverified Commit 2a57e9e2 authored by Nick Fitzpatrick's avatar Nick Fitzpatrick Committed by GitHub
Browse files

Adding Color Picker for Metrics (#26486)

* Adding Color Picker for Metrics

* Adding support for breakout charts

* Addressing some PR Feedback

* Adding pillSize to color picker components

* Moving updateSeriesColor logic to visualizations/lib

* Typing viz/lib/series

* Final PR Feedback adjustments
parent ac76c031
No related branches found
No related tags found
No related merge requests found
Showing
with 146 additions and 15 deletions
import styled from "@emotion/styled"; import styled from "@emotion/styled";
import { css } from "@emotion/react";
import { color } from "metabase/lib/colors"; import { color } from "metabase/lib/colors";
import { PillSize } from "./types";
export interface ColorPillRootProps { export interface ColorPillRootProps {
isAuto: boolean; isAuto: boolean;
isSelected: boolean; isSelected: boolean;
pillSize: PillSize;
} }
export const ColorPillRoot = styled.div<ColorPillRootProps>` export const ColorPillRoot = styled.div<ColorPillRootProps>`
...@@ -21,6 +26,17 @@ export const ColorPillRoot = styled.div<ColorPillRootProps>` ...@@ -21,6 +26,17 @@ export const ColorPillRoot = styled.div<ColorPillRootProps>`
border-color: ${props => border-color: ${props =>
props.isSelected ? color("text-dark") : color("text-light")}; props.isSelected ? color("text-dark") : color("text-light")};
} }
${props =>
props.pillSize === "small" &&
css`
padding: 1px;
${ColorPillContent} {
height: 0.875rem;
width: 0.875rem;
}
`};
`; `;
export const ColorPillContent = styled.div` export const ColorPillContent = styled.div`
......
...@@ -6,6 +6,7 @@ import React, { ...@@ -6,6 +6,7 @@ import React, {
useCallback, useCallback,
} from "react"; } from "react";
import { ColorPillContent, ColorPillRoot } from "./ColorPill.styled"; import { ColorPillContent, ColorPillRoot } from "./ColorPill.styled";
import { PillSize } from "./types";
export type ColorPillAttributes = Omit< export type ColorPillAttributes = Omit<
HTMLAttributes<HTMLDivElement>, HTMLAttributes<HTMLDivElement>,
...@@ -17,6 +18,7 @@ export interface ColorPillProps extends ColorPillAttributes { ...@@ -17,6 +18,7 @@ export interface ColorPillProps extends ColorPillAttributes {
isAuto?: boolean; isAuto?: boolean;
isSelected?: boolean; isSelected?: boolean;
onSelect?: (newColor: string) => void; onSelect?: (newColor: string) => void;
pillSize?: PillSize;
} }
const ColorPill = forwardRef(function ColorPill( const ColorPill = forwardRef(function ColorPill(
...@@ -25,6 +27,7 @@ const ColorPill = forwardRef(function ColorPill( ...@@ -25,6 +27,7 @@ const ColorPill = forwardRef(function ColorPill(
isAuto = false, isAuto = false,
isSelected = true, isSelected = true,
"aria-label": ariaLabel = color, "aria-label": ariaLabel = color,
pillSize = "medium",
onClick, onClick,
onSelect, onSelect,
...props ...props
...@@ -47,10 +50,14 @@ const ColorPill = forwardRef(function ColorPill( ...@@ -47,10 +50,14 @@ const ColorPill = forwardRef(function ColorPill(
isSelected={isSelected} isSelected={isSelected}
aria-label={ariaLabel} aria-label={ariaLabel}
onClick={handleClick} onClick={handleClick}
pillSize={pillSize}
> >
<ColorPillContent style={{ backgroundColor: color }} /> <ColorPillContent style={{ backgroundColor: color }} />
</ColorPillRoot> </ColorPillRoot>
); );
}); });
export default ColorPill; export default Object.assign(ColorPill, {
Content: ColorPillContent,
Root: ColorPillRoot,
});
export type PillSize = "small" | "medium";
...@@ -11,6 +11,7 @@ import Radio from "metabase/core/components/Radio"; ...@@ -11,6 +11,7 @@ import Radio from "metabase/core/components/Radio";
import Visualization from "metabase/visualizations/components/Visualization"; import Visualization from "metabase/visualizations/components/Visualization";
import { getSettingsWidgetsForSeries } from "metabase/visualizations/lib/settings/visualization"; import { getSettingsWidgetsForSeries } from "metabase/visualizations/lib/settings/visualization";
import { updateSeriesColor } from "metabase/visualizations/lib/series";
import * as MetabaseAnalytics from "metabase/lib/analytics"; import * as MetabaseAnalytics from "metabase/lib/analytics";
import { import {
getVisualizationTransformed, getVisualizationTransformed,
...@@ -112,6 +113,12 @@ class ChartSettings extends Component { ...@@ -112,6 +113,12 @@ class ChartSettings extends Component {
this.props.onChange(updateSettings(this._getSettings(), changedSettings)); this.props.onChange(updateSettings(this._getSettings(), changedSettings));
}; };
handleChangeSeriesColor = (seriesKey, color) => {
this.props.onChange(
updateSeriesColor(this._getSettings(), seriesKey, color),
);
};
handleDone = () => { handleDone = () => {
this.props.onDone(this._getSettings()); this.props.onDone(this._getSettings());
this.props.onClose(); this.props.onClose();
...@@ -302,6 +309,8 @@ class ChartSettings extends Component { ...@@ -302,6 +309,8 @@ class ChartSettings extends Component {
onEndShowWidget: this.handleEndShowWidget, onEndShowWidget: this.handleEndShowWidget,
currentSectionHasColumnSettings, currentSectionHasColumnSettings,
columnHasSettings: col => this.columnHasSettings(col), columnHasSettings: col => this.columnHasSettings(col),
onChangeSeriesColor: (seriesKey, color) =>
this.handleChangeSeriesColor(seriesKey, color),
}; };
const sectionPicker = ( const sectionPicker = (
......
/* eslint-disable react/prop-types */ /* eslint-disable react/prop-types */
import React from "react"; import React from "react";
import cx from "classnames";
import { getAccentColors } from "metabase/lib/colors/groups"; import { getAccentColors } from "metabase/lib/colors/groups";
import ColorSelector from "metabase/core/components/ColorSelector"; import ColorSelector from "metabase/core/components/ColorSelector";
export default function ChartSettingColorPicker(props) { export default function ChartSettingColorPicker(props) {
const { value, onChange } = props; const { value, onChange, className, pillSize } = props;
return ( return (
<div className="flex align-center mb1"> <div className={cx("flex align-center mb1", className)}>
<ColorSelector <ColorSelector
value={value} value={value}
colors={getAccentColors()} colors={getAccentColors()}
onChange={onChange} onChange={onChange}
pillSize={pillSize}
/> />
{props.title && <h4 className="ml1">{props.title}</h4>} {props.title && <h4 className="ml1">{props.title}</h4>}
</div> </div>
......
...@@ -2,11 +2,13 @@ ...@@ -2,11 +2,13 @@
import React from "react"; import React from "react";
import { t } from "ttag"; import { t } from "ttag";
import _ from "underscore"; import _ from "underscore";
import { keyForSingleSeries } from "metabase/visualizations/lib/settings/series";
import { getColumnKey } from "metabase-lib/queries/utils/get-column-key"; import { getColumnKey } from "metabase-lib/queries/utils/get-column-key";
import ChartSettingSelect from "./ChartSettingSelect"; import ChartSettingSelect from "./ChartSettingSelect";
import { import {
SettingsIcon, SettingsIcon,
ChartSettingFieldPickerRoot, ChartSettingFieldPickerRoot,
FieldPickerColorPicker,
} from "./ChartSettingFieldPicker.styled"; } from "./ChartSettingFieldPicker.styled";
const ChartSettingFieldPicker = ({ const ChartSettingFieldPicker = ({
...@@ -20,6 +22,10 @@ const ChartSettingFieldPicker = ({ ...@@ -20,6 +22,10 @@ const ChartSettingFieldPicker = ({
showColumnSetting, showColumnSetting,
showDragHandle, showDragHandle,
columnHasSettings, columnHasSettings,
showColorPicker,
colors,
series,
onChangeSeriesColor,
}) => { }) => {
let columnKey; let columnKey;
if (value && showColumnSetting && columns) { if (value && showColumnSetting && columns) {
...@@ -28,6 +34,17 @@ const ChartSettingFieldPicker = ({ ...@@ -28,6 +34,17 @@ const ChartSettingFieldPicker = ({
columnKey = getColumnKey(column); columnKey = getColumnKey(column);
} }
} }
let seriesKey;
if (series && columnKey && showColorPicker) {
const seriesForColumn = series.find(single => {
const metricColumn = single.data.cols[1];
return getColumnKey(metricColumn) === columnKey;
});
if (seriesForColumn) {
seriesKey = keyForSingleSeries(seriesForColumn);
}
}
return ( return (
<ChartSettingFieldPickerRoot <ChartSettingFieldPickerRoot
className={className} className={className}
...@@ -37,6 +54,15 @@ const ChartSettingFieldPicker = ({ ...@@ -37,6 +54,15 @@ const ChartSettingFieldPicker = ({
{showDragHandle && ( {showDragHandle && (
<SettingsIcon name="grabber2" size={12} noPointer noMargin /> <SettingsIcon name="grabber2" size={12} noPointer noMargin />
)} )}
{showColorPicker && seriesKey && (
<FieldPickerColorPicker
pillSize="small"
value={colors[seriesKey]}
onChange={value => {
onChangeSeriesColor(seriesKey, value);
}}
/>
)}
<ChartSettingSelect <ChartSettingSelect
value={value} value={value}
options={options} options={options}
......
...@@ -3,6 +3,8 @@ import { color } from "metabase/lib/colors"; ...@@ -3,6 +3,8 @@ import { color } from "metabase/lib/colors";
import Icon from "metabase/components/Icon"; import Icon from "metabase/components/Icon";
import SelectButton from "metabase/core/components/SelectButton"; import SelectButton from "metabase/core/components/SelectButton";
import Triggerable from "metabase/components/Triggerable"; import Triggerable from "metabase/components/Triggerable";
import ColorPill from "metabase/core/components/ColorPill";
import ChartSettingColorPicker from "./ChartSettingColorPicker";
interface ChartSettingFieldPickerRootProps { interface ChartSettingFieldPickerRootProps {
disabled: boolean; disabled: boolean;
...@@ -65,3 +67,8 @@ export const SettingsIcon = styled(Icon)<SettingsIconProps>` ...@@ -65,3 +67,8 @@ export const SettingsIcon = styled(Icon)<SettingsIconProps>`
color: ${color("brand")}; color: ${color("brand")};
} }
`; `;
export const FieldPickerColorPicker = styled(ChartSettingColorPicker)`
margin-bottom: 0;
margin-left: 0.25rem;
`;
...@@ -10,6 +10,7 @@ import ColumnItem from "./ColumnItem"; ...@@ -10,6 +10,7 @@ import ColumnItem from "./ColumnItem";
interface SortableItem { interface SortableItem {
enabled: boolean; enabled: boolean;
color?: string;
} }
interface SortableColumnFunctions<T> { interface SortableColumnFunctions<T> {
...@@ -19,6 +20,7 @@ interface SortableColumnFunctions<T> { ...@@ -19,6 +20,7 @@ interface SortableColumnFunctions<T> {
onAdd?: (item: T) => void; onAdd?: (item: T) => void;
onEnable?: (item: T) => void; onEnable?: (item: T) => void;
getItemName: (item: T) => string; getItemName: (item: T) => string;
onColorChange?: (item: T, color: string) => void;
} }
interface SortableColumnProps<T> extends SortableColumnFunctions<T> { interface SortableColumnProps<T> extends SortableColumnFunctions<T> {
...@@ -35,6 +37,7 @@ const SortableColumn = SortableElement(function SortableColumn< ...@@ -35,6 +37,7 @@ const SortableColumn = SortableElement(function SortableColumn<
onClick, onClick,
onAdd, onAdd,
onEnable, onEnable,
onColorChange,
}: SortableColumnProps<T>) { }: SortableColumnProps<T>) {
return ( return (
<ColumnItem <ColumnItem
...@@ -48,6 +51,10 @@ const SortableColumn = SortableElement(function SortableColumn< ...@@ -48,6 +51,10 @@ const SortableColumn = SortableElement(function SortableColumn<
onClick={onClick ? () => onClick(item) : null} onClick={onClick ? () => onClick(item) : null}
onAdd={onAdd ? () => onAdd(item) : null} onAdd={onAdd ? () => onAdd(item) : null}
onEnable={onEnable && !item.enabled ? () => onEnable(item) : null} onEnable={onEnable && !item.enabled ? () => onEnable(item) : null}
onColorChange={
onColorChange ? (color: string) => onColorChange(item, color) : null
}
color={item.color}
draggable draggable
/> />
); );
...@@ -69,6 +76,7 @@ const SortableColumnList = SortableContainer(function SortableColumnList< ...@@ -69,6 +76,7 @@ const SortableColumnList = SortableContainer(function SortableColumnList<
onRemove, onRemove,
onEnable, onEnable,
onAdd, onAdd,
onColorChange,
}: SortableColumnListProps<T>) { }: SortableColumnListProps<T>) {
return ( return (
<div> <div>
...@@ -82,6 +90,7 @@ const SortableColumnList = SortableContainer(function SortableColumnList< ...@@ -82,6 +90,7 @@ const SortableColumnList = SortableContainer(function SortableColumnList<
onRemove={onRemove} onRemove={onRemove}
onEnable={onEnable} onEnable={onEnable}
onAdd={onAdd} onAdd={onAdd}
onColorChange={onColorChange}
/> />
))} ))}
</div> </div>
...@@ -110,6 +119,7 @@ export function ChartSettingOrderedItems<T extends SortableItem>({ ...@@ -110,6 +119,7 @@ export function ChartSettingOrderedItems<T extends SortableItem>({
onClick, onClick,
getItemName, getItemName,
items, items,
onColorChange,
}: ChartSettingOrderedItemsProps<T>) { }: ChartSettingOrderedItemsProps<T>) {
return ( return (
<SortableColumnList <SortableColumnList
...@@ -122,6 +132,7 @@ export function ChartSettingOrderedItems<T extends SortableItem>({ ...@@ -122,6 +132,7 @@ export function ChartSettingOrderedItems<T extends SortableItem>({
onEnable={onEnable} onEnable={onEnable}
onClick={onClick} onClick={onClick}
onSortEnd={onSortEnd} onSortEnd={onSortEnd}
onColorChange={onColorChange}
distance={5} distance={5}
/> />
); );
......
...@@ -14,6 +14,7 @@ interface SortableItem { ...@@ -14,6 +14,7 @@ interface SortableItem {
enabled: boolean; enabled: boolean;
originalIndex: number; originalIndex: number;
name: string; name: string;
color?: string;
} }
interface ChartSettingOrderedSimpleProps { interface ChartSettingOrderedSimpleProps {
...@@ -26,6 +27,7 @@ interface ChartSettingOrderedSimpleProps { ...@@ -26,6 +27,7 @@ interface ChartSettingOrderedSimpleProps {
) => void; ) => void;
series: Series; series: Series;
hasEditSettings: boolean; hasEditSettings: boolean;
onChangeSeriesColor: (seriesKey: string, color: string) => void;
} }
export const ChartSettingOrderedSimple = ({ export const ChartSettingOrderedSimple = ({
...@@ -35,6 +37,7 @@ export const ChartSettingOrderedSimple = ({ ...@@ -35,6 +37,7 @@ export const ChartSettingOrderedSimple = ({
series, series,
onShowWidget, onShowWidget,
hasEditSettings = true, hasEditSettings = true,
onChangeSeriesColor,
}: ChartSettingOrderedSimpleProps) => { }: ChartSettingOrderedSimpleProps) => {
const toggleDisplay = (selectedItem: SortableItem) => { const toggleDisplay = (selectedItem: SortableItem) => {
const index = orderedItems.findIndex( const index = orderedItems.findIndex(
...@@ -71,16 +74,26 @@ export const ChartSettingOrderedSimple = ({ ...@@ -71,16 +74,26 @@ export const ChartSettingOrderedSimple = ({
); );
}; };
const handleColorChange = (item: SortableItem, color: string) => {
const singleSeries = series[item.originalIndex];
const seriesKey = keyForSingleSeries(singleSeries);
onChangeSeriesColor(seriesKey, color);
};
return ( return (
<ChartSettingOrderedSimpleRoot> <ChartSettingOrderedSimpleRoot>
{orderedItems.length > 0 ? ( {orderedItems.length > 0 ? (
<ChartSettingOrderedItems <ChartSettingOrderedItems
items={orderedItems} items={orderedItems.map(item => ({
...item,
color: items[item.originalIndex].color,
}))}
getItemName={getItemTitle} getItemName={getItemTitle}
onRemove={toggleDisplay} onRemove={toggleDisplay}
onEnable={toggleDisplay} onEnable={toggleDisplay}
onSortEnd={handleSortEnd} onSortEnd={handleSortEnd}
onEdit={hasEditSettings ? handleOnEdit : undefined} onEdit={hasEditSettings ? handleOnEdit : undefined}
onColorChange={handleColorChange}
distance={5} distance={5}
/> />
) : ( ) : (
......
...@@ -8,6 +8,7 @@ import { ...@@ -8,6 +8,7 @@ import {
ColumnItemContainer, ColumnItemContainer,
ColumnItemRoot, ColumnItemRoot,
ColumnItemDragHandle, ColumnItemDragHandle,
ColumnItemColorPicker,
} from "./ColumnItem.styled"; } from "./ColumnItem.styled";
const ActionIcon = ({ icon, onClick }) => ( const ActionIcon = ({ icon, onClick }) => (
...@@ -22,11 +23,13 @@ const ActionIcon = ({ icon, onClick }) => ( ...@@ -22,11 +23,13 @@ const ActionIcon = ({ icon, onClick }) => (
const ColumnItem = ({ const ColumnItem = ({
title, title,
color,
onAdd, onAdd,
onRemove, onRemove,
onClick, onClick,
onEdit, onEdit,
onEnable, onEnable,
onColorChange,
draggable, draggable,
className = "", className = "",
}) => { }) => {
...@@ -39,6 +42,13 @@ const ColumnItem = ({ ...@@ -39,6 +42,13 @@ const ColumnItem = ({
> >
<ColumnItemContainer> <ColumnItemContainer>
{draggable && <ColumnItemDragHandle name="grabber2" size={12} />} {draggable && <ColumnItemDragHandle name="grabber2" size={12} />}
{onColorChange && color && (
<ColumnItemColorPicker
value={color}
onChange={onColorChange}
pillSize="small"
/>
)}
<ColumnItemContent> <ColumnItemContent>
<ColumnItemSpan>{title}</ColumnItemSpan> <ColumnItemSpan>{title}</ColumnItemSpan>
{onEdit && <ActionIcon icon="ellipsis" onClick={onEdit} />} {onEdit && <ActionIcon icon="ellipsis" onClick={onEdit} />}
......
...@@ -2,6 +2,8 @@ import styled from "@emotion/styled"; ...@@ -2,6 +2,8 @@ import styled from "@emotion/styled";
import { color } from "metabase/lib/colors"; import { color } from "metabase/lib/colors";
import Icon from "metabase/components/Icon"; import Icon from "metabase/components/Icon";
import ColorPill from "metabase/core/components/ColorPill";
import ChartSettingColorPicker from "./ChartSettingColorPicker";
interface ColumnItemRootProps { interface ColumnItemRootProps {
isDraggable: boolean; isDraggable: boolean;
...@@ -74,3 +76,8 @@ export const ColumnItemIcon = styled(Icon)` ...@@ -74,3 +76,8 @@ export const ColumnItemIcon = styled(Icon)`
export const ColumnItemDragHandle = styled(Icon)` export const ColumnItemDragHandle = styled(Icon)`
color: ${color("text-medium")}; color: ${color("text-medium")};
`; `;
export const ColumnItemColorPicker = styled(ChartSettingColorPicker)`
margin-bottom: 0;
margin-left: 0.25rem;
`;
import { assocIn } from "icepick";
import { VisualizationSettings } from "metabase-types/api/card";
import { SETTING_ID } from "./settings/series";
export const updateSeriesColor = (
settings: VisualizationSettings,
seriesKey: string,
color: string,
) => {
return assocIn(settings, [SETTING_ID, seriesKey, "color"], color);
};
...@@ -131,6 +131,7 @@ function getSettingWidget( ...@@ -131,6 +131,7 @@ function getSettingWidget(
onChangeSettings(newSettings); onChangeSettings(newSettings);
}; };
if (settingDef.useRawSeries && object._raw) { if (settingDef.useRawSeries && object._raw) {
extra.transformedSeries = object;
object = object._raw; object = object._raw;
} }
return { return {
......
...@@ -174,11 +174,13 @@ export const GRAPH_DATA_SETTINGS = { ...@@ -174,11 +174,13 @@ export const GRAPH_DATA_SETTINGS = {
}, },
getProps: (series, settings) => { getProps: (series, settings) => {
const seriesSettings = settings["series_settings"] || {}; const seriesSettings = settings["series_settings"] || {};
const seriesColors = settings["series_settings.colors"] || {};
const keys = series.map(s => keyForSingleSeries(s)); const keys = series.map(s => keyForSingleSeries(s));
return { return {
items: keys.map((key, index) => ({ items: keys.map((key, index) => ({
name: seriesSettings[key]?.title || key, name: seriesSettings[key]?.title || key,
originalIndex: index, originalIndex: index,
color: seriesColors[key],
})), })),
series, series,
}; };
...@@ -187,6 +189,7 @@ export const GRAPH_DATA_SETTINGS = { ...@@ -187,6 +189,7 @@ export const GRAPH_DATA_SETTINGS = {
return settings["graph.dimensions"]?.length < 2 || series.length > 20; return settings["graph.dimensions"]?.length < 2 || series.length > 20;
}, },
dashboard: false, dashboard: false,
readDependencies: ["series_settings.colors"],
}, },
"graph.metrics": { "graph.metrics": {
section: t`Data`, section: t`Data`,
...@@ -206,9 +209,9 @@ export const GRAPH_DATA_SETTINGS = { ...@@ -206,9 +209,9 @@ export const GRAPH_DATA_SETTINGS = {
vizSettings["graph._metric_filter"], vizSettings["graph._metric_filter"],
), ),
), ),
getDefault: (series, vizSettings) => getDefaultColumns(series).metrics, getDefault: series => getDefaultColumns(series).metrics,
persistDefault: true, persistDefault: true,
getProps: ([{ card, data }], vizSettings) => { getProps: ([{ card, data }], vizSettings, _onChange, extra) => {
const options = data.cols const options = data.cols
.filter(vizSettings["graph._metric_filter"]) .filter(vizSettings["graph._metric_filter"])
.map(getOptionFromColumn); .map(getOptionFromColumn);
...@@ -230,9 +233,16 @@ export const GRAPH_DATA_SETTINGS = { ...@@ -230,9 +233,16 @@ export const GRAPH_DATA_SETTINGS = {
addAnother: canAddAnother ? t`Add another series` : null, addAnother: canAddAnother ? t`Add another series` : null,
columns: data.cols, columns: data.cols,
showColumnSetting: true, showColumnSetting: true,
showColorPicker: !hasBreakout,
colors: vizSettings["series_settings.colors"],
series: extra.transformedSeries,
}; };
}, },
readDependencies: ["graph._dimension_filter", "graph._metric_filter"], readDependencies: [
"graph._dimension_filter",
"graph._metric_filter",
"series_settings.colors",
],
writeDependencies: ["graph.dimensions"], writeDependencies: ["graph.dimensions"],
dashboard: false, dashboard: false,
useRawSeries: true, useRawSeries: true,
......
...@@ -14,14 +14,14 @@ export function keyForSingleSeries(single) { ...@@ -14,14 +14,14 @@ export function keyForSingleSeries(single) {
const LINE_DISPLAY_TYPES = new Set(["line", "area"]); const LINE_DISPLAY_TYPES = new Set(["line", "area"]);
export const SETTING_ID = "series_settings";
export const COLOR_SETTING_ID = "series_settings.colors";
export function seriesSetting({ export function seriesSetting({
readDependencies = [], readDependencies = [],
noPadding, noPadding,
...def ...def
} = {}) { } = {}) {
const settingId = "series_settings";
const colorSettingId = "series_settings.colors";
const COMMON_SETTINGS = { const COMMON_SETTINGS = {
// title, and color don't need widgets because they're handled direclty in ChartNestedSettingSeries // title, and color don't need widgets because they're handled direclty in ChartNestedSettingSeries
title: { title: {
...@@ -69,7 +69,7 @@ export function seriesSetting({ ...@@ -69,7 +69,7 @@ export function seriesSetting({
color: { color: {
getDefault: (single, settings, { settings: vizSettings }) => getDefault: (single, settings, { settings: vizSettings }) =>
// get the color for series key, computed in the setting // get the color for series key, computed in the setting
getIn(vizSettings, [colorSettingId, keyForSingleSeries(single)]), getIn(vizSettings, [COLOR_SETTING_ID, keyForSingleSeries(single)]),
}, },
"line.interpolate": { "line.interpolate": {
title: t`Line style`, title: t`Line style`,
...@@ -156,7 +156,7 @@ export function seriesSetting({ ...@@ -156,7 +156,7 @@ export function seriesSetting({
} }
return { return {
...nestedSettings(settingId, { ...nestedSettings(SETTING_ID, {
getHidden: ([{ card }], settings, { isDashboard }) => getHidden: ([{ card }], settings, { isDashboard }) =>
!isDashboard || card?.display === "waterfall", !isDashboard || card?.display === "waterfall",
getSection: (series, settings, { isDashboard }) => getSection: (series, settings, { isDashboard }) =>
...@@ -166,17 +166,17 @@ export function seriesSetting({ ...@@ -166,17 +166,17 @@ export function seriesSetting({
getObjectKey: keyForSingleSeries, getObjectKey: keyForSingleSeries,
getSettingDefinitionsForObject: getSettingDefinitionsForSingleSeries, getSettingDefinitionsForObject: getSettingDefinitionsForSingleSeries,
component: ChartNestedSettingSeries, component: ChartNestedSettingSeries,
readDependencies: [colorSettingId, ...readDependencies], readDependencies: [COLOR_SETTING_ID, ...readDependencies],
noPadding: true, noPadding: true,
...def, ...def,
}), }),
// colors must be computed as a whole rather than individually // colors must be computed as a whole rather than individually
[colorSettingId]: { [COLOR_SETTING_ID]: {
getValue(series, settings) { getValue(series, settings) {
const keys = series.map(single => keyForSingleSeries(single)); const keys = series.map(single => keyForSingleSeries(single));
const assignments = _.chain(keys) const assignments = _.chain(keys)
.map(key => [key, getIn(settings, [settingId, key, "color"])]) .map(key => [key, getIn(settings, [SETTING_ID, key, "color"])])
.filter(([key, color]) => color != null) .filter(([key, color]) => color != null)
.object() .object()
.value(); .value();
......
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