Hidden series stay hidden in legend when toggling visibility (#54139)

This commit is contained in:
Victor Marin 2022-08-31 13:49:24 +03:00 committed by GitHub
parent e95bab1f2b
commit 51e2f57ac9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 39 additions and 3 deletions

View File

@ -1,9 +1,11 @@
import {
ByNamesMatcherMode,
ConfigOverrideRule,
DataFrame,
DynamicConfigValue,
FieldConfigSource,
FieldMatcherID,
fieldMatchers,
FieldType,
getFieldDisplayName,
isSystemOverrideWithRef,
@ -27,7 +29,7 @@ export function seriesVisibilityConfigFactory(
if (currentIndex < 0) {
if (mode === SeriesVisibilityChangeMode.ToggleSelection) {
const override = createOverride([displayName]);
const override = createOverride([displayName, ...getNamesOfHiddenFields(overrides, data)]);
return {
...fieldConfig,
@ -48,7 +50,12 @@ export function seriesVisibilityConfigFactory(
const [current] = overridesCopy.splice(currentIndex, 1) as SystemConfigOverrideRule[];
if (mode === SeriesVisibilityChangeMode.ToggleSelection) {
const existing = getExistingDisplayNames(current);
let existing = getExistingDisplayNames(current);
const nameOfHiddenFields = getNamesOfHiddenFields(overridesCopy, data);
if (nameOfHiddenFields.length > 0) {
existing = existing.filter((el) => nameOfHiddenFields.indexOf(el) < 0);
}
if (existing[0] === displayName && existing.length === 1) {
return {
@ -57,7 +64,7 @@ export function seriesVisibilityConfigFactory(
};
}
const override = createOverride([displayName]);
const override = createOverride([displayName, ...nameOfHiddenFields]);
return {
...fieldConfig,
@ -169,3 +176,32 @@ const getDisplayNames = (data: DataFrame[], excludeName?: string): string[] => {
return Array.from(unique);
};
const getNamesOfHiddenFields = (overrides: ConfigOverrideRule[], data: DataFrame[]): string[] => {
let names: string[] = [];
for (const override of overrides) {
const property = override.properties.find((p) => p.id === 'custom.hideFrom');
if (property !== undefined && property.value?.legend === true) {
const info = fieldMatchers.get(override.matcher.id);
const matcher = info.get(override.matcher.options);
for (const frame of data) {
for (const field of frame.fields) {
if (field.type !== FieldType.number) {
continue;
}
const name = getFieldDisplayName(field, frame, data);
if (matcher(field, frame, data)) {
names.push(name);
}
}
}
}
}
return names;
};