From 721ee0e95f0c30419b1377a4f6cc65fce83c6bb5 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Sat, 18 Jan 2020 12:30:35 -0500 Subject: [PATCH] Prevent unnecessary reloading of raw tag editor (close #7248) --- modules/ui/raw_tag_editor.js | 5 +++-- modules/ui/sidebar.js | 6 +++--- modules/util/array.js | 10 ++++++++++ modules/util/index.js | 1 + 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/modules/ui/raw_tag_editor.js b/modules/ui/raw_tag_editor.js index e7680e184..c9fca6983 100644 --- a/modules/ui/raw_tag_editor.js +++ b/modules/ui/raw_tag_editor.js @@ -7,7 +7,8 @@ import { svgIcon } from '../svg/icon'; import { uiCombobox } from './combobox'; import { uiDisclosure } from './disclosure'; import { uiTagReference } from './tag_reference'; -import { utilArrayDifference, utilGetSetValue, utilNoAuto, utilRebind, utilTagDiff } from '../util'; +import { utilArrayDifference, utilArrayIdentical } from '../util/array'; +import { utilGetSetValue, utilNoAuto, utilRebind, utilTagDiff } from '../util'; export function uiRawTagEditor(context) { @@ -609,7 +610,7 @@ export function uiRawTagEditor(context) { rawTagEditor.entityIDs = function(val) { if (!arguments.length) return _entityIDs; - if (_entityIDs !== val) { + if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) { _entityIDs = val; _orderedKeys = []; } diff --git a/modules/ui/sidebar.js b/modules/ui/sidebar.js index 7ee9a8dd6..74ceeb52f 100644 --- a/modules/ui/sidebar.js +++ b/modules/ui/sidebar.js @@ -8,7 +8,7 @@ import { event as d3_event, selectAll as d3_selectAll } from 'd3-selection'; - +import { utilArrayIdentical } from '../util/array'; import { osmEntity, osmNote, qaError } from '../osm'; import { services } from '../services'; import { uiDataEditor } from './data_editor'; @@ -167,7 +167,7 @@ export function uiSidebar(context) { .classed('inspector-hidden', false) .classed('inspector-hover', true); - if (inspector.entityIDs() !== [datum.id] || inspector.state() !== 'hover') { + if (!inspector.entityIDs() || !utilArrayIdentical(inspector.entityIDs(), [datum.id]) || inspector.state() !== 'hover') { inspector .state('hover') .entityIDs([datum.id]); @@ -225,7 +225,7 @@ export function uiSidebar(context) { .classed('inspector-hidden', false) .classed('inspector-hover', false); - if (inspector.entityIDs() !== ids || inspector.state() !== 'select') { + if (!inspector.entityIDs() || !utilArrayIdentical(inspector.entityIDs(), ids) || inspector.state() !== 'select') { inspector .state('select') .entityIDs(ids) diff --git a/modules/util/array.js b/modules/util/array.js index c06e66cde..aab92222d 100644 --- a/modules/util/array.js +++ b/modules/util/array.js @@ -1,4 +1,14 @@ +// Returns true if a and b have the same elements at the same indices. +export function utilArrayIdentical(a, b) { + var i = a.length; + if (i !== b.length) return false; + while (i--) { + if (a[i] !== b[i]) return false; + } + return true; +} + // http://2ality.com/2015/01/es6-set-operations.html // Difference (a \ b): create a set that contains those elements of set a that are not in set b. diff --git a/modules/util/index.js b/modules/util/index.js index ec202812b..9c83d6bd5 100644 --- a/modules/util/index.js +++ b/modules/util/index.js @@ -2,6 +2,7 @@ export { utilArrayChunk } from './array'; export { utilArrayDifference } from './array'; export { utilArrayFlatten } from './array'; export { utilArrayGroupBy } from './array'; +export { utilArrayIdentical } from './array'; export { utilArrayIntersection } from './array'; export { utilArrayUnion } from './array'; export { utilArrayUniq } from './array';