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

fix(layers): added permission to edit layers on the map

parent 11548092
No related branches found
No related tags found
8 merge requests!392Resolve MIN-136 "Feat/ appearance of layer editing",!391fix(layer-text): correct color model in ColorTilePicker,!390feat(layer-image): correct z index on bring to front/back,!389feat(websocket): update information from websocket connection,!388fix(overview-images): add directory to path in useOverviewImageUrl,!387feat(pathway): separation pathway from compartment,!386bugfix(mouse-click): deactivated default mouse clickwhen user edits map,!385Resolve MIN-128 "Bugfix/ layers edition permission"
Pipeline #101031 passed
......@@ -15,11 +15,13 @@ import { getLayersForModel, removeLayer } from '@/redux/layers/layers.thunks';
import { showToast } from '@/utils/showToast';
import { SerializedError } from '@reduxjs/toolkit';
import { LayersDrawerLayerActions } from '@/components/Map/Drawer/LayersDrawer/LayersDrawerLayerActions.component';
import { hasPrivilegeToWriteProjectSelector } from '@/redux/user/user.selectors';
export const LayersDrawer = (): JSX.Element => {
const layersForCurrentModel = useAppSelector(layersForCurrentModelSelector);
const layersVisibilityForCurrentModel = useAppSelector(layersVisibilityForCurrentModelSelector);
const currentModelId = useAppSelector(currentModelIdSelector);
const hasPrivilegeToWriteProject = useAppSelector(hasPrivilegeToWriteProjectSelector);
const dispatch = useAppDispatch();
const [isModalOpen, setIsModalOpen] = useState(false);
const [layerId, setLayerId] = useState<number | null>(null);
......@@ -72,11 +74,13 @@ export const LayersDrawer = (): JSX.Element => {
/>
<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 justify-start pt-2">
<Button icon="plus" isIcon isFrontIcon onClick={addNewLayer}>
Add new layer
</Button>
</div>
{hasPrivilegeToWriteProject && (
<div className="flex justify-start pt-2">
<Button icon="plus" isIcon isFrontIcon onClick={addNewLayer}>
Add new layer
</Button>
</div>
)}
{layersForCurrentModel.map(layer => (
<div
key={layer.details.id}
......
import { Button } from '@/shared/Button';
import { Switch } from '@/shared/Switch';
import { hasPrivilegeToWriteProjectSelector } from '@/redux/user/user.selectors';
import { useAppSelector } from '@/redux/hooks/useAppSelector';
type LayersDrawerLayerActionsProps = {
editLayer: () => void;
......@@ -14,13 +16,19 @@ export const LayersDrawerLayerActions = ({
isChecked,
toggleVisibility,
}: LayersDrawerLayerActionsProps): JSX.Element => {
const hasPrivilegeToWriteProject = useAppSelector(hasPrivilegeToWriteProjectSelector);
return (
<div className="flex items-center gap-2">
<Switch isChecked={isChecked} onToggle={value => toggleVisibility(value)} />
<Button onClick={() => editLayer()}>Edit</Button>
<Button onClick={() => removeLayer()} color="error" variantStyles="remove">
Remove
</Button>
{hasPrivilegeToWriteProject && (
<>
<Button onClick={() => editLayer()}>Edit</Button>
<Button onClick={() => removeLayer()} color="error" variantStyles="remove">
Remove
</Button>
</>
)}
</div>
);
};
......@@ -9,11 +9,13 @@ import { useAppSelector } from '@/redux/hooks/useAppSelector';
import { MapAdditionalLogos } from '@/components/Map/MapAdditionalLogos';
import { MapDrawActions } from '@/components/Map/MapDrawActions/MapDrawActions.component';
import { layersActiveLayerSelector } from '@/redux/layers/layers.selectors';
import { hasPrivilegeToWriteProjectSelector } from '@/redux/user/user.selectors';
import { MapAdditionalActions } from './MapAdditionalActions';
import { PluginsDrawer } from './PluginsDrawer';
export const Map = (): JSX.Element => {
const activeLayer = useAppSelector(layersActiveLayerSelector);
const hasPrivilegeToWriteProject = useAppSelector(hasPrivilegeToWriteProjectSelector);
return (
<div
......@@ -22,8 +24,12 @@ export const Map = (): JSX.Element => {
>
<MapViewer />
<MapVectorBackgroundSelector />
<MapActiveLayerSelector />
{activeLayer && <MapDrawActions />}
{hasPrivilegeToWriteProject && (
<>
<MapActiveLayerSelector />
{activeLayer && <MapDrawActions />}
</>
)}
<Drawer />
<PluginsDrawer />
<Legend />
......
import { rootSelector } from '@/redux/root/root.selectors';
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);
......@@ -7,3 +10,17 @@ export const authenticatedUserSelector = createSelector(userSelector, state => s
export const loadingUserSelector = createSelector(userSelector, state => state.loading);
export const loginUserSelector = createSelector(userSelector, state => state.login);
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';
export const hasPrivilege = (privileges: UserPrivilege[], privilegeType: string): boolean => {
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