diff --git a/geonode_mapstore_client/client/js/plugins/ResourceDetails/components/DetailsShare.jsx b/geonode_mapstore_client/client/js/plugins/ResourceDetails/components/DetailsShare.jsx index b159a23326..45b1ea9fdb 100644 --- a/geonode_mapstore_client/client/js/plugins/ResourceDetails/components/DetailsShare.jsx +++ b/geonode_mapstore_client/client/js/plugins/ResourceDetails/components/DetailsShare.jsx @@ -21,7 +21,8 @@ import { import { updateResourceCompactPermissions } from "@js/actions/gnresource"; import { getCompactPermissions, - getViewedResourceType + getViewedResourceType, + getResourceData, } from "@js/selectors/resource"; import { getCurrentResourcePermissionsLoading } from "@js/selectors/resourceservice"; import { @@ -30,6 +31,8 @@ import { permissionsCompactToLists, permissionsListsToCompact, resourceToPermissionEntry, + canManageAnonymousPermissions, + canManageRegisteredMemberPermissions, ResourceTypes } from "@js/utils/ResourceUtils"; import GeoLimits from "./GeoLimits"; @@ -93,11 +96,14 @@ const Permissions = ({ resourceType, permissionsLoading, compactPermissions, - onChangePermissions + onChangePermissions, + resource }) => { const enableGeoLimits = resourceType === ResourceTypes.DATASET; const isMounted = useIsMounted(); const [permissionsObject, setPermissionsObject] = useState({}); + const manageAnonymousPermissions = canManageAnonymousPermissions(resource); + const manageRegisteredMemberPermissions = canManageRegisteredMemberPermissions(resource); useEffect(() => { getResourceTypes().then((data) => { @@ -105,11 +111,11 @@ const Permissions = ({ let responseOptions; if (resourceIndex !== -1) { responseOptions = getResourcePermissions( - data[resourceIndex].allowed_perms.compact + data[resourceIndex].allowed_perms.compact , compactPermissions?.groups ,manageAnonymousPermissions, manageRegisteredMemberPermissions ); } else { // set a default permission object - responseOptions = getResourcePermissions(data[0].allowed_perms.compact); + responseOptions = getResourcePermissions(data[0].allowed_perms.compact, compactPermissions?.groups ,manageAnonymousPermissions, manageRegisteredMemberPermissions); } isMounted(() => setPermissionsObject(responseOptions)); }); @@ -144,12 +150,14 @@ export default connect( [ getCompactPermissions, getCurrentResourcePermissionsLoading, - getViewedResourceType + getViewedResourceType, + getResourceData, ], - (compactPermissions, permissionsLoading, type) => ({ + (compactPermissions, permissionsLoading, type, resource) => ({ compactPermissions, permissionsLoading, - resourceType: type + resourceType: type, + resource }) ), { diff --git a/geonode_mapstore_client/client/js/utils/ResourceUtils.js b/geonode_mapstore_client/client/js/utils/ResourceUtils.js index ad72eda448..75e4541523 100644 --- a/geonode_mapstore_client/client/js/utils/ResourceUtils.js +++ b/geonode_mapstore_client/client/js/utils/ResourceUtils.js @@ -476,13 +476,48 @@ export const setAvailableResourceTypes = (value) => { availableResourceTypes = value; }; +export const canManageAnonymousPermissions = (resource) => { + return resourceHasPermission(resource, 'can_manage_anonymous_permissions'); +}; + +export const canManageRegisteredMemberPermissions = (resource) => { + return resourceHasPermission(resource, 'can_manage_registered_member_permissions'); +} + +/** + * Filters permission options for a group if management is disabled. + * If management is disabled, it restricts the options to only the current permission. + * @param {object} options The permissions options object. + * @param {array} groups The list of groups with their current permissions. + * @param {array} groupNames Array of group names to filter ('anonymous' or 'registered-members'). + * @returns {object} Filtered permissions options + */ +const filterGroupPermissions = (options, groups, groupNames) => { + return groupNames.length + ? Object.fromEntries(Object.keys(options) + .map((key) => { + if (groupNames.some(name => name === key)) { + const group = groups?.find(g => g.name === key); + const permissionValue = group?.permissions; + const currentPermission = options[key].find(p => p.name === permissionValue); + return currentPermission ? [key, [currentPermission]] : [key, options[key]]; + } + return [key, options[key]]; + })) + : options; +}; + /** * Extracts lists of permissions into an object for use in the Share plugin select elements * @param {Object} options Permission Object to extract permissions from * @returns An object containing permissions for each type of user/group */ -export const getResourcePermissions = (options) => { - const permissionsOptions = {}; +export const getResourcePermissions = (_options , groups, manageAnonymousPermissions=false, manageRegisteredMemberPermissions=false) => { + const options = filterGroupPermissions(_options, groups, [ + ...(manageAnonymousPermissions ? [] : ['anonymous']), + ...(manageRegisteredMemberPermissions? [] : ['registered-members']), + ]); + let permissionsOptions = {}; Object.keys(options).forEach((key) => { const permissions = options[key]; let selectOptions = []; @@ -897,4 +932,4 @@ export const canManageResourceSettings = (resource) => { export const canAccessPermissions = (resource) => { const { perms } = resource || {}; return perms?.includes('change_resourcebase_permissions'); -}; +}; \ No newline at end of file diff --git a/geonode_mapstore_client/client/js/utils/__tests__/ResourceUtils-test.js b/geonode_mapstore_client/client/js/utils/__tests__/ResourceUtils-test.js index 9ef50cc175..1ddab9f61f 100644 --- a/geonode_mapstore_client/client/js/utils/__tests__/ResourceUtils-test.js +++ b/geonode_mapstore_client/client/js/utils/__tests__/ResourceUtils-test.js @@ -113,7 +113,8 @@ describe('Test Resource Utils', () => { } } }]; - const permissionOptions = getResourcePermissions(data[0].allowed_perms.compact); + const groups = []; + const permissionOptions = getResourcePermissions(data[0].allowed_perms.compact, groups); expect(permissionOptions).toEqual({ test1: [ { value: 'none', labelId: `gnviewer.nonePermission`, label: 'None' },