Skip to content

Commit 791fb54

Browse files
Fix geosolutions-it#10489 Problems with GeoStory map configurations merge process (geosolutions-it#10438)
1 parent 574bafc commit 791fb54

File tree

5 files changed

+162
-8
lines changed

5 files changed

+162
-8
lines changed

web/client/components/geostory/common/enhancers/__tests__/map-test.jsx

+23-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,29 @@ describe("geostory media map component enhancers", () => {
3535
const Sink = withMapEnhancer(createSink( props => {
3636
expect(props).toBeTruthy();
3737
expect(props.map).toBeTruthy();
38-
expect(props.map).toEqual({id: "2", layers: []});
38+
expect(props.map).toEqual({id: "2", layers: [], groups: []});
39+
done();
40+
}));
41+
ReactDOM.render(<Provider store={store}><Sink resourceId={resourceId} map={{}}/></Provider>, document.getElementById("container"));
42+
});
43+
it('withMapEnhancer generate correct props for legacy geostory', (done) => {
44+
const resources = [{id: "1", type: "map", data: {id: "2", layers: [ {
45+
"visibility": true
46+
}, null], groups: [null, null, {
47+
"expanded": false
48+
}], context: "1"}}];
49+
const store = {
50+
subscribe: () => {}, getState: () => ({geostory: {currentStory: {resources}}})
51+
};
52+
const resourceId = "1";
53+
const Sink = withMapEnhancer(createSink( props => {
54+
expect(props).toBeTruthy();
55+
expect(props.map).toBeTruthy();
56+
expect(props.map).toEqual({id: "2", layers: [ {
57+
"visibility": true
58+
}, undefined], groups: [undefined, undefined, {
59+
"expanded": false
60+
}]});
3961
done();
4062
}));
4163
ReactDOM.render(<Provider store={store}><Sink resourceId={resourceId} map={{}}/></Provider>, document.getElementById("container"));

web/client/components/geostory/common/enhancers/map.jsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ export default compose(
3737
}))),
3838
withProps(
3939
({ resources, resourceId, map = {}}) => {
40-
const cleanedMap = {...map, layers: (map.layers || []).map(l => l ? l : undefined)};
4140
const resource = find(resources, { id: resourceId }) || {};
42-
return { map: createMapObject(omit(resource.data, ['context']), cleanedMap)};
41+
const baseMap = omit(resource.data, ['context']);
42+
const isLegacyGeostory = (map?.layers || [])?.indexOf(null) !== -1 || (map?.groups || [])?.indexOf(null) !== -1;
43+
const cleanedMap = {...map, layers: (map.layers || baseMap?.layers || []).map(lay => lay ? lay : undefined), groups: (map.groups || baseMap?.groups || []).map(gr => gr ? gr : undefined)}; // for better initiating cleanedMap layers in case 'map.layers = undefined' -> baseMap.layers check is added in fallBack
44+
return { map: createMapObject(baseMap, cleanedMap, isLegacyGeostory)};
4345
}
4446
));
4547
/**

web/client/plugins/TOC/components/StyleBasedWMSJsonLegend.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,9 @@ class StyleBasedWMSJsonLegend extends React.Component {
129129
return '';
130130
}
131131
renderRules = (rules) => {
132+
const isLegendFilterIncluded = this.props?.layer?.layerFilter?.filters?.find(f=>f.id === 'interactiveLegend');
133+
const legendFilters = isLegendFilterIncluded ? isLegendFilterIncluded?.filters : [];
132134
return (rules || []).map((rule) => {
133-
const isLegendFilterIncluded = this.props?.layer?.layerFilter?.filters?.find(f=>f.id === 'interactiveLegend');
134-
const legendFilters = isLegendFilterIncluded ? isLegendFilterIncluded?.filters : [];
135135
const isFilterExistBefore = legendFilters?.find(f => f.id === rule.filter);
136136
const isFilterDisabled = this.props?.layer?.layerFilter?.disabled;
137137
const activeFilter = rule.filter && isFilterExistBefore;

web/client/utils/GeoStoryUtils.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,18 @@ export const applyDefaults = (options = {}) => merge({}, DEFAULT_MAP_OPTIONS, op
171171
* create map object
172172
* @param {object} baseMap initial map object
173173
* @param {object} overrides object to override with
174+
* @param {bool} isLegacyGeostory boolean that indicates if the geostory is legacy one or new
174175
* @return {object} options merged with defaults
175176
*/
176-
export const createMapObject = (baseMap = {}, overrides = {}) => {
177-
return merge({}, baseMap, overrides);
177+
export const createMapObject = (baseMap = {}, overrides = {}, isLegacyGeostory = false) => {
178+
const mergedMap = merge({}, baseMap, overrides);
179+
if (isLegacyGeostory) {
180+
return mergedMap;
181+
}
182+
return {
183+
...mergedMap, layers: overrides?.layers || [], groups: overrides?.groups || []
184+
};
185+
178186
};
179187
/**
180188
* check if a string matches a regex

web/client/utils/__tests__/GeoStoryUtils-test.js

+123-1
Original file line numberDiff line numberDiff line change
@@ -351,17 +351,139 @@ describe("GeoStory Utils", () => {
351351
mouseClick: false,
352352
dragPan: true
353353
}
354-
}
354+
},
355+
layers: [], groups: []
355356
};
356357
const res = createMapObject(DEFAULT_MAP_OPTIONS, {
357358
mapOptions: {
359+
scrollWheelZoom: false,
358360
interactions: {
359361
mouseClick: false
360362
}
361363
}
362364
});
363365
expect(res).toEqual(merged);
364366
});
367+
it('test override layers in createMapObject', () => {
368+
// initial baseMap layer is empty array
369+
const merged1 = {
370+
zoomControl: true,
371+
mapInfoControl: false,
372+
mapOptions: {
373+
scrollWheelZoom: false,
374+
interactions: {
375+
mouseWheelZoom: false,
376+
mouseClick: false,
377+
dragPan: true
378+
}
379+
},
380+
layers: [{
381+
name: "layer01", center: {x: 1, y: 1, crs: 'EPSG:4326'}, zoom: 1
382+
}, {
383+
name: "layer02", center: {x: 2, y: 2, crs: 'EPSG:4326'}, zoom: 2
384+
}],
385+
groups: []
386+
};
387+
const res1 = createMapObject({...DEFAULT_MAP_OPTIONS, layers: []}, {
388+
mapOptions: {
389+
scrollWheelZoom: false,
390+
interactions: {
391+
mouseClick: false
392+
}
393+
},
394+
layers: [{
395+
name: "layer01", center: {x: 1, y: 1, crs: 'EPSG:4326'}, zoom: 1
396+
}, {
397+
name: "layer02", center: {x: 2, y: 2, crs: 'EPSG:4326'}, zoom: 2
398+
}]
399+
});
400+
expect(res1).toEqual(merged1);
401+
// initial baseMap layer not empty array
402+
const merged2 = {
403+
zoomControl: true,
404+
mapInfoControl: false,
405+
mapOptions: {
406+
scrollWheelZoom: false,
407+
interactions: {
408+
mouseWheelZoom: false,
409+
mouseClick: false,
410+
dragPan: true
411+
}
412+
},
413+
layers: [{
414+
name: "layer01", center: {x: 1.5, y: 1.5, crs: 'EPSG:4326'}, zoom: 1.5
415+
}, {
416+
name: "layer02", center: {x: 2, y: 2, crs: 'EPSG:4326'}, zoom: 2
417+
}],
418+
groups: []
419+
};
420+
const res2 = createMapObject({...DEFAULT_MAP_OPTIONS, layers: [{
421+
name: "layer01", center: {x: 1, y: 1, crs: 'EPSG:4326'}, zoom: 1
422+
}]}, {
423+
mapOptions: {
424+
scrollWheelZoom: false,
425+
interactions: {
426+
mouseClick: false
427+
}
428+
},
429+
layers: [{
430+
name: "layer01", center: {x: 1.5, y: 1.5, crs: 'EPSG:4326'}, zoom: 1.5
431+
}, {
432+
name: "layer02", center: {x: 2, y: 2, crs: 'EPSG:4326'}, zoom: 2
433+
}]
434+
});
435+
expect(res2).toEqual(merged2);
436+
// legacy geostory
437+
const merged3 = {
438+
zoomControl: true,
439+
mapInfoControl: false,
440+
mapOptions: {
441+
scrollWheelZoom: false,
442+
interactions: {
443+
mouseWheelZoom: false,
444+
mouseClick: false,
445+
dragPan: true
446+
}
447+
},
448+
layers: [{
449+
"visibility": false
450+
}, {
451+
"visibility": true
452+
}, undefined],
453+
groups: [undefined, {
454+
expanded: true
455+
}, {
456+
expanded: true
457+
}]
458+
};
459+
const res3 = createMapObject({...DEFAULT_MAP_OPTIONS, layers: [{
460+
"visibility": true
461+
}, {
462+
"visibility": false
463+
}, undefined], groups: [undefined, {
464+
expanded: false
465+
}, {
466+
expanded: true
467+
}]}, {
468+
mapOptions: {
469+
scrollWheelZoom: false,
470+
interactions: {
471+
mouseClick: false
472+
}
473+
},
474+
layers: [{
475+
"visibility": false
476+
}, {
477+
"visibility": true
478+
}, undefined],
479+
groups: [undefined, {
480+
expanded: true
481+
}, {
482+
expanded: true
483+
}]
484+
}, true);
485+
expect(res3).toEqual(merged3);
486+
});
365487
it('test testRegex', () => {
366488
const title = "title";
367489
expect(testRegex(title, "it")).toBe(true);

0 commit comments

Comments
 (0)