Skip to content

Commit 6a3b0c4

Browse files
authored
Fix duplicate chart fields when replacing a dataset (#1776)
1 parent 72a7521 commit 6a3b0c4

File tree

5 files changed

+44
-14
lines changed

5 files changed

+44
-14
lines changed

src/ui/units/wizard/actions/preview.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export function setUpdates({updates}: {updates: Update[]}): SetUpdatesAction {
7272

7373
type ActualizeAndSetUpdatesArgs = {
7474
updates: Update[];
75-
onUpdateItemsGuids?: string[];
75+
onUpdateItemsGuids?: {guid: string; datasetId?: string}[];
7676
shouldMergeUpdatesFromState?: boolean;
7777
};
7878

src/ui/units/wizard/actions/utils/getDatasetUpdates.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,19 @@ function isDeleteUpdate(update: Update) {
6767
return update.action === 'delete' || update.action === 'delete_field';
6868
}
6969

70-
function mergeUpdates(prevUpdates: Update[], updates: Update[], datasetId: string) {
70+
function mergeUpdates(args: {
71+
prevUpdates: Update[];
72+
updates: Update[];
73+
datasetId: string;
74+
availableDatasetIds: string[];
75+
}) {
76+
const {prevUpdates, updates, datasetId, availableDatasetIds} = args;
77+
const usedDatasetIds = new Set([...availableDatasetIds, datasetId]);
7178
// Here we delete the old updates that are not relevant, so as not to store them,
7279
const filteredOldUpdates = prevUpdates.reduceRight((acc: Update[], newestOldUpdate) => {
7380
const needsDelete =
81+
(newestOldUpdate.field.datasetId &&
82+
!usedDatasetIds.has(newestOldUpdate.field.datasetId)) ||
7483
isDeleteUpdate(newestOldUpdate) ||
7584
updates.some((newUpdate: Update) => {
7685
const fieldDatasetId = newUpdate.field.datasetId || datasetId;
@@ -353,7 +362,12 @@ export function getDatasetUpdates(args: UpdateDatasetArgs) {
353362
});
354363

355364
result.schema = newResultSchema;
356-
result.updates = mergeUpdates(oldUpdates, updates, dataset.id);
365+
result.updates = mergeUpdates({
366+
prevUpdates: oldUpdates,
367+
updates,
368+
datasetId: dataset.id,
369+
availableDatasetIds: prevDatasets.map((d) => d.id),
370+
});
357371
result.dimensions = dimensions;
358372
result.measures = measures;
359373
result.hierarchies = validateHierarchies({

src/ui/units/wizard/containers/Wizard/SectionVisualization/PlaceholdersContainer/Placeholder/Placeholder.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {Gear} from '@gravity-ui/icons';
44
import type {IconData, IconProps} from '@gravity-ui/uikit';
55
import {Icon, Popover} from '@gravity-ui/uikit';
66
import {i18n} from 'i18n';
7+
import pick from 'lodash/pick';
78
import type {ConnectableElement} from 'react-dnd';
89
import {connect} from 'react-redux';
910
import type {Dispatch} from 'redux';
@@ -223,7 +224,7 @@ class PlaceholderComponent extends React.PureComponent<Props> {
223224
) => {
224225
const items = args[0];
225226

226-
const onUpdateItemsGuids = items.map((item: Field) => item.guid);
227+
const onUpdateItemsGuids = items.map((item: Field) => pick(item, 'guid', 'datasetId'));
227228

228229
this.props.actualizeAndSetUpdates({updates: this.props.updates, onUpdateItemsGuids});
229230
this.props.onUpdate(...args);

src/ui/units/wizard/utils/__tests__/helpers.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ describe('actualizeUpdates', () => {
187187

188188
const expectedResult = [{field: {guid: '7', quickFormula: true}}, {field: {guid: '4'}}];
189189

190-
const MOCKED_ON_UPDATES_ITEMS_GUIDS = ['4', '7'];
190+
const MOCKED_ON_UPDATES_ITEMS_GUIDS = [{guid: '4'}, {guid: '7'}];
191191

192192
const result = actualizeUpdates({
193193
updates,

src/ui/units/wizard/utils/helpers.ts

+24-9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
SquareLetterT,
1212
} from '@gravity-ui/icons';
1313
import {i18n} from 'i18n';
14+
import {pick} from 'lodash';
1415
import isEqual from 'lodash/isEqual';
1516
import type {
1617
CommonNumberFormattingOptions,
@@ -440,7 +441,7 @@ type ActualizaeUpdatesArgs = {
440441
visualization?: Shared['visualization'];
441442
sectionDatasetFields: Field[];
442443
visualizationFields: Field[];
443-
onUpdateItemsGuids?: string[];
444+
onUpdateItemsGuids?: {guid: string; datasetId?: string}[];
444445
};
445446

446447
export function actualizeUpdates({
@@ -456,28 +457,42 @@ export function actualizeUpdates({
456457
return updates;
457458
}
458459

459-
const sectionDatasetFieldsGuids = new Set(sectionDatasetFields.map((field) => field.guid));
460+
const getFieldKey = (field: {guid: string; datasetId?: string}) =>
461+
`${field.datasetId}__${field.guid}`;
460462

461-
const placeholders: Placeholder[] = currentVisualization?.placeholders || [];
463+
const sectionDatasetFieldsGuids = sectionDatasetFields.reduce<Record<string, Field>>(
464+
(acc, field) => {
465+
acc[getFieldKey(field)] = field;
466+
467+
return acc;
468+
},
469+
{},
470+
);
462471

472+
const placeholders: Placeholder[] = currentVisualization?.placeholders || [];
463473
const placeholdersItems = placeholders.reduce((acc: Field[], placeholder: Placeholder) => {
464474
const items = placeholder.items || [];
465475

466476
return [...acc, ...items];
467477
}, [] as Field[]);
468478

469-
const sectionVisualizationFieldsGuids = new Set([
470-
...placeholdersItems.map((field: Field) => field.guid),
471-
...visualizationFields.map((field: Field) => field.guid),
479+
const sectionVisualizationFields = [
480+
...placeholdersItems.map((field: Field) => pick(field, 'guid', 'datasetId')),
481+
...visualizationFields.map((field: Field) => pick(field, 'guid', 'datasetId')),
472482
...onUpdateItemsGuids,
473-
]);
483+
].reduce<Record<string, unknown>>((acc, field) => {
484+
acc[getFieldKey(field)] = field;
485+
486+
return acc;
487+
}, {});
474488

475489
return updates.filter((update: Update) => {
476490
const field = update.field;
491+
const key = getFieldKey(field);
477492

478493
return (
479-
(sectionDatasetFieldsGuids.has(field.guid) && isFieldVisible(field as Field)) ||
480-
sectionVisualizationFieldsGuids.has(field.guid)
494+
(sectionDatasetFieldsGuids[key] && isFieldVisible(field as Field)) ||
495+
sectionVisualizationFields[key]
481496
);
482497
});
483498
}

0 commit comments

Comments
 (0)