Skip to content
Snippets Groups Projects
Commit fa165701 authored by Miłosz Grocholewski's avatar Miłosz Grocholewski
Browse files

Resolve MIN-128 "Bugfix/ layers edition permission"

parent 739d81b5
No related branches found
No related tags found
1 merge request!385Resolve MIN-128 "Bugfix/ layers edition permission"
...@@ -15,11 +15,13 @@ import { getLayersForModel, removeLayer } from '@/redux/layers/layers.thunks'; ...@@ -15,11 +15,13 @@ import { getLayersForModel, removeLayer } from '@/redux/layers/layers.thunks';
import { showToast } from '@/utils/showToast'; import { showToast } from '@/utils/showToast';
import { SerializedError } from '@reduxjs/toolkit'; import { SerializedError } from '@reduxjs/toolkit';
import { LayersDrawerLayerActions } from '@/components/Map/Drawer/LayersDrawer/LayersDrawerLayerActions.component'; import { LayersDrawerLayerActions } from '@/components/Map/Drawer/LayersDrawer/LayersDrawerLayerActions.component';
import { hasPrivilegeToWriteProjectSelector } from '@/redux/user/user.selectors';
export const LayersDrawer = (): JSX.Element => { export const LayersDrawer = (): JSX.Element => {
const layersForCurrentModel = useAppSelector(layersForCurrentModelSelector); const layersForCurrentModel = useAppSelector(layersForCurrentModelSelector);
const layersVisibilityForCurrentModel = useAppSelector(layersVisibilityForCurrentModelSelector); const layersVisibilityForCurrentModel = useAppSelector(layersVisibilityForCurrentModelSelector);
const currentModelId = useAppSelector(currentModelIdSelector); const currentModelId = useAppSelector(currentModelIdSelector);
const hasPrivilegeToWriteProject = useAppSelector(hasPrivilegeToWriteProjectSelector);
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const [isModalOpen, setIsModalOpen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false);
const [layerId, setLayerId] = useState<number | null>(null); const [layerId, setLayerId] = useState<number | null>(null);
...@@ -72,11 +74,13 @@ export const LayersDrawer = (): JSX.Element => { ...@@ -72,11 +74,13 @@ export const LayersDrawer = (): JSX.Element => {
/> />
<DrawerHeading title="Layers" /> <DrawerHeading title="Layers" />
<div className="flex h-[calc(100%-93px)] max-h-[calc(100%-93px)] flex-col overflow-y-auto px-6"> <div className="flex h-[calc(100%-93px)] max-h-[calc(100%-93px)] flex-col overflow-y-auto px-6">
<div className="flex justify-start pt-2"> {hasPrivilegeToWriteProject && (
<Button icon="plus" isIcon isFrontIcon onClick={addNewLayer}> <div className="flex justify-start pt-2">
Add new layer <Button icon="plus" isIcon isFrontIcon onClick={addNewLayer}>
</Button> Add new layer
</div> </Button>
</div>
)}
{layersForCurrentModel.map(layer => ( {layersForCurrentModel.map(layer => (
<div <div
key={layer.details.id} key={layer.details.id}
......
import { Button } from '@/shared/Button'; import { Button } from '@/shared/Button';
import { Switch } from '@/shared/Switch'; import { Switch } from '@/shared/Switch';
import { hasPrivilegeToWriteProjectSelector } from '@/redux/user/user.selectors';
import { useAppSelector } from '@/redux/hooks/useAppSelector';
type LayersDrawerLayerActionsProps = { type LayersDrawerLayerActionsProps = {
editLayer: () => void; editLayer: () => void;
...@@ -14,13 +16,19 @@ export const LayersDrawerLayerActions = ({ ...@@ -14,13 +16,19 @@ export const LayersDrawerLayerActions = ({
isChecked, isChecked,
toggleVisibility, toggleVisibility,
}: LayersDrawerLayerActionsProps): JSX.Element => { }: LayersDrawerLayerActionsProps): JSX.Element => {
const hasPrivilegeToWriteProject = useAppSelector(hasPrivilegeToWriteProjectSelector);
return ( return (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Switch isChecked={isChecked} onToggle={value => toggleVisibility(value)} /> <Switch isChecked={isChecked} onToggle={value => toggleVisibility(value)} />
<Button onClick={() => editLayer()}>Edit</Button> {hasPrivilegeToWriteProject && (
<Button onClick={() => removeLayer()} color="error" variantStyles="remove"> <>
Remove <Button onClick={() => editLayer()}>Edit</Button>
</Button> <Button onClick={() => removeLayer()} color="error" variantStyles="remove">
Remove
</Button>
</>
)}
</div> </div>
); );
}; };
...@@ -9,11 +9,13 @@ import { useAppSelector } from '@/redux/hooks/useAppSelector'; ...@@ -9,11 +9,13 @@ import { useAppSelector } from '@/redux/hooks/useAppSelector';
import { MapAdditionalLogos } from '@/components/Map/MapAdditionalLogos'; import { MapAdditionalLogos } from '@/components/Map/MapAdditionalLogos';
import { MapDrawActions } from '@/components/Map/MapDrawActions/MapDrawActions.component'; import { MapDrawActions } from '@/components/Map/MapDrawActions/MapDrawActions.component';
import { layersActiveLayerSelector } from '@/redux/layers/layers.selectors'; import { layersActiveLayerSelector } from '@/redux/layers/layers.selectors';
import { hasPrivilegeToWriteProjectSelector } from '@/redux/user/user.selectors';
import { MapAdditionalActions } from './MapAdditionalActions'; import { MapAdditionalActions } from './MapAdditionalActions';
import { PluginsDrawer } from './PluginsDrawer'; import { PluginsDrawer } from './PluginsDrawer';
export const Map = (): JSX.Element => { export const Map = (): JSX.Element => {
const activeLayer = useAppSelector(layersActiveLayerSelector); const activeLayer = useAppSelector(layersActiveLayerSelector);
const hasPrivilegeToWriteProject = useAppSelector(hasPrivilegeToWriteProjectSelector);
return ( return (
<div <div
...@@ -22,8 +24,12 @@ export const Map = (): JSX.Element => { ...@@ -22,8 +24,12 @@ export const Map = (): JSX.Element => {
> >
<MapViewer /> <MapViewer />
<MapVectorBackgroundSelector /> <MapVectorBackgroundSelector />
<MapActiveLayerSelector /> {hasPrivilegeToWriteProject && (
{activeLayer && <MapDrawActions />} <>
<MapActiveLayerSelector />
{activeLayer && <MapDrawActions />}
</>
)}
<Drawer /> <Drawer />
<PluginsDrawer /> <PluginsDrawer />
<Legend /> <Legend />
......
import { rootSelector } from '@/redux/root/root.selectors'; import { rootSelector } from '@/redux/root/root.selectors';
import { createSelector } from '@reduxjs/toolkit'; import { createSelector } from '@reduxjs/toolkit';
import { projectIdSelector } from '@/redux/project/project.selectors';
import { hasPrivilegeToObject } from '@/redux/user/user.utils';
import { UserPrivilege } from '@/types/models';
export const userSelector = createSelector(rootSelector, state => state.user); export const userSelector = createSelector(rootSelector, state => state.user);
...@@ -7,3 +10,17 @@ export const authenticatedUserSelector = createSelector(userSelector, state => s ...@@ -7,3 +10,17 @@ export const authenticatedUserSelector = createSelector(userSelector, state => s
export const loadingUserSelector = createSelector(userSelector, state => state.loading); export const loadingUserSelector = createSelector(userSelector, state => state.loading);
export const loginUserSelector = createSelector(userSelector, state => state.login); export const loginUserSelector = createSelector(userSelector, state => state.login);
export const userRoleSelector = createSelector(userSelector, state => state.role); export const userRoleSelector = createSelector(userSelector, state => state.role);
export const userPrivilegesSelector = createSelector(
userSelector,
state => state.userData?.privileges || [],
);
export const hasPrivilegeToWriteProjectSelector = createSelector(
userPrivilegesSelector,
projectIdSelector,
(userPrivileges: UserPrivilege[], projectId: string | undefined): boolean => {
if (!projectId) {
return false;
}
return hasPrivilegeToObject(userPrivileges, 'WRITE_PROJECT', projectId);
},
);
...@@ -3,3 +3,15 @@ import { UserPrivilege } from '@/types/models'; ...@@ -3,3 +3,15 @@ import { UserPrivilege } from '@/types/models';
export const hasPrivilege = (privileges: UserPrivilege[], privilegeType: string): boolean => { export const hasPrivilege = (privileges: UserPrivilege[], privilegeType: string): boolean => {
return privileges.some(privilege => privilege.privilegeType === privilegeType); return privileges.some(privilege => privilege.privilegeType === privilegeType);
}; };
export const hasPrivilegeToObject = (
privileges: UserPrivilege[],
privilegeType: string,
objectId: string,
): boolean => {
return Boolean(
privileges.find(
privilege => privilege.privilegeType === privilegeType && privilege.objectId === objectId,
),
);
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment