Skip to content

Commit

Permalink
fix: Project Member cannot add instances of resources #DEV-3121 (#1327)
Browse files Browse the repository at this point in the history
  • Loading branch information
irmastnt committed Dec 20, 2023
1 parent 490513e commit e0f57fe
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 23 deletions.
2 changes: 1 addition & 1 deletion apps/dsp-app/src/app/project/project.component.html
Expand Up @@ -89,7 +89,7 @@
<!-- list of ontology classes -->
<app-ontology-classes
[resClasses]="getAllEntityDefinitionsAsArray(onto.classes)"
[projectMember]="isAdmin$ | async">
[projectMember]="(isAdmin$ | async) || (isMember$ | async)">
</app-ontology-classes>
</mat-expansion-panel>
<mat-divider></mat-divider>
Expand Down
25 changes: 16 additions & 9 deletions apps/dsp-app/src/app/project/project.component.ts
Expand Up @@ -2,13 +2,13 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, On
import { MatSidenav } from '@angular/material/sidenav';
import { Title } from '@angular/platform-browser';
import { ActivatedRoute, Router } from '@angular/router';
import { ReadOntology, ReadProject } from '@dasch-swiss/dsp-js';
import { ReadOntology, ReadProject, ReadUser } from '@dasch-swiss/dsp-js';
import { ClassAndPropertyDefinitions } from '@dasch-swiss/dsp-js/src/models/v2/ontologies/ClassAndPropertyDefinitions';
import { MaterialColor, RouteConstants, getAllEntityDefinitionsAsArray } from '@dasch-swiss/vre/shared/app-config';
import { ProjectService } from '@dasch-swiss/vre/shared/app-helper-services';
import { OntologiesSelectors, ProjectsSelectors } from '@dasch-swiss/vre/shared/app-state';
import { OntologiesSelectors, ProjectsSelectors, UserSelectors } from '@dasch-swiss/vre/shared/app-state';
import { Actions, Select, Store } from '@ngxs/store';
import { Observable, Subscription, of, combineLatest } from 'rxjs';
import { Observable, Subscription, combineLatest, of } from 'rxjs';
import { map, take } from 'rxjs/operators';
import { ComponentCommunicationEventService, Events } from '../main/services/component-communication-event.service';
import { ProjectBase } from './project-base';
Expand Down Expand Up @@ -44,6 +44,14 @@ export class ProjectComponent extends ProjectBase implements OnInit {
dataModelsRoute: AvailableRoute = RouteConstants.dataModels;
advancedSearchRoute: AvailableRoute = RouteConstants.advancedSearch;

get isMember$(): Observable<boolean> {
return combineLatest([this.user$, this.userProjectAdminGroups$]).pipe(
map(([user, userProjectAdminGroups]) =>
ProjectService.IsProjectMember(user, userProjectAdminGroups, this.projectUuid)
)
);
}

get color$(): Observable<string> {
return this.readProject$.pipe(
map(readProject => (!readProject.status ? MaterialColor.Warn : MaterialColor.Primary))
Expand Down Expand Up @@ -84,13 +92,12 @@ export class ProjectComponent extends ProjectBase implements OnInit {
);
}

@Select(UserSelectors.user) user$: Observable<ReadUser>;
@Select(UserSelectors.userProjects) userProjects$: Observable<ReadUser>;
@Select(ProjectsSelectors.readProjects) readProjects$: Observable<ReadProject[]>;
@Select(ProjectsSelectors.isProjectsLoading)
isProjectsLoading$: Observable<boolean>;
@Select(OntologiesSelectors.isLoading)
isOntologiesLoading$: Observable<boolean>;
@Select(OntologiesSelectors.hasLoadingErrors)
hasLoadingErrors$: Observable<boolean>;
@Select(ProjectsSelectors.isProjectsLoading) isProjectsLoading$: Observable<boolean>;
@Select(OntologiesSelectors.isLoading) isOntologiesLoading$: Observable<boolean>;
@Select(OntologiesSelectors.hasLoadingErrors) hasLoadingErrors$: Observable<boolean>;

constructor(
private _componentCommsService: ComponentCommunicationEventService,
Expand Down
Expand Up @@ -43,13 +43,11 @@ export class ProjectService {
userProjectGroups.some(e => e === projectIri);

static IsMemberOfProjectAdminGroup = (groupsPerProject: { [key: string]: string[] }, projectIri: string): boolean =>
groupsPerProject &&
groupsPerProject[projectIri] &&
(groupsPerProject && groupsPerProject[projectIri]) !== undefined &&
groupsPerProject[projectIri].indexOf(Constants.ProjectAdminGroupIRI) > -1;

static IsMemberOfSystemAdminGroup = (groupsPerProject: { [key: string]: string[] }): boolean =>
groupsPerProject &&
groupsPerProject[Constants.SystemProjectIRI] &&
(groupsPerProject && groupsPerProject[Constants.SystemProjectIRI]) !== undefined &&
groupsPerProject[Constants.SystemProjectIRI].indexOf(Constants.SystemAdminGroupIRI) > -1;

static IsProjectAdmin(
Expand Down
24 changes: 15 additions & 9 deletions libs/vre/shared/app-state/src/lib/projects/projects.state.ts
Expand Up @@ -8,6 +8,7 @@ import {
ProjectResponse,
ProjectsResponse,
ReadGroup,
ReadUser,
UserResponse,
} from '@dasch-swiss/dsp-js';
import { DspApiConnectionToken } from '@dasch-swiss/vre/shared/app-config';
Expand All @@ -21,15 +22,15 @@ import { IKeyValuePairs } from '../model-interfaces';
import { SetUserAction } from '../user/user.actions';
import { UserSelectors } from '../user/user.selectors';
import {
LoadProjectsAction,
LoadProjectAction,
ClearProjectsAction,
RemoveUserFromProjectAction,
AddUserToProjectMembershipAction,
LoadProjectMembersAction,
ClearProjectsAction,
LoadProjectAction,
LoadProjectGroupsAction,
UpdateProjectAction,
LoadProjectMembersAction,
LoadProjectsAction,
RemoveUserFromProjectAction,
SetProjectMemberAction,
UpdateProjectAction,
} from './projects.actions';
import { ProjectsStateModel } from './projects.state-model';

Expand Down Expand Up @@ -124,9 +125,14 @@ export class ProjectsState {
this.errorHandler.showMessage(error);
},
}),
concatMap(() =>
ctx.dispatch([new LoadProjectMembersAction(projectUuid), new LoadProjectGroupsAction(projectUuid)])
),
concatMap(() => {
const user = this.store.selectSnapshot(UserSelectors.user) as ReadUser;
const userProjectAdminGroups = this.store.selectSnapshot(UserSelectors.userProjectAdminGroups);
const isProjectAdmin = ProjectService.IsProjectAdminOrSysAdmin(user, userProjectAdminGroups, projectIri);
return isProjectAdmin
? ctx.dispatch([new LoadProjectMembersAction(projectUuid), new LoadProjectGroupsAction(projectUuid)])
: EMPTY;
}),
finalize(() => {
ctx.patchState({ isLoading: false });
})
Expand Down

0 comments on commit e0f57fe

Please sign in to comment.