diff --git a/geonode_mapstore_client/client/js/epics/gnresource.js b/geonode_mapstore_client/client/js/epics/gnresource.js index 4870bf48d3..797f3bb9e7 100644 --- a/geonode_mapstore_client/client/js/epics/gnresource.js +++ b/geonode_mapstore_client/client/js/epics/gnresource.js @@ -97,6 +97,7 @@ import { import { canAddResource, getInitialDatasetLayer, + getInitialDatasetLayerStyle, getResourceData, getResourceId, getResourceThumbnail @@ -538,7 +539,7 @@ export const gnViewerRequestResourceConfig = (action$, store) => ...action.options, isSamePreviousResource, resourceData, - selectedLayer: isSamePreviousResource && getInitialDatasetLayer(state), + selectedLayer: isSamePreviousResource && {...getInitialDatasetLayer(state), style: getInitialDatasetLayerStyle(state)}, params: {...action?.options?.params, query} }), Observable.of( diff --git a/geonode_mapstore_client/client/js/epics/gnsave.js b/geonode_mapstore_client/client/js/epics/gnsave.js index 471c1ff17b..114bb1f365 100644 --- a/geonode_mapstore_client/client/js/epics/gnsave.js +++ b/geonode_mapstore_client/client/js/epics/gnsave.js @@ -65,7 +65,8 @@ import { getResourceId, getDataPayload, getCompactPermissions, - getExtentPayload + getExtentPayload, + getInitialDatasetLayerStyle } from '@js/selectors/resource'; import { @@ -113,9 +114,9 @@ const setDefaultStyle = (state, id) => { availableStyles = [...defaultStyle, ...filteredStyles]; } const {style: currentStyleName} = getSelectedNode(state) ?? {}; - const initalStyleName = layer?.availableStyles?.[0]?.name; + const initialStyleName = getInitialDatasetLayerStyle(state); - if (id && initalStyleName && currentStyleName !== initalStyleName) { + if (id && initialStyleName && currentStyleName !== initialStyleName) { const { baseUrl = '' } = styleServiceSelector(state); return { request: () => LayersAPI.updateDefaultStyle({ @@ -228,7 +229,7 @@ export const gnSaveContent = (action$, store) => const { compactPermissions } = getPermissionsPayload(state); return Observable.defer(() => SaveAPI[contentType](state, action.id, body, action.reload)) .switchMap((response) => { - const [resource, ...actions] = castArray(response); + let [resource, ...actions] = castArray(response); if (action.reload) { if (contentType === ResourceTypes.VIEWER) { const sourcepk = get(state, 'router.location.pathname', '').split('/').pop(); @@ -238,6 +239,11 @@ export const gnSaveContent = (action$, store) => window.location.reload(); return Observable.empty(); } + const selectedLayer = getSelectedNode(state); + const currentStyle = selectedLayer?.availableStyles?.find(({ name }) => selectedLayer?.style?.includes(name)); + // adding default style upon saving resource for correct style comparison + const defaultStyle = currentStyle ? { sld_title: currentStyle.title, name: selectedLayer?.style } : null; + resource = {...resource, default_style: defaultStyle}; return Observable.merge( Observable.of( saveSuccess(resource), diff --git a/geonode_mapstore_client/client/js/selectors/resource.js b/geonode_mapstore_client/client/js/selectors/resource.js index f19f719c2f..9b9d62d6a0 100644 --- a/geonode_mapstore_client/client/js/selectors/resource.js +++ b/geonode_mapstore_client/client/js/selectors/resource.js @@ -232,10 +232,20 @@ function isMapCenterEqual(initialCenter = {}, currentCenter = {}) { return initialCenter.crs === currentCenter.crs && Math.abs(initialCenter.x - currentCenter.x) < CENTER_EPS && Math.abs(initialCenter.y - currentCenter.y) < CENTER_EPS; } -export function getInitialDatasetLayer(state) { +export const getInitialDatasetResource = (state) => { const initialResource = state?.gnresource?.initialResource; - return initialResource && initialResource.resource_type === ResourceTypes.DATASET && resourceToLayerConfig(omit(initialResource, ['default_style'])); -} + return initialResource && initialResource.resource_type === ResourceTypes.DATASET ? initialResource : null; +}; + +export const getInitialDatasetLayer = (state) => { + const initialResource = getInitialDatasetResource(state); + return initialResource && resourceToLayerConfig(omit(initialResource, ['default_style'])); +}; + +export const getInitialDatasetLayerStyle = (state) => { + const initialResource = getInitialDatasetResource(state); + return initialResource ? resourceToLayerConfig(initialResource)?.style : null; +}; function isResourceDataEqual(state, initialData = {}, currentData = {}) { const resourceType = state?.gnresource?.type; @@ -308,11 +318,12 @@ function isResourceDataEqual(state, initialData = {}, currentData = {}) { const selectedLayer = getSelectedNode(state); const selectedLayerInitial = getSelectedLayer(state); const initialLayerData = {...selectedLayerInitial, ...initialData}; + const initialStyle = getInitialDatasetLayerStyle(state); const isSettingsEqual = compareObjects(omit(currentData, ['style', 'fields']), omit(initialLayerData, ['style', 'fields', 'extendedParams', 'pk', '_v_', 'isDataset', 'perms'])); - const isStyleEqual = isEmpty(selectedLayer?.availableStyles) || isEmpty(selectedLayer?.style) ? true - : selectedLayer?.style === selectedLayer?.availableStyles?.[0]?.name; + const isStyleEqual = isEmpty(initialStyle) || isEmpty(selectedLayer?.style) ? true + : selectedLayer?.style === initialStyle; const isAttributesEqual = isEmpty(selectedLayer) ? true : !isEmpty(initialLayerData) && isEqual( isEmpty(initialLayerData?.fields) ? {} : initialLayerData?.fields,