Skip to content

Commit 468df37

Browse files
Merge pull request #217 from mercedes-benz/VULCAN-1714/y-axis-toggle-values
feat: y-axis toggle values defined in json
2 parents b7d206c + 0b66959 commit 468df37

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed

src/card/view/CardView.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ const NeoCardView = ({
127127
onToggleCardExpand={onToggleCardExpand}
128128
expanded={expanded}
129129
parameters={getLocalParameters(title)}
130+
updateReportSetting={updateReportSetting}
130131
></NeoCardViewHeader>
131132
);
132133

@@ -292,8 +293,8 @@ const NeoCardView = ({
292293
cardStyle = { backgroundColor: 'var(--palette-dark-surface, #111827)' };
293294
}
294295
} else if (settings?.backgroundColor) {
295-
cardStyle = { backgroundColor: settings.backgroundColor };
296-
}
296+
cardStyle = { backgroundColor: settings.backgroundColor };
297+
}
297298

298299
return (
299300
<div

src/card/view/CardViewHeader.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
InformationCircleIconOutline,
1818
XMarkIconOutline,
1919
MinusIconOutline,
20+
ArrowsRightLeftIconOutline,
2021
} from '@neo4j-ndl/react/icons';
2122

2223
const NeoCardViewHeader = ({
@@ -35,11 +36,24 @@ const NeoCardViewHeader = ({
3536
parameters,
3637
onHandleMinimize,
3738
settings,
39+
updateReportSetting,
3840
}) => {
3941
const [text, setText] = React.useState(title);
4042
const [parsedText, setParsedText] = React.useState(title);
4143
const [editing, setEditing] = React.useState(false);
4244
const [descriptionModalOpen, setDescriptionModalOpen] = React.useState(false);
45+
// Value field toggle button (alternate vs primary) appears when settings.alternateValueField exists.
46+
const valueToggleAvailable = settings?.alternateValueField !== undefined && settings.alternateValueField.length > 0;
47+
const valueFieldMode: 'primary' | 'alternate' = settings?.valueFieldMode || 'primary';
48+
const primaryValueLabel = settings?.valueFieldPrimaryLabel || 'Percentage';
49+
const secondaryValueLabel = settings?.valueFieldSecondaryLabel || 'Count';
50+
const onToggleValueFieldMode = () => {
51+
if (!valueToggleAvailable) {
52+
return;
53+
}
54+
const newMode = valueFieldMode === 'alternate' ? 'primary' : 'alternate';
55+
updateReportSetting && updateReportSetting('valueFieldMode', newMode);
56+
};
4357

4458
function replaceParamsOnString(s, p) {
4559
let parsed: string;
@@ -175,6 +189,17 @@ const NeoCardViewHeader = ({
175189
</Tooltip>
176190
);
177191

192+
const valueToggleButton = (
193+
<Tooltip
194+
title={`Switch to ${valueFieldMode === 'alternate' ? primaryValueLabel : secondaryValueLabel}`}
195+
disableInteractive
196+
>
197+
<IconButton aria-label='toggle value mode' onClick={onToggleValueFieldMode} clean size='medium'>
198+
<ArrowsRightLeftIconOutline />
199+
</IconButton>
200+
</Tooltip>
201+
);
202+
178203
return (
179204
<>
180205
<Dialog
@@ -204,6 +229,7 @@ const NeoCardViewHeader = ({
204229
style={{ height: '72px' }}
205230
action={
206231
<>
232+
{valueToggleAvailable ? valueToggleButton : <></>}
207233
{downloadImageEnabled ? downloadImageButton : <></>}
208234
{fullscreenEnabled ? expanded ? unMaximizeButton : maximizeButton : <></>}
209235
{settings.minimizable && minimizeButton}

src/chart/bar/BarChart.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ const NeoBarChart = (props: ChartProps) => {
4141
const enableLabel = settings.barValues ? settings.barValues : false;
4242
const positionLabel = settings.positionLabel ? settings.positionLabel : 'off';
4343

44+
// New value toggle related settings (primary vs alternate numeric field)
45+
const { alternateValueField } = settings; // optional second numeric field name
46+
const valueFieldModeSetting = settings.valueFieldMode ? settings.valueFieldMode : 'primary';
47+
const [localValueFieldMode] = React.useState<string>(valueFieldModeSetting);
48+
const valueFieldMode = settings.valueFieldMode ? valueFieldModeSetting : localValueFieldMode;
49+
const currentValueField =
50+
valueFieldMode === 'alternate' && alternateValueField ? alternateValueField : selection?.value;
51+
4452
// TODO: we should make all these defaults be loaded from the config file.
4553
const layout = settings.layout ? settings.layout : 'vertical';
4654
const colorScheme = settings.colors ? settings.colors : 'set2';
@@ -66,9 +74,10 @@ const NeoBarChart = (props: ChartProps) => {
6674
}
6775
const index = convertRecordObjectToString(row.get(selection.index));
6876
const idx = data.findIndex((item) => item.index === index);
69-
77+
// Keep key name stable even when toggling value field
7078
const key = selection.key !== '(none)' ? recordToNative(row.get(selection.key)) : selection.value;
71-
const rawValue = recordToNative(row.get(selection.value));
79+
// Retrieve value from currentValueField (primary or alternate)
80+
const rawValue = recordToNative(row.get(currentValueField));
7281
const value = rawValue !== null ? rawValue : 0.0000001;
7382
if (isNaN(value)) {
7483
return data;
@@ -99,7 +108,7 @@ const NeoBarChart = (props: ChartProps) => {
99108
});
100109
setKeys(Object.keys(newKeys));
101110
setData(newData);
102-
}, [selection]);
111+
}, [selection, currentValueField, records]);
103112

104113
if (!selection || props.records == null || props.records.length == 0 || props.records[0].keys == null) {
105114
return <NoDrawableDataErrorMessage />;
@@ -176,8 +185,13 @@ const NeoBarChart = (props: ChartProps) => {
176185
return chartColorsByScheme[colorIndex];
177186
}
178187
dict[selection.index] = bar.indexValue;
179-
dict[selection.value] = bar.value;
180-
dict[selection.key] = bar.id;
188+
// Populate current numeric field for styling rules
189+
if (currentValueField) {
190+
dict[currentValueField] = bar.value;
191+
}
192+
if (selection.key) {
193+
dict[selection.key] = bar.id;
194+
}
181195
const validRuleIndex = evaluateRulesOnDict(dict, styleRules, ['bar color']);
182196
if (validRuleIndex !== -1) {
183197
return styleRules[validRuleIndex].customizationValue;
@@ -387,7 +401,7 @@ const NeoBarChart = (props: ChartProps) => {
387401
<BarChartComponent
388402
theme={canvas ? themeNivoCanvas(props.theme) : themeNivo}
389403
data={data}
390-
key={`${selection.index}___${selection.value}`}
404+
key={`${selection.index}___${currentValueField}`}
391405
layout={layout}
392406
groupMode={groupMode == 'stacked' ? 'stacked' : 'grouped'}
393407
enableLabel={enableLabel}

0 commit comments

Comments
 (0)