Skip to content

Commit 0db4795

Browse files
authored
Improve permissions UI for users. (#2198)
1 parent aebda18 commit 0db4795

File tree

3 files changed

+55
-11
lines changed

3 files changed

+55
-11
lines changed

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ import {
2121
import { updateResourceCompactPermissions } from "@js/actions/gnresource";
2222
import {
2323
getCompactPermissions,
24-
getViewedResourceType
24+
getViewedResourceType,
25+
getResourceData,
2526
} from "@js/selectors/resource";
2627
import { getCurrentResourcePermissionsLoading } from "@js/selectors/resourceservice";
2728
import {
@@ -30,6 +31,8 @@ import {
3031
permissionsCompactToLists,
3132
permissionsListsToCompact,
3233
resourceToPermissionEntry,
34+
canManageAnonymousPermissions,
35+
canManageRegisteredMemberPermissions,
3336
ResourceTypes
3437
} from "@js/utils/ResourceUtils";
3538
import GeoLimits from "./GeoLimits";
@@ -93,23 +96,26 @@ const Permissions = ({
9396
resourceType,
9497
permissionsLoading,
9598
compactPermissions,
96-
onChangePermissions
99+
onChangePermissions,
100+
resource
97101
}) => {
98102
const enableGeoLimits = resourceType === ResourceTypes.DATASET;
99103
const isMounted = useIsMounted();
100104
const [permissionsObject, setPermissionsObject] = useState({});
105+
const manageAnonymousPermissions = canManageAnonymousPermissions(resource);
106+
const manageRegisteredMemberPermissions = canManageRegisteredMemberPermissions(resource);
101107

102108
useEffect(() => {
103109
getResourceTypes().then((data) => {
104110
const resourceIndex = findIndex(data, { name: resourceType });
105111
let responseOptions;
106112
if (resourceIndex !== -1) {
107113
responseOptions = getResourcePermissions(
108-
data[resourceIndex].allowed_perms.compact
114+
data[resourceIndex].allowed_perms.compact , compactPermissions?.groups ,manageAnonymousPermissions, manageRegisteredMemberPermissions
109115
);
110116
} else {
111117
// set a default permission object
112-
responseOptions = getResourcePermissions(data[0].allowed_perms.compact);
118+
responseOptions = getResourcePermissions(data[0].allowed_perms.compact, compactPermissions?.groups ,manageAnonymousPermissions, manageRegisteredMemberPermissions);
113119
}
114120
isMounted(() => setPermissionsObject(responseOptions));
115121
});
@@ -144,12 +150,14 @@ export default connect(
144150
[
145151
getCompactPermissions,
146152
getCurrentResourcePermissionsLoading,
147-
getViewedResourceType
153+
getViewedResourceType,
154+
getResourceData,
148155
],
149-
(compactPermissions, permissionsLoading, type) => ({
156+
(compactPermissions, permissionsLoading, type, resource) => ({
150157
compactPermissions,
151158
permissionsLoading,
152-
resourceType: type
159+
resourceType: type,
160+
resource
153161
})
154162
),
155163
{

geonode_mapstore_client/client/js/utils/ResourceUtils.js

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -476,13 +476,48 @@ export const setAvailableResourceTypes = (value) => {
476476
availableResourceTypes = value;
477477
};
478478

479+
export const canManageAnonymousPermissions = (resource) => {
480+
return resourceHasPermission(resource, 'can_manage_anonymous_permissions');
481+
};
482+
483+
export const canManageRegisteredMemberPermissions = (resource) => {
484+
return resourceHasPermission(resource, 'can_manage_registered_member_permissions');
485+
}
486+
487+
/**
488+
* Filters permission options for a group if management is disabled.
489+
* If management is disabled, it restricts the options to only the current permission.
490+
* @param {object} options The permissions options object.
491+
* @param {array} groups The list of groups with their current permissions.
492+
* @param {array} groupNames Array of group names to filter ('anonymous' or 'registered-members').
493+
* @returns {object} Filtered permissions options
494+
*/
495+
const filterGroupPermissions = (options, groups, groupNames) => {
496+
return groupNames.length
497+
? Object.fromEntries(Object.keys(options)
498+
.map((key) => {
499+
if (groupNames.some(name => name === key)) {
500+
const group = groups?.find(g => g.name === key);
501+
const permissionValue = group?.permissions;
502+
const currentPermission = options[key].find(p => p.name === permissionValue);
503+
return currentPermission ? [key, [currentPermission]] : [key, options[key]];
504+
}
505+
return [key, options[key]];
506+
}))
507+
: options;
508+
};
509+
479510
/**
480511
* Extracts lists of permissions into an object for use in the Share plugin select elements
481512
* @param {Object} options Permission Object to extract permissions from
482513
* @returns An object containing permissions for each type of user/group
483514
*/
484-
export const getResourcePermissions = (options) => {
485-
const permissionsOptions = {};
515+
export const getResourcePermissions = (_options , groups, manageAnonymousPermissions=false, manageRegisteredMemberPermissions=false) => {
516+
const options = filterGroupPermissions(_options, groups, [
517+
...(manageAnonymousPermissions ? [] : ['anonymous']),
518+
...(manageRegisteredMemberPermissions? [] : ['registered-members']),
519+
]);
520+
let permissionsOptions = {};
486521
Object.keys(options).forEach((key) => {
487522
const permissions = options[key];
488523
let selectOptions = [];
@@ -897,4 +932,4 @@ export const canManageResourceSettings = (resource) => {
897932
export const canAccessPermissions = (resource) => {
898933
const { perms } = resource || {};
899934
return perms?.includes('change_resourcebase_permissions');
900-
};
935+
};

geonode_mapstore_client/client/js/utils/__tests__/ResourceUtils-test.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ describe('Test Resource Utils', () => {
113113
}
114114
}
115115
}];
116-
const permissionOptions = getResourcePermissions(data[0].allowed_perms.compact);
116+
const groups = [];
117+
const permissionOptions = getResourcePermissions(data[0].allowed_perms.compact, groups);
117118
expect(permissionOptions).toEqual({
118119
test1: [
119120
{ value: 'none', labelId: `gnviewer.nonePermission`, label: 'None' },

0 commit comments

Comments
 (0)