Skip to content

Commit 6bfd086

Browse files
authored
Move Permissions to Resource details panel (#2017)
1 parent 7c96e40 commit 6bfd086

File tree

16 files changed

+291
-534
lines changed

16 files changed

+291
-534
lines changed

geonode_mapstore_client/client/js/epics/__tests__/gnsearch-test.js

Lines changed: 0 additions & 60 deletions
This file was deleted.

geonode_mapstore_client/client/js/epics/gnresource.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -697,22 +697,25 @@ export const gnSelectResourceEpic = (action$, store) =>
697697
setResourceCompactPermissions(undefined)
698698
);
699699
}
700-
const user = userSelector(store.getState());
700+
const state = store.getState();
701+
const user = userSelector(state);
702+
const { resource_type: resourceType, pk, subtype } = selectedResource;
701703
const _selectedResource = getResourceWithDetail(selectedResource);
702704
const initialActions = !_selectedResource ? [] : [
703705
setResource(_selectedResource, true),
704706
setSelectedResource(_selectedResource)
705707
];
706708
return Observable.defer(() => Promise.all([
707-
getResourceByTypeAndByPk(selectedResource?.resource_type, selectedResource?.pk, selectedResource?.subtype),
709+
getResourceByTypeAndByPk(resourceType, pk, subtype),
708710
user
709-
? getCompactPermissionsByPk(selectedResource?.pk)
711+
? getCompactPermissionsByPk(pk)
710712
.then((compactPermissions) => compactPermissions)
711713
.catch(() => null)
712714
: Promise.resolve(null)
713715
]))
714716
.switchMap(([resource, compactPermissions]) => {
715717
return Observable.of(
718+
setResourceType(resourceType),
716719
setResource(getResourceWithDetail(resource)),
717720
...(compactPermissions ? [setResourceCompactPermissions(compactPermissions)] : [])
718721
);

geonode_mapstore_client/client/js/epics/gnsearch.js

Lines changed: 0 additions & 59 deletions
This file was deleted.

geonode_mapstore_client/client/js/plugins/ResourceDetails/ResourceDetails.jsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { createStructuredSelector } from 'reselect';
1313
import PropTypes from 'prop-types';
1414
import { requestResource } from '@js/actions/gnresource';
1515
import controls from '@mapstore/framework/reducers/controls';
16+
import config from '@mapstore/framework/reducers/config';
1617
import gnresource from '@js/reducers/gnresource';
1718
import {
1819
getResourceData,
@@ -207,6 +208,13 @@ function ResourceDetailsPanel({
207208
}
208209
]
209210
},
211+
{
212+
"type": "permissions",
213+
"id": "permissions",
214+
"labelId": "gnviewer.permissions",
215+
"disableIf": "{!context.canAccessPermissions(state('gnResourceData'))}",
216+
"items": [true]
217+
},
210218
{
211219
"type": "locations",
212220
"id": "locations",
@@ -435,6 +443,7 @@ export default createPlugin('ResourceDetails', {
435443
},
436444
reducers: {
437445
gnresource,
438-
controls
446+
controls,
447+
config
439448
}
440449
});

geonode_mapstore_client/client/js/plugins/ResourceDetails/components/DetailsThumbnail.jsx

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import Spinner from '@mapstore/framework/components/layout/Spinner';
2020
import BaseMap from '@mapstore/framework/components/map/BaseMap';
2121
import mapTypeHOC from '@mapstore/framework/components/map/enhancers/mapType';
2222
import { getConfigProp } from '@mapstore/framework/utils/ConfigUtils';
23-
import { ResourceTypes, GXP_PTYPES, isDefaultDatasetSubtype, resourceToLayerConfig } from '@js/utils/ResourceUtils';
23+
import { ResourceTypes, GXP_PTYPES, isDefaultDatasetSubtype, resourceToLayers } from '@js/utils/ResourceUtils';
2424

2525
const Map = mapTypeHOC(BaseMap);
2626
Map.displayName = 'Map';
@@ -86,28 +86,6 @@ const MapThumbnailView = ({
8686
);
8787
};
8888

89-
function resourceToLayers(resource) {
90-
if (resource?.resource_type === ResourceTypes.DATASET) {
91-
return [resourceToLayerConfig(resource)];
92-
}
93-
if (resource.maplayers && resource?.resource_type === ResourceTypes.MAP) {
94-
return resource.maplayers
95-
.map(maplayer => {
96-
maplayer.dataset ? resourceToLayerConfig(maplayer.dataset) : null;
97-
if (maplayer.dataset) {
98-
const layer = resourceToLayerConfig(maplayer.dataset);
99-
return {
100-
...layer,
101-
style: maplayer.current_style
102-
};
103-
}
104-
return null;
105-
})
106-
.filter(value => value);
107-
}
108-
return [];
109-
}
110-
11189
function DetailsThumbnail({
11290
icon,
11391
editing,

geonode_mapstore_client/client/js/components/Permissions/GeoLimits.jsx renamed to geonode_mapstore_client/client/js/plugins/ResourceDetails/containers/Permissions/GeoLimits.jsx

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,24 @@
88

99
import React, { useState, useEffect } from 'react';
1010
import PropTypes from 'prop-types';
11+
import { connect } from "react-redux";
12+
import { createSelector } from "reselect";
13+
1114
import BaseMap from '@mapstore/framework/components/map/BaseMap';
1215
import mapTypeHOC from '@mapstore/framework/components/map/enhancers/mapType';
1316
import LocalDrawSupport from '@mapstore/framework/components/geostory/common/map/LocalDrawSupport';
1417
import FitBounds from '@mapstore/framework/components/geostory/common/map/FitBounds';
1518
import Button from '@mapstore/framework/components/layout/Button';
1619
import Icon from '@mapstore/framework/plugins/ResourcesCatalog/components/Icon';
1720
import Spinner from '@mapstore/framework/components/layout/Spinner';
21+
import Popover from "@mapstore/framework/components/styleeditor/Popover";
22+
import useIsMounted from "@mapstore/framework/hooks/useIsMounted";
23+
import { mapInfoSelector } from "@mapstore/framework/selectors/map";
24+
1825
import { getExtent } from '@js/utils/CoordinatesUtils';
26+
import { getGeoLimits } from "@js/api/geonode/security";
27+
import { getResourceData, getResourceId } from "@js/selectors/resource";
28+
import { resourceToLayers } from '@js/utils/ResourceUtils';
1929

2030
const Map = mapTypeHOC(BaseMap);
2131
Map.displayName = 'Map';
@@ -174,4 +184,73 @@ GeoLimits.defaultProps = {
174184
mapType: 'openlayers'
175185
};
176186

177-
export default GeoLimits;
187+
const ConnectedGeoLimits = connect(
188+
createSelector(
189+
[getResourceId, mapInfoSelector, getResourceData],
190+
(resourceId, mapInfo, resource) => ({
191+
resourceId: resourceId || mapInfo?.id,
192+
resource
193+
})
194+
)
195+
)(({ entry, onUpdate, resourceId, resource }) => {
196+
const isMounted = useIsMounted();
197+
const defaultMap = window.overrideNewMapConfig({ map: { layers: [] } });
198+
const layers = [
199+
...(defaultMap?.map?.layers || []),
200+
...resourceToLayers(resource)
201+
];
202+
203+
function handleRequestGeoLimits(_entry) {
204+
if (!_entry.geoLimitsLoading) {
205+
onUpdate(_entry.id, { geoLimitsLoading: true }, true);
206+
getGeoLimits(resourceId, _entry.id, _entry.type)
207+
.then((collection) => {
208+
isMounted(() => {
209+
onUpdate(_entry.id, {
210+
geoLimitsLoading: false,
211+
features: collection.features || [],
212+
isGeoLimitsChanged: false
213+
});
214+
});
215+
})
216+
.catch(() => {
217+
isMounted(() => {
218+
onUpdate(_entry.id, {
219+
geoLimitsLoading: false,
220+
features: [],
221+
isGeoLimitsChanged: false
222+
});
223+
});
224+
});
225+
}
226+
}
227+
228+
return (
229+
<Popover
230+
placement="left"
231+
onOpen={(open) => {
232+
if (open && !entry.features) {
233+
handleRequestGeoLimits(entry);
234+
}
235+
}}
236+
content={
237+
<GeoLimits
238+
key={entry.geoLimitsLoading}
239+
layers={layers}
240+
features={entry.features}
241+
loading={entry.geoLimitsLoading}
242+
onChange={(changes) =>
243+
onUpdate(entry.id, { ...changes, isGeoLimitsChanged: true })
244+
}
245+
onRefresh={handleRequestGeoLimits.bind(null, entry)}
246+
/>
247+
}
248+
>
249+
<Button>
250+
<Icon glyph="globe" />
251+
</Button>
252+
</Popover>
253+
);
254+
});
255+
256+
export default ConnectedGeoLimits;

0 commit comments

Comments
 (0)