Skip to content
This repository was archived by the owner on Nov 4, 2023. It is now read-only.

Commit 63e2b87

Browse files
authoredNov 29, 2020
fix(POPUP): merge tile defaults when passing newly created tile object (#555)
We've overlooked the fact that user can pass a newly created tile object to $scope.showPopup() in which case the tile defaults were not merged. Explicitly merge defaults from the showPopup() call but avoid doing it multiple times for tiles that have already had defaults merged by checking a special cache key. Fixes #553
1 parent 45b5488 commit 63e2b87

File tree

2 files changed

+41
-27
lines changed

2 files changed

+41
-27
lines changed
 

‎scripts/controllers/main-utilities.js

+38-26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import mergeWith from 'lodash.mergewith';
22
import { TILE_DEFAULTS, TYPES } from '../globals/constants';
33

4+
const MERGED_DEFAULTS_KEY = '__merged_defaults';
5+
46
export function mergeConfigDefaults (pages) {
57
for (const page of pages) {
68
for (const group of page.groups) {
@@ -15,37 +17,47 @@ function mergeTileListDefaults (tiles) {
1517
return;
1618
}
1719
for (const [index, tile] of tiles.entries()) {
18-
const mergedTile = mergeTileDefaults(tile);
19-
tiles[index] = mergedTile;
20-
switch (mergedTile.type) {
21-
case TYPES.CAMERA:
22-
case TYPES.CAMERA_STREAM:
23-
case TYPES.CAMERA_THUMBNAIL:
24-
if (mergedTile.type === TYPES.CAMERA_THUMBNAIL) {
25-
console.warn('The CAMERA_THUMBNAIL tile is deprecated. Please replace it with the CAMERA tile. Tile: ', tile);
26-
mergedTile.type = TYPES.CAMERA;
27-
}
28-
mergedTile.fullscreen = mergeTileDefaults(mergedTile.fullscreen);
29-
break;
30-
case TYPES.DOOR_ENTRY:
31-
if (mergedTile.layout?.camera) {
32-
mergedTile.layout.camera = mergeTileDefaults(mergedTile.layout.camera);
33-
}
34-
mergeTileListDefaults(mergedTile.layout?.tiles);
35-
break;
36-
case TYPES.POPUP:
37-
mergeTileListDefaults(mergedTile.popup?.items);
38-
break;
39-
}
20+
tiles[index] = mergeTileDefaults(tile);
4021
}
4122
return tiles;
4223
}
4324

44-
function mergeTileDefaults (tile) {
45-
if (tile && tile.type in TILE_DEFAULTS) {
46-
return mergeTileConfigs({}, TILE_DEFAULTS[tile.type], tile);
25+
export function mergeTileDefaults (tile) {
26+
if (tile[MERGED_DEFAULTS_KEY]) {
27+
return tile;
28+
}
29+
let mergedTile = tile;
30+
if (mergedTile && mergedTile.type in TILE_DEFAULTS) {
31+
mergedTile = mergeTileConfigs({}, TILE_DEFAULTS[mergedTile.type], mergedTile);
32+
}
33+
switch (mergedTile.type) {
34+
case TYPES.CAMERA:
35+
case TYPES.CAMERA_STREAM:
36+
case TYPES.CAMERA_THUMBNAIL:
37+
if (mergedTile.type === TYPES.CAMERA_THUMBNAIL) {
38+
console.warn('The CAMERA_THUMBNAIL tile is deprecated. Please replace it with the CAMERA tile. Tile: ', mergedTile);
39+
mergedTile.type = TYPES.CAMERA;
40+
}
41+
if (mergedTile.fullscreen) {
42+
mergedTile.fullscreen = mergeTileDefaults(mergedTile.fullscreen);
43+
}
44+
break;
45+
case TYPES.DOOR_ENTRY:
46+
if (mergedTile.layout?.camera) {
47+
mergedTile.layout.camera = mergeTileDefaults(mergedTile.layout.camera);
48+
}
49+
if (mergedTile.layout?.tiles) {
50+
mergeTileListDefaults(mergedTile.layout.tiles);
51+
}
52+
break;
53+
case TYPES.POPUP:
54+
if (mergedTile.popup?.items) {
55+
mergeTileListDefaults(mergedTile.popup.items);
56+
}
57+
break;
4758
}
48-
return tile;
59+
mergedTile[MERGED_DEFAULTS_KEY] = true;
60+
return mergedTile;
4961
}
5062

5163
export function mergeTileConfigs (object, ...sources) {

‎scripts/controllers/main.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import angular from 'angular';
22
import Hammer from 'hammerjs';
3-
import { mergeConfigDefaults, mergeTileConfigs } from './main-utilities';
3+
import { mergeConfigDefaults, mergeTileConfigs, mergeTileDefaults } from './main-utilities';
44
import { App } from '../app';
55
import { TYPES, FEATURES, HEADER_ITEMS, MENU_POSITIONS, GROUP_ALIGNS, TRANSITIONS, MAPBOX_MAP, YANDEX_MAP, DEFAULT_SLIDER_OPTIONS, DEFAULT_LIGHT_SLIDER_OPTIONS, DEFAULT_VOLUME_SLIDER_OPTIONS, DEFAULT_POPUP_HISTORY, DEFAULT_POPUP_IFRAME, DEFAULT_POPUP_DOOR_ENTRY } from '../globals/constants';
66
import { debounce, leadZero, supportsFeature, toAbsoluteServerURL } from '../globals/utils';
@@ -1396,6 +1396,8 @@ App.controller('Main', function ($scope, $timeout, $location, Api) {
13961396
};
13971397

13981398
$scope.openPopup = function (item, entity, layout) {
1399+
item = mergeTileDefaults(item);
1400+
13991401
if ($scope.popupTimeout) {
14001402
clearTimeout($scope.popupTimeout);
14011403
$scope.popupTimeout = null;

0 commit comments

Comments
 (0)