Skip to content

Commit 245bb55

Browse files
authored
#2153: Enhancements to the Share and Details panel (#2204)
* #2153: Enhancements to the Share and Details panel * code refactor
1 parent ccef351 commit 245bb55

31 files changed

+267
-593
lines changed

geonode_mapstore_client/client/js/epics/gnsave.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ import {
8181
ResourceTypes,
8282
cleanCompactPermissions,
8383
toGeoNodeMapConfig,
84-
RESOURCE_MANAGEMENT_PROPERTIES,
84+
RESOURCE_PUBLISHING_PROPERTIES,
85+
RESOURCE_OPTIONS_PROPERTIES,
8586
getDimensions,
8687
isDefaultDatasetSubtype
8788
} from '@js/utils/ResourceUtils';
@@ -94,7 +95,7 @@ import { layersSelector, getSelectedLayer as getSelectedNode } from '@mapstore/f
9495
import { styleServiceSelector, getUpdatedLayer, selectedStyleSelector } from '@mapstore/framework/selectors/styleeditor';
9596
import LayersAPI from '@mapstore/framework/api/geoserver/Layers';
9697

97-
const RESOURCE_MANAGEMENT_PROPERTIES_KEYS = Object.keys(RESOURCE_MANAGEMENT_PROPERTIES);
98+
const RESOURCE_MANAGEMENT_PROPERTIES_KEYS = Object.keys({...RESOURCE_PUBLISHING_PROPERTIES, ...RESOURCE_OPTIONS_PROPERTIES});
9899

99100
function parseMapBody(body) {
100101
const geoNodeMap = toGeoNodeMapConfig(body.data);

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

Lines changed: 61 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,35 @@
99
import React, { useEffect, useState } from 'react';
1010
import { createPlugin } from '@mapstore/framework/utils/PluginsUtils';
1111
import { connect } from 'react-redux';
12-
import { createStructuredSelector } from 'reselect';
12+
import { createStructuredSelector, createSelector } from 'reselect';
1313
import PropTypes from 'prop-types';
14-
import { requestResource, setResource } from '@js/actions/gnresource';
14+
1515
import controls from '@mapstore/framework/reducers/controls';
1616
import config from '@mapstore/framework/reducers/config';
17-
import gnresource from '@js/reducers/gnresource';
18-
import {
19-
getResourceData,
20-
getResourceLoading,
21-
getResourceDirtyState,
22-
canEditPermissions
23-
} from '@js/selectors/resource';
2417
import usePluginItems from '@mapstore/framework/hooks/usePluginItems';
25-
import tabComponents from './containers/tabComponents';
18+
import { mapInfoSelector } from '@mapstore/framework/selectors/map';
2619
import ResourcesPanelWrapper from '@mapstore/framework/plugins/ResourcesCatalog/components/ResourcesPanelWrapper';
2720
import TargetSelectorPortal from '@mapstore/framework/plugins/ResourcesCatalog/components/TargetSelectorPortal';
2821
import useResourcePanelWrapper from '@mapstore/framework/plugins/ResourcesCatalog/hooks/useResourcePanelWrapper';
2922
import { getShowDetails } from '@mapstore/framework/plugins/ResourcesCatalog/selectors/resources';
30-
import { setShowDetails, setSelectedResource } from '@mapstore/framework/plugins/ResourcesCatalog/actions/resources';
23+
import { setShowDetails, setSelectedResource, setDetailPanelTab } from '@mapstore/framework/plugins/ResourcesCatalog/actions/resources';
3124
import PendingStatePrompt from '@mapstore/framework/plugins/ResourcesCatalog/containers/PendingStatePrompt';
32-
import DetailsPanel from './containers/DetailsPanel';
25+
import Button from '@mapstore/framework/components/layout/Button';
26+
import Message from '@mapstore/framework/components/I18N/Message';
27+
28+
import {
29+
getResourceData,
30+
getResourceLoading,
31+
getResourceDirtyState,
32+
canEditPermissions,
33+
isNewResource,
34+
getResourceId
35+
} from '@js/selectors/resource';
36+
import { requestResource, setResource } from '@js/actions/gnresource';
37+
import gnresource from '@js/reducers/gnresource';
3338
import useDetectClickOut from '@js/hooks/useDetectClickOut';
39+
import tabComponents from '@js/plugins/ResourceDetails/containers/tabComponents';
40+
import DetailsPanel from '@js/plugins/ResourceDetails/containers/DetailsPanel';
3441

3542
/**
3643
* @module ResourceDetails
@@ -215,7 +222,7 @@ function ResourceDetailsPanel({
215222
"items": "{({extent: context.get(state('gnResourceData'), 'extent')})}"
216223
},
217224
{
218-
"type": "linked-resources",
225+
"type": "relations",
219226
"id": "related",
220227
"labelId": "gnviewer.linkedResources.label",
221228
"items": "{context.get(state('gnResourceData'), 'linkedResources')}"
@@ -234,11 +241,18 @@ function ResourceDetailsPanel({
234241
"disableIf": "{context.get(state('gnResourceData'), 'resource_type') !== 'dataset'}",
235242
"items": "{context.get(state('gnResourceData'), 'attribute_set')}"
236243
},
244+
{
245+
"type": "share",
246+
"id": "share",
247+
"labelId": "gnviewer.share",
248+
"disableIf": "{!context.canAccessPermissions(state('gnResourceData'))}",
249+
"items": [true]
250+
},
237251
{
238252
"type": "settings",
239253
"id": "settings",
240-
"labelId": "gnviewer.management",
241-
"disableIf": "{!context.canManageResourceSettings(state('gnResourceData')) && !context.canAccessPermissions(state('gnResourceData'))}",
254+
"labelId": "gnviewer.settings",
255+
"disableIf": "{!context.canManageResourceSettings(state('gnResourceData'))}",
242256
"items": [true]
243257
}
244258
],
@@ -389,7 +403,7 @@ const ResourceDetailsPlugin = connect(
389403
export default createPlugin('ResourceDetails', {
390404
component: ResourceDetailsPlugin,
391405
containers: {
392-
ActionNavbar: {
406+
ActionNavbar: [{
393407
name: 'ResourceDetailsButton',
394408
Component: connect((state) => ({resource: getResourceData(state)}), { onShow: setShowDetails })(({ component, resourcesGridId, onShow, resource }) => {
395409
if (!resource?.pk) return null;
@@ -409,7 +423,37 @@ export default createPlugin('ResourceDetails', {
409423
}),
410424
priority: 1,
411425
doNotHide: true
412-
},
426+
}, {
427+
name: 'ShareActionButton',
428+
Component: connect(
429+
createSelector(
430+
isNewResource,
431+
getResourceId,
432+
mapInfoSelector,
433+
(isNew, resourceId, mapInfo) => ({
434+
enabled: !isNew && (resourceId || mapInfo?.id)
435+
})
436+
),
437+
{
438+
onSelectTab: setDetailPanelTab,
439+
onShowDetails: setShowDetails
440+
}
441+
)(({ enabled, size, onSelectTab, onShowDetails }) => {
442+
return enabled
443+
? <Button
444+
size={size}
445+
onClick={() => {
446+
onShowDetails(true);
447+
onSelectTab('share');
448+
}}
449+
>
450+
<Message msgId="share.title"/>
451+
</Button>
452+
: null;
453+
}),
454+
priority: 1,
455+
doNotHide: true
456+
}],
413457
ResourcesGrid: {
414458
priority: 2,
415459
target: 'card-buttons',

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ const DetailsLinkedResources = ({ fields }) => {
6161
];
6262

6363
return (
64-
<FlexBox column gap="xs" className="gn-details-linked-resources _padding-tb-md">
64+
<FlexBox column gap="xs" className="gn-details-relations _padding-tb-md">
6565
{linkedResources.map(({resources, type})=> <DetailLinkedResource resources={resources} type={type}/>)}
6666
</FlexBox>
6767
);

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

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import FlexBox from '@mapstore/framework/components/layout/FlexBox';
77
import Text from '@mapstore/framework/components/layout/Text';
88
import SelectInfiniteScroll from '@mapstore/framework/plugins/ResourcesCatalog/components/SelectInfiniteScroll';
99
import { getGroups } from '@js/api/geonode/v2';
10-
import { canManageResourceSettings, RESOURCE_MANAGEMENT_PROPERTIES } from '@js/utils/ResourceUtils';
10+
import { canManageResourcePublishing, canManageResourceOptions, RESOURCE_PUBLISHING_PROPERTIES, RESOURCE_OPTIONS_PROPERTIES } from '@js/utils/ResourceUtils';
1111

1212
const MessageTooltip = tooltip(forwardRef(({children, msgId, ...props}, ref) => {
1313
return (
@@ -46,13 +46,35 @@ function DetailsSettings({ resource, onChange }) {
4646
/>
4747
</FormGroup>
4848
</FlexBox.Fill>
49-
{canManageResourceSettings(resource) && (
49+
{canManageResourcePublishing(resource) && (
5050
<FlexBox column gap="xs">
5151
<Text strong>
52-
<Message msgId={"gnviewer.resourceManagement"} />
52+
<Message msgId={"gnviewer.publishing"} />
5353
</Text>
54-
{Object.keys(RESOURCE_MANAGEMENT_PROPERTIES).map((key) => {
55-
const { labelId, disabled, tooltipId } = RESOURCE_MANAGEMENT_PROPERTIES[key];
54+
{Object.keys(RESOURCE_PUBLISHING_PROPERTIES).map((key) => {
55+
const { labelId, disabled, tooltipId } = RESOURCE_PUBLISHING_PROPERTIES[key];
56+
return (
57+
<Text key={key} fontSize="sm" className="_row _padding-b-xs">
58+
<Checkbox
59+
style={{ margin: 0 }}
60+
disabled={disabled(resource?.perms || [])}
61+
checked={!!resource?.[key]}
62+
onChange={(event) => onChange({ [key]: !!event.target.checked })}
63+
>
64+
<MessageTooltip msgId={labelId} tooltipId={tooltipId}/>
65+
</Checkbox>
66+
</Text>
67+
);
68+
})}
69+
</FlexBox>
70+
)}
71+
{canManageResourceOptions(resource) && (
72+
<FlexBox column gap="xs">
73+
<Text strong>
74+
<Message msgId={"gnviewer.options"} />
75+
</Text>
76+
{Object.keys(RESOURCE_OPTIONS_PROPERTIES).map((key) => {
77+
const { labelId, disabled, tooltipId } = RESOURCE_OPTIONS_PROPERTIES[key];
5678
return (
5779
<Text key={key} fontSize="sm" className="_row _padding-b-xs">
5880
<Checkbox

geonode_mapstore_client/client/js/plugins/Share/components/Permissions/index.jsx renamed to geonode_mapstore_client/client/js/plugins/ResourceDetails/components/DetailsShare.jsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ const entriesTabs = [
8989
}
9090
];
9191

92-
9392
const Permissions = ({
9493
resourceType,
9594
permissionsLoading,
@@ -116,7 +115,7 @@ const Permissions = ({
116115
});
117116
}, [availableResourceTypes]);
118117
return (
119-
<FlexBox className="gn-permissions-container" column gap="xs">
118+
<FlexBox className="gn-permissions-container _padding-tb-md" column gap="xs">
120119
<Text strong>
121120
<Message msgId={"gnviewer.permissions"} />
122121
</Text>

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

File renamed without changes.

geonode_mapstore_client/client/js/plugins/ResourceDetails/containers/tabComponents.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@ import DetailsAssets from '../components/DetailsAssets';
1212
import DetailsData from '../components/DetailsData';
1313
import DetailsLinkedResources from '../components/DetailsLinkedResources';
1414
import DetailsSettings from '../components/DetailsSettings';
15+
import DetailsShare from '../components/DetailsShare';
1516
import { setResourceExtent, updateResourceProperties } from '@js/actions/gnresource';
1617
import { show } from '@mapstore/framework/actions/notifications';
1718

1819
const tabComponents = {
1920
'locations': connect(() => ({}), { onSetExtent: setResourceExtent })(DetailsLocations),
20-
'linked-resources': DetailsLinkedResources,
21+
'relations': DetailsLinkedResources,
2122
'assets': connect(() => ({}), { onNotify: show, onChange: updateResourceProperties })(DetailsAssets),
2223
'data': connect(() => ({}), { onChange: updateResourceProperties })(DetailsData),
24+
'share': DetailsShare,
2325
'settings': connect(() => ({}), { onChange: updateResourceProperties })(DetailsSettings)
2426
};
2527

geonode_mapstore_client/client/js/plugins/Share/Share.jsx

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

0 commit comments

Comments
 (0)