Skip to content

Commit af62591

Browse files
authored
Enhance dataset viewer and saving of layer settings (#2054)
1 parent e0a10b7 commit af62591

File tree

4 files changed

+66
-33
lines changed

4 files changed

+66
-33
lines changed

geonode_mapstore_client/client/js/epics/gnresource.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import {
3232
deleteResourceThumbnail
3333
} from '@js/api/geonode/v2';
3434
import { configureMap } from '@mapstore/framework/actions/config';
35-
import { mapSelector } from '@mapstore/framework/selectors/map';
3635
import { isMapInfoOpen } from '@mapstore/framework/selectors/mapInfo';
3736
import { getSelectedLayer } from '@mapstore/framework/selectors/layers';
3837
import { isLoggedIn, userSelector } from '@mapstore/framework/selectors/security';
@@ -130,7 +129,7 @@ const FIT_BOUNDS_CONTROL = 'fitBounds';
130129
const resourceTypes = {
131130
[ResourceTypes.DATASET]: {
132131
resourceObservable: (pk, options) => {
133-
const { page, selectedLayer, map: currentMap } = options || {};
132+
const { page, selectedLayer } = options || {};
134133
const { subtype, query } = options?.params || {};
135134
return Observable.defer(() =>
136135
axios.all([
@@ -152,7 +151,9 @@ const resourceTypes = {
152151
})
153152
.then((response) => {
154153
const [mapConfig, gnLayer, timeseries] = response;
155-
const newLayer = resourceToLayerConfig(gnLayer);
154+
const newLayer = options?.isSamePreviousResource
155+
? selectedLayer // keep configuration for other pages when resource id is the same (eg: filters)
156+
: resourceToLayerConfig(gnLayer);
156157
const _gnLayer = {...gnLayer, layerSettings: gnLayer.data};
157158
return [mapConfig, {..._gnLayer, timeseries}, newLayer];
158159
})
@@ -166,26 +167,24 @@ const resourceTypes = {
166167
...mapConfig,
167168
map: {
168169
...mapConfig.map,
169-
...currentMap, // keep configuration for other pages when resource id is the same (eg: center, zoom)
170170
visualizationMode: ['3dtiles'].includes(subtype) ? VisualizationModes._3D : VisualizationModes._2D,
171171
layers: [
172172
...mapConfig.map.layers,
173173
{
174-
...selectedLayer, // keep configuration for other pages when resource id is the same (eg: filters)
175174
...newLayer,
176175
isDataset: true,
177176
_v_: Date.now()
178177
}
179178
]
180179
}
181180
}),
182-
...((extent && !currentMap)
181+
...(extent
183182
? [ setControlProperty(FIT_BOUNDS_CONTROL, 'geometry', extent) ]
184183
: []),
185184
setControlProperty('toolbar', 'expanded', false),
186185
forceUpdateMapLayout(),
187186
selectNode(newLayer.id, 'layer', false),
188-
setResource(gnLayer),
187+
...(!options?.isSamePreviousResource ? [setResource(gnLayer)] : []),
189188
setResourceId(pk),
190189
...(page === 'dataset_edit_data_viewer'
191190
? [
@@ -524,7 +523,6 @@ export const gnViewerRequestResourceConfig = (action$, store) =>
524523
isSamePreviousResource,
525524
resourceData,
526525
selectedLayer: isSamePreviousResource && getSelectedLayer(state),
527-
map: isSamePreviousResource && mapSelector(state),
528526
params: {...action?.options?.params, query}
529527
}),
530528
Observable.of(

geonode_mapstore_client/client/js/epics/gnsave.js

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import axios from '@mapstore/framework/libs/ajax';
1010
import { Observable } from 'rxjs';
1111
import get from 'lodash/get';
1212
import castArray from 'lodash/castArray';
13+
import omit from 'lodash/omit';
1314

1415
import { mapInfoSelector } from '@mapstore/framework/selectors/map';
1516
import { userSelector } from '@mapstore/framework/selectors/security';
@@ -36,7 +37,8 @@ import {
3637
loadingResourceConfig,
3738
enableMapThumbnailViewer,
3839
updateResource,
39-
manageLinkedResource
40+
manageLinkedResource,
41+
setSelectedLayer
4042
} from '@js/actions/gnresource';
4143
import {
4244
getResourceByPk,
@@ -60,7 +62,8 @@ import {
6062
getResourceId,
6163
getDataPayload,
6264
getCompactPermissions,
63-
getExtentPayload
65+
getExtentPayload,
66+
getSelectedLayer
6467
} from '@js/selectors/resource';
6568

6669
import {
@@ -83,8 +86,10 @@ import {
8386
ProcessStatus
8487
} from '@js/utils/ResourceServiceUtils';
8588
import { updateDatasetTimeSeries } from '@js/api/geonode/v2/index';
86-
import { updateNode } from '@mapstore/framework/actions/layers';
87-
import { layersSelector } from '@mapstore/framework/selectors/layers';
89+
import { updateNode, updateSettingsParams } from '@mapstore/framework/actions/layers';
90+
import { layersSelector, getSelectedLayer as getSelectedNode } from '@mapstore/framework/selectors/layers';
91+
import { styleServiceSelector, getUpdatedLayer, selectedStyleSelector } from '@mapstore/framework/selectors/styleeditor';
92+
import LayersAPI from '@mapstore/framework/api/geoserver/Layers';
8893

8994
const RESOURCE_MANAGEMENT_PROPERTIES_KEYS = Object.keys(RESOURCE_MANAGEMENT_PROPERTIES);
9095

@@ -96,6 +101,30 @@ function parseMapBody(body) {
96101
};
97102
}
98103

104+
const setDefaultStyle = (state, id) => {
105+
const {style: currentStyle} = getSelectedNode(state) ?? {};
106+
const {style: initalStyle} = getSelectedLayer(state) ?? {};
107+
108+
const layer = getUpdatedLayer(state);
109+
const styleName = selectedStyleSelector(state);
110+
const defaultStyle = layer.availableStyles.filter(({ name }) => styleName === name);
111+
const filteredStyles = layer.availableStyles.filter(({ name }) => styleName !== name);
112+
const availableStyles = [...defaultStyle, ...filteredStyles];
113+
114+
if (id && currentStyle !== initalStyle) {
115+
const { baseUrl = '' } = styleServiceSelector(state);
116+
return {
117+
request: () => LayersAPI.updateDefaultStyle({
118+
baseUrl,
119+
layerName: layer.name,
120+
styleName
121+
}),
122+
actions: [updateSettingsParams({ availableStyles }, true), setSelectedLayer(layer)]
123+
};
124+
}
125+
return {request: () => Promise.resolve(), actions: []};
126+
};
127+
99128
const SaveAPI = {
100129
[ResourceTypes.MAP]: (state, id, body) => {
101130
return id
@@ -134,18 +163,20 @@ const SaveAPI = {
134163
...body,
135164
...(timeseries && { has_time: timeseries?.has_time })
136165
};
137-
return (id
166+
const { request, actions } = setDefaultStyle(state, id); // set default style, if modified
167+
return request().then(() => (id
138168
? axios.all([updateDataset(id, updatedBody), updateDatasetTimeSeries(id, timeseries)])
139-
: Promise.resolve([]))
140-
.then(([resource]) => {
169+
: Promise.resolve())
170+
.then(([_resource]) => {
171+
let resource = omit(_resource, 'default_style');
141172
if (timeseries) {
142173
const dimensions = resource?.has_time ? getDimensions({...resource, has_time: true}) : [];
143174
const layerId = layersSelector(state)?.find((l) => l.pk === resource?.pk)?.id;
144175
// actions to be dispacted are added to response array
145-
return [resource, updateNode(layerId, 'layers', { dimensions: dimensions?.length > 0 ? dimensions : undefined })];
176+
return [resource, updateNode(layerId, 'layers', { dimensions: dimensions?.length > 0 ? dimensions : undefined }), ...actions];
146177
}
147-
return resource;
148-
});
178+
return [resource, ...actions];
179+
}));
149180
},
150181
[ResourceTypes.VIEWER]: (state, id, body) => {
151182
const user = userSelector(state);

geonode_mapstore_client/client/js/selectors/resource.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ import pick from 'lodash/pick';
2525
import isEmpty from 'lodash/isEmpty';
2626
import get from 'lodash/get';
2727
import omitBy from 'lodash/omitBy';
28+
import isNil from 'lodash/isNil';
2829
import { generateContextResource } from '@mapstore/framework/selectors/contextcreator';
2930
import { layerSettingSelector, getSelectedLayer as getSelectedNode } from '@mapstore/framework/selectors/layers';
31+
import { saveLayer } from '@mapstore/framework/utils/LayersUtils';
3032

3133
const RESOURCE_MANAGEMENT_PROPERTIES_KEYS = Object.keys(RESOURCE_MANAGEMENT_PROPERTIES);
3234

@@ -171,10 +173,13 @@ export const getDataPayload = (state, resourceType) => {
171173
currentLayerSettings = omitBy(currentLayerSettings,
172174
(value, key) => key === "opacity" && value === 1); // skip default value
173175
const selectedLayer = getSelectedNode(state);
176+
const omitKeys = ['extendedParams', 'availableStyles', 'infoFormats', 'style'];
177+
const data = saveLayer(selectedLayer ?? {});
174178
return omit({
179+
...data,
175180
...currentLayerSettings,
176-
...(selectedLayer && {fields: selectedLayer?.fields ?? {}})},
177-
['availableStyles', 'infoFormats']);
181+
...(selectedLayer && {fields: selectedLayer?.fields ?? {}})
182+
}, omitKeys);
178183
}
179184
default:
180185
return null;
@@ -194,9 +199,10 @@ const compareObjects = (obj1, obj2) => {
194199
return Object.keys(obj1).every((key) => {
195200
const val1 = obj1[key];
196201
const val2 = obj2?.[key];
202+
if (isNil(val2)) return true;
197203
if (typeof val1 === 'boolean') return val1 === (val2 ?? false);
198204
if (typeof val1 === 'number') return val1 === (val2 ?? 0);
199-
if (isEmpty(val1) && isEmpty(val2)) return false;
205+
if (isEmpty(val1) && isEmpty(val2)) return true;
200206
return isEqual(obj2?.[key], obj1[key]);
201207
});
202208
}
@@ -291,15 +297,16 @@ function isResourceDataEqual(state, initialData = {}, currentData = {}) {
291297
}
292298
case ResourceTypes.DATASET: {
293299
const selectedLayer = getSelectedNode(state);
294-
const selectedLayerInitialState = getSelectedLayer(state);
295-
const layerSettingsInitial = {...selectedLayerInitialState, ...initialData};
300+
const selectedLayerInitial = getSelectedLayer(state);
301+
const initialLayerData = {...selectedLayerInitial, ...initialData};
296302

297-
const isSettingsEqual = compareObjects(currentData, layerSettingsInitial);
298-
const isAttributesEqual = !isEmpty(layerSettingsInitial)
303+
const isSettingsEqual = compareObjects(currentData, initialLayerData);
304+
const isStyleEqual = selectedLayer?.style === initialLayerData?.style;
305+
const isAttributesEqual = !isEmpty(initialLayerData)
299306
&& !isEmpty(selectedLayer)
300-
&& isEqual(layerSettingsInitial?.fields, selectedLayer.fields);
307+
&& isEqual(initialLayerData?.fields, selectedLayer.fields);
301308

302-
return isSettingsEqual && isAttributesEqual;
309+
return isSettingsEqual && isAttributesEqual && isStyleEqual;
303310
}
304311
default:
305312
return true;

geonode_mapstore_client/static/mapstore/configs/localConfig.json

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,8 +1357,8 @@
13571357
{
13581358
"name": "Save",
13591359
"cfg": {
1360-
"saveMsgId": "gnhome.apply",
1361-
"className": "gn-apply-settings"
1360+
"className": "gn-apply-settings",
1361+
"variant": "default"
13621362
}
13631363
},
13641364
{
@@ -1370,10 +1370,7 @@
13701370
}
13711371
},
13721372
{
1373-
"name": "StyleEditor",
1374-
"cfg": {
1375-
"enableSetDefaultStyle": true
1376-
}
1373+
"name": "StyleEditor"
13771374
},
13781375
{
13791376
"name": "Identify",

0 commit comments

Comments
 (0)