Skip to content

Commit ffd3779

Browse files
rrromchIkNazar690nsemets
authored
Fix - Registration permissions (#486)
* fix(permissions): added permissions * fix(updates): updates * feat(metadata): Implemented permissions for metadata page * feat(registry-resource): Implemented permissions for resources page * fix(registration): Implemented permissions * fix(registration): Fixed write user permissions * fix(registration): Fixed permissions for My registrations --------- Co-authored-by: Nazar Semets <[email protected]> Co-authored-by: nsemets <[email protected]>
1 parent 90a0903 commit ffd3779

27 files changed

+186
-93
lines changed

src/app/features/metadata/components/cedar-template-form/cedar-template-form.component.html

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ <h3 class="text-lg">{{ 'project.metadata.addMetadata.publishedText' | translate
77
} @else {
88
<h3 class="text-lg text-red-500">{{ 'project.metadata.addMetadata.notPublishedText' | translate }}</h3>
99
}
10-
<p-button
11-
class="w-10rem flex-shrink-0 btn-full-width"
12-
severity="secondary"
13-
[label]="'project.metadata.addMetadata.editRecord' | translate"
14-
(onClick)="editModeEmit()"
15-
>
16-
</p-button>
10+
@if (showEditButton()) {
11+
<p-button
12+
class="w-10rem flex-shrink-0 btn-full-width"
13+
severity="secondary"
14+
[label]="'project.metadata.addMetadata.editRecord' | translate"
15+
(onClick)="editModeEmit()"
16+
>
17+
</p-button>
18+
}
1719
</div>
1820
}
1921

src/app/features/metadata/components/metadata-license/metadata-license.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div class="flex justify-content-between align-items-center">
33
<h2>{{ 'project.overview.metadata.license' | translate }}</h2>
44

5-
@if (!hideEditLicense()) {
5+
@if (!readonly()) {
66
<p-button
77
severity="secondary"
88
[label]="'common.buttons.edit' | translate"

src/app/features/metadata/components/metadata-license/metadata-license.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ import { LicenseModel } from '@shared/models';
1515
})
1616
export class MetadataLicenseComponent {
1717
openEditLicenseDialog = output<void>();
18-
hideEditLicense = input<boolean>(false);
18+
readonly = input<boolean>(false);
1919
license = input<LicenseModel | null>(null);
2020
}

src/app/features/metadata/components/metadata-tags/metadata-tags.component.html

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@
22
<div class="flex flex-column gap-3">
33
<h2>{{ 'project.overview.metadata.tags' | translate }}</h2>
44

5-
<osf-tags-input (tagsChanged)="tagsChanged.emit($event)" [tags]="tags()" />
5+
@if (readonly()) {
6+
<div class="flex flex-wrap gap-2">
7+
@for (tag of tags(); track tag) {
8+
<p-tag
9+
class="cursor-pointer hover:bg-black-alpha-10"
10+
[value]="tag"
11+
severity="info"
12+
(click)="tagClicked(tag)"
13+
/>
14+
}
15+
</div>
16+
} @else {
17+
<osf-tags-input (tagsChanged)="tagsChanged.emit($event)" [tags]="tags()" />
18+
}
619
</div>
720
</p-card>
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
import { TranslatePipe } from '@ngx-translate/core';
22

33
import { Card } from 'primeng/card';
4+
import { Tag } from 'primeng/tag';
45

5-
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
6+
import { ChangeDetectionStrategy, Component, inject, input, output } from '@angular/core';
7+
import { Router } from '@angular/router';
68

79
import { TagsInputComponent } from '@osf/shared/components/tags-input/tags-input.component';
810

911
@Component({
1012
selector: 'osf-metadata-tags',
11-
imports: [Card, TranslatePipe, TagsInputComponent],
13+
imports: [Card, TranslatePipe, TagsInputComponent, Tag],
1214
templateUrl: './metadata-tags.component.html',
1315
styleUrl: './metadata-tags.component.scss',
1416
changeDetection: ChangeDetectionStrategy.OnPush,
1517
})
1618
export class MetadataTagsComponent {
1719
tags = input<string[]>([]);
20+
readonly = input<boolean>(false);
21+
1822
tagsChanged = output<string[]>();
23+
24+
private router = inject(Router);
25+
26+
tagClicked(tag: string) {
27+
this.router.navigate(['/search'], { queryParams: { search: tag } });
28+
}
1929
}

src/app/features/metadata/mappers/metadata.mapper.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export class MetadataMapper {
2727
})),
2828
provider: response.embeds?.provider?.data.id,
2929
public: response.attributes.public,
30+
currentUserPermissions: response.attributes.current_user_permissions,
3031
};
3132
}
3233

src/app/features/metadata/metadata.component.html

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<section class="flex flex-column flex-1">
22
<osf-sub-header
3-
[showButton]="true"
3+
[showButton]="hasWriteAccess()"
44
[buttonLabel]="'project.metadata.addCommunityMetadataRecord.title' | translate"
55
[isButtonDisabled]="isLoading()"
66
(buttonClick)="openAddRecord()"
@@ -13,50 +13,64 @@
1313
[selectedCedarTemplate]="selectedCedarTemplate()!"
1414
[selectedCedarRecord]="selectedCedarRecord()!"
1515
[cedarFormReadonly]="cedarFormReadonly()"
16+
[canEdit]="hasWriteAccess()"
1617
(changeTab)="onTabChange($event)"
1718
(formSubmit)="onCedarFormSubmit($event)"
1819
(cedarFormChangeTemplate)="onCedarFormChangeTemplate()"
1920
(cedarFormEdit)="onCedarFormEdit()"
2021
>
2122
<div class="flex-column flex flex-1 w-full bg-white lg:flex-row">
2223
<div class="col-12 lg:col-6 flex flex-column gap-4">
23-
<osf-metadata-title (openEditTitleDialog)="openEditTitleDialog()" [title]="metadata()?.title!" />
24+
<osf-metadata-title
25+
(openEditTitleDialog)="openEditTitleDialog()"
26+
[title]="metadata()?.title!"
27+
[readonly]="!hasWriteAccess()"
28+
/>
2429

2530
<osf-metadata-description
2631
(openEditDescriptionDialog)="openEditDescriptionDialog()"
2732
[description]="metadata()?.description!"
33+
[readonly]="!hasWriteAccess()"
2834
/>
2935

3036
<osf-metadata-date-info [dateCreated]="metadata()?.dateCreated" [dateModified]="metadata()?.dateModified" />
3137

3238
<osf-metadata-contributors
3339
(openEditContributorDialog)="openEditContributorDialog()"
3440
[contributors]="bibliographicContributors()"
41+
[readonly]="!hasWriteAccess()"
3542
/>
3643

3744
<osf-metadata-resource-information
3845
(openEditResourceInformationDialog)="openEditResourceInformationDialog()"
3946
(showResourceInfo)="onShowResourceInfo()"
4047
[customItemMetadata]="customItemMetadata()!"
48+
[readonly]="!hasWriteAccess()"
4149
/>
4250

4351
<osf-metadata-funding
4452
(openEditFundingDialog)="openEditFundingDialog()"
4553
[funders]="customItemMetadata()?.funders!"
54+
[readonly]="!hasWriteAccess()"
4655
/>
4756

4857
<osf-metadata-affiliated-institutions
4958
(openEditAffiliatedInstitutionsDialog)="openEditAffiliatedInstitutionsDialog()"
5059
[affiliatedInstitutions]="affiliatedInstitutions()"
60+
[readonly]="!hasWriteAccess()"
5161
/>
5262
</div>
5363

5464
<div class="col-12 lg:col-6 flex flex-column gap-4">
55-
<osf-metadata-license (openEditLicenseDialog)="openEditLicenseDialog()" [license]="metadata()?.license!" />
65+
<osf-metadata-license
66+
(openEditLicenseDialog)="openEditLicenseDialog()"
67+
[license]="metadata()?.license!"
68+
[readonly]="!hasWriteAccess()"
69+
/>
5670

5771
<osf-metadata-publication-doi
5872
(openEditPublicationDoiDialog)="handleEditDoi()"
59-
[hideEditDoi]="hideEditDoi()"
73+
[hideEditDoi]="hideEditDoi() || !hasWriteAccess()"
6074
[identifiers]="metadata()?.identifiers!"
6175
[publicationDoi]="metadata()?.publicationDoi || null"
6276
[resourceType]="resourceType()"
@@ -66,14 +80,19 @@
6680
<osf-metadata-registration-doi [identifiers]="metadata()?.identifiers!"></osf-metadata-registration-doi>
6781
}
6882

69-
<osf-metadata-tags [tags]="metadata()?.tags || []" (tagsChanged)="onTagsChanged($event)"></osf-metadata-tags>
83+
<osf-metadata-tags
84+
[tags]="metadata()?.tags || []"
85+
(tagsChanged)="onTagsChanged($event)"
86+
[readonly]="!hasWriteAccess()"
87+
></osf-metadata-tags>
7088

7189
<osf-metadata-subjects
7290
(getSubjectChildren)="getSubjectChildren($event)"
7391
(searchSubjects)="searchSubjects($event)"
7492
(updateSelectedSubjects)="updateSelectedSubjects($event)"
7593
[isSubjectsUpdating]="isSubjectsUpdating()!"
7694
[selectedSubjects]="selectedSubjects()"
95+
[readonly]="!hasAdminAccess()"
7796
/>
7897
</div>
7998
</div>

src/app/features/metadata/metadata.component.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { ActivatedRoute, Router } from '@angular/router';
2121

2222
import { ENVIRONMENT } from '@core/provider/environment.provider';
2323
import { MetadataTabsComponent, SubHeaderComponent } from '@osf/shared/components';
24-
import { MetadataResourceEnum, ResourceType } from '@osf/shared/enums';
24+
import { MetadataResourceEnum, ResourceType, UserPermissions } from '@osf/shared/enums';
2525
import { IS_MEDIUM } from '@osf/shared/helpers';
2626
import { MetadataTabsModel, SubjectModel } from '@osf/shared/models';
2727
import { CustomConfirmationService, ToastService } from '@osf/shared/services';
@@ -191,6 +191,18 @@ export class MetadataComponent implements OnInit {
191191

192192
bibliographicContributors = computed(() => this.contributors().filter((contributor) => contributor.isBibliographic));
193193

194+
hasWriteAccess = computed(() => {
195+
const metadata = this.metadata();
196+
if (!metadata) return false;
197+
return metadata.currentUserPermissions.includes(UserPermissions.Write);
198+
});
199+
200+
hasAdminAccess = computed(() => {
201+
const metadata = this.metadata();
202+
if (!metadata) return false;
203+
return metadata.currentUserPermissions.includes(UserPermissions.Admin);
204+
});
205+
194206
constructor() {
195207
effect(() => {
196208
const records = this.cedarRecords();

src/app/features/metadata/models/metadata-json-api.model.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ApiData, InstitutionsJsonApiResponse, LicenseDataJsonApi, LicenseRecordJsonApi } from '@osf/shared/models';
2+
import { UserPermissions } from '@shared/enums';
23

34
export interface MetadataJsonApiResponse {
45
data: MetadataJsonApi;
@@ -17,6 +18,7 @@ export interface MetadataAttributesJsonApi {
1718
category?: string;
1819
node_license?: LicenseRecordJsonApi;
1920
public?: boolean;
21+
current_user_permissions: UserPermissions[];
2022
}
2123

2224
interface MetadataEmbedsJsonApi {

src/app/features/metadata/models/metadata.model.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Identifier, Institution, LicenseModel } from '@osf/shared/models';
2+
import { UserPermissions } from '@shared/enums';
23

34
export interface Metadata {
45
id: string;
@@ -20,6 +21,7 @@ export interface Metadata {
2021
year: string;
2122
};
2223
public?: boolean;
24+
currentUserPermissions: UserPermissions[];
2325
}
2426

2527
export interface CustomItemMetadataRecord {

0 commit comments

Comments
 (0)