From e58479d880454f58ffaf5d8d1f3701d4cf84fc50 Mon Sep 17 00:00:00 2001 From: Nazar Semets Date: Fri, 19 Sep 2025 11:59:22 +0300 Subject: [PATCH 1/7] fix(permissions): added permissions --- .../overview-toolbar.component.html | 4 +- .../overview-toolbar.component.ts | 2 +- .../overview/project-overview.component.html | 4 +- .../registry-revisions.component.html | 53 ++++++++++--------- .../registry-revisions.component.ts | 1 + .../registry-statuses.component.html | 2 +- .../registry-statuses.component.ts | 8 +-- .../models/registry-overview.models.ts | 4 +- .../registry-overview.component.html | 14 +++-- .../registry-overview.component.ts | 6 +++ .../registry-overview.selectors.ts | 21 ++++++++ .../resource-citations.component.html | 4 +- .../resource-citations.component.ts | 8 ++- .../resource-metadata.component.html | 4 +- .../resource-metadata.component.ts | 2 +- 15 files changed, 89 insertions(+), 48 deletions(-) diff --git a/src/app/features/project/overview/components/overview-toolbar/overview-toolbar.component.html b/src/app/features/project/overview/components/overview-toolbar/overview-toolbar.component.html index 5088423ae..f67364529 100644 --- a/src/app/features/project/overview/components/overview-toolbar/overview-toolbar.component.html +++ b/src/app/features/project/overview/components/overview-toolbar/overview-toolbar.component.html @@ -2,7 +2,7 @@ @if (resource) {
- @if (!isCollectionsRoute() && isAdmin() && !isRegistration) { + @if (!isCollectionsRoute() && canEdit() && !isRegistration) {
@@ -46,7 +46,7 @@ }
- @if (showViewOnlyLinks() && isAdmin()) { + @if (showViewOnlyLinks() && canEdit()) { (false); - isAdmin = input.required(); + canEdit = input.required(); currentResource = input.required(); projectTitle = input(''); projectDescription = input(''); diff --git a/src/app/features/project/overview/project-overview.component.html b/src/app/features/project/overview/project-overview.component.html index 39dae20c9..5b6c3ef5d 100644 --- a/src/app/features/project/overview/project-overview.component.html +++ b/src/app/features/project/overview/project-overview.component.html @@ -18,7 +18,7 @@ [currentResource]="currentResource()" [projectTitle]="project.title" [projectDescription]="project.description" - [isAdmin]="isAdmin" + [canEdit]="isAdmin" />
@@ -93,7 +93,7 @@ [currentResource]="resourceOverview()" (customCitationUpdated)="onCustomCitationUpdated($event)" [isCollectionsRoute]="isCollectionsRoute()" - [canWrite]="canWrite" + [canEdit]="canWrite" />
diff --git a/src/app/features/registry/components/registry-revisions/registry-revisions.component.html b/src/app/features/registry/components/registry-revisions/registry-revisions.component.html index d423881d0..264c0d3c6 100644 --- a/src/app/features/registry/components/registry-revisions/registry-revisions.component.html +++ b/src/app/features/registry/components/registry-revisions/registry-revisions.component.html @@ -16,31 +16,34 @@ (click)="emitOpenRevision($index)" /> } - @if (registryAcceptedUnapproved) { - - } - @if (registryApproved) { - - } - @if (registryInProgress) { - + + @if (!readonly()) { + @if (registryAcceptedUnapproved) { + + } + @if (registryApproved) { + + } + @if (registryInProgress) { + + } } }
diff --git a/src/app/features/registry/components/registry-revisions/registry-revisions.component.ts b/src/app/features/registry/components/registry-revisions/registry-revisions.component.ts index a028e61f3..d78440d77 100644 --- a/src/app/features/registry/components/registry-revisions/registry-revisions.component.ts +++ b/src/app/features/registry/components/registry-revisions/registry-revisions.component.ts @@ -24,6 +24,7 @@ export class RegistryRevisionsComponent { selectedRevisionIndex = input.required(); isSubmitting = input(false); isModeration = input(false); + readonly = input(false); openRevision = output(); readonly updateRegistration = output(); diff --git a/src/app/features/registry/components/registry-statuses/registry-statuses.component.html b/src/app/features/registry/components/registry-statuses/registry-statuses.component.html index ffbf58693..5d8da05ac 100644 --- a/src/app/features/registry/components/registry-statuses/registry-statuses.component.html +++ b/src/app/features/registry/components/registry-statuses/registry-statuses.component.html @@ -7,7 +7,7 @@

{{ 'registry.overview.statuses.' + registry()?.status + '.short' | translate }}

{{ 'registry.overview.statuses.' + registry()?.status + '.long' | translate }}

- @if (!hasViewOnly()) { + @if (!readonly()) { @if (canWithdraw) { (); + readonly = input(false); readonly RegistryStatus = RegistryStatus; readonly RevisionReviewStates = RevisionReviewStates; @@ -44,10 +44,6 @@ export class RegistryStatusesComponent { ); } - hasViewOnly = computed(() => { - return hasViewOnlyParam(this.router); - }); - openWithdrawDialog(): void { const registry = this.registry(); if (registry) { diff --git a/src/app/features/registry/models/registry-overview.models.ts b/src/app/features/registry/models/registry-overview.models.ts index 2b15cc715..fcfe238a0 100644 --- a/src/app/features/registry/models/registry-overview.models.ts +++ b/src/app/features/registry/models/registry-overview.models.ts @@ -9,7 +9,7 @@ import { SchemaResponse, SubjectModel, } from '@osf/shared/models'; -import { RegistrationReviewStates, RegistryStatus, RevisionReviewStates } from '@shared/enums'; +import { RegistrationReviewStates, RegistryStatus, RevisionReviewStates, UserPermissions } from '@shared/enums'; export interface RegistryOverview { id: string; @@ -41,7 +41,7 @@ export interface RegistryOverview { }[]; analyticsKey: string; currentUserCanComment: boolean; - currentUserPermissions: string[]; + currentUserPermissions: UserPermissions[]; currentUserIsContributor: boolean; currentUserIsContributorOrGroupMember: boolean; wikiEnabled: boolean; diff --git a/src/app/features/registry/pages/registry-overview/registry-overview.component.html b/src/app/features/registry/pages/registry-overview/registry-overview.component.html index 52f18d280..918be7084 100644 --- a/src/app/features/registry/pages/registry-overview/registry-overview.component.html +++ b/src/app/features/registry/pages/registry-overview/registry-overview.component.html @@ -13,7 +13,11 @@ @if (!registry()?.archiving && !registry()?.withdrawn) {
- +
}
@@ -61,7 +65,10 @@

@if (!isAnonymous()) {
- + (continueUpdate)="onContinueUpdateRegistration()" [isModeration]="isModeration" [isSubmitting]="isSchemaResponseLoading()" + [readonly]="hasNoPermissions() || hasReadAccess()" >
@@ -121,7 +129,7 @@

{{ section.title }}

diff --git a/src/app/features/registry/pages/registry-overview/registry-overview.component.ts b/src/app/features/registry/pages/registry-overview/registry-overview.component.ts index 87011a718..25cc50525 100644 --- a/src/app/features/registry/pages/registry-overview/registry-overview.component.ts +++ b/src/app/features/registry/pages/registry-overview/registry-overview.component.ts @@ -93,6 +93,12 @@ export class RegistryOverviewComponent { readonly areReviewActionsLoading = select(RegistryOverviewSelectors.areReviewActionsLoading); readonly currentRevision = select(RegistriesSelectors.getSchemaResponse); readonly isSchemaResponseLoading = select(RegistriesSelectors.getSchemaResponseLoading); + + readonly hasWriteAccess = select(RegistryOverviewSelectors.hasWriteAccess); + readonly hasAdminAccess = select(RegistryOverviewSelectors.hasAdminAccess); + readonly hasReadAccess = select(RegistryOverviewSelectors.hasReadAccess); + readonly hasNoPermissions = select(RegistryOverviewSelectors.hasNoPermissions); + revisionInProgress: SchemaResponse | undefined; isLoading = computed( diff --git a/src/app/features/registry/store/registry-overview/registry-overview.selectors.ts b/src/app/features/registry/store/registry-overview/registry-overview.selectors.ts index 60ce06083..7486da84f 100644 --- a/src/app/features/registry/store/registry-overview/registry-overview.selectors.ts +++ b/src/app/features/registry/store/registry-overview/registry-overview.selectors.ts @@ -2,6 +2,7 @@ import { Selector } from '@ngxs/store'; import { ReviewAction } from '@osf/features/moderation/models'; import { RegistryOverview } from '@osf/features/registry/models'; +import { UserPermissions } from '@osf/shared/enums'; import { Institution, PageSchema } from '@osf/shared/models'; import { RegistryOverviewStateModel } from './registry-overview.model'; @@ -57,4 +58,24 @@ export class RegistryOverviewSelectors { static isReviewActionSubmitting(state: RegistryOverviewStateModel): boolean { return state.moderationActions.isSubmitting || false; } + + @Selector([RegistryOverviewState]) + static hasReadAccess(state: RegistryOverviewStateModel): boolean { + return state.registry.data?.currentUserPermissions.includes(UserPermissions.Read) || false; + } + + @Selector([RegistryOverviewState]) + static hasWriteAccess(state: RegistryOverviewStateModel): boolean { + return state.registry.data?.currentUserPermissions.includes(UserPermissions.Write) || false; + } + + @Selector([RegistryOverviewState]) + static hasAdminAccess(state: RegistryOverviewStateModel): boolean { + return state.registry.data?.currentUserPermissions.includes(UserPermissions.Admin) || false; + } + + @Selector([RegistryOverviewState]) + static hasNoPermissions(state: RegistryOverviewStateModel): boolean { + return !state.registry.data?.currentUserPermissions.length; + } } diff --git a/src/app/shared/components/resource-citations/resource-citations.component.html b/src/app/shared/components/resource-citations/resource-citations.component.html index 41f790c93..f5822462c 100644 --- a/src/app/shared/components/resource-citations/resource-citations.component.html +++ b/src/app/shared/components/resource-citations/resource-citations.component.html @@ -44,7 +44,7 @@

{{ citation.title }}

} } - @if (!isCollectionsRoute()) { + @if (canEdit()) {

{{ 'project.overview.metadata.getMoreCitations' | translate }}

{{ citation.title }} } } } @else { - @if (!isCollectionsRoute()) { + @if (canEdit()) {