diff --git a/src/app/core/interceptors/view-only.interceptor.ts b/src/app/core/interceptors/view-only.interceptor.ts
index 908913796..a0a4d91e1 100644
--- a/src/app/core/interceptors/view-only.interceptor.ts
+++ b/src/app/core/interceptors/view-only.interceptor.ts
@@ -15,6 +15,10 @@ export const viewOnlyInterceptor: HttpInterceptorFn = (
const viewOnlyParam = getViewOnlyParam(router);
if (!req.url.includes('/api.crossref.org/funders') && viewOnlyParam) {
+ if (req.url.includes('view_only=')) {
+ return next(req);
+ }
+
const separator = req.url.includes('?') ? '&' : '?';
const updatedUrl = `${req.url}${separator}view_only=${encodeURIComponent(viewOnlyParam)}`;
diff --git a/src/app/features/files/components/file-keywords/file-keywords.component.html b/src/app/features/files/components/file-keywords/file-keywords.component.html
index 495d7d9e5..123708174 100644
--- a/src/app/features/files/components/file-keywords/file-keywords.component.html
+++ b/src/app/features/files/components/file-keywords/file-keywords.component.html
@@ -1,21 +1,28 @@
{{ 'files.detail.keywords.title' | translate }}
-
-
+ @if (!hasViewOnly()) {
+
+
+
+
+ }
@if (!isTagsLoading()) {
@for (tag of tags(); track $index) {
-
+
}
} @else {
diff --git a/src/app/features/files/components/file-keywords/file-keywords.component.ts b/src/app/features/files/components/file-keywords/file-keywords.component.ts
index 7991a5740..80e08b78d 100644
--- a/src/app/features/files/components/file-keywords/file-keywords.component.ts
+++ b/src/app/features/files/components/file-keywords/file-keywords.component.ts
@@ -7,11 +7,12 @@ import { Chip } from 'primeng/chip';
import { InputText } from 'primeng/inputtext';
import { Skeleton } from 'primeng/skeleton';
-import { ChangeDetectionStrategy, Component, DestroyRef, inject } from '@angular/core';
+import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';
+import { Router } from '@angular/router';
-import { CustomValidators } from '@osf/shared/helpers';
+import { CustomValidators, hasViewOnlyParam } from '@osf/shared/helpers';
import { InputLimits } from '@shared/constants';
import { FilesSelectors, UpdateTags } from '../../store';
@@ -26,10 +27,12 @@ import { FilesSelectors, UpdateTags } from '../../store';
export class FileKeywordsComponent {
private readonly actions = createDispatchMap({ updateTags: UpdateTags });
private readonly destroyRef = inject(DestroyRef);
+ private readonly router = inject(Router);
readonly tags = select(FilesSelectors.getFileTags);
readonly isTagsLoading = select(FilesSelectors.isFileTagsLoading);
readonly file = select(FilesSelectors.getOpenedFile);
+ readonly hasViewOnly = computed(() => hasViewOnlyParam(this.router));
keywordControl = new FormControl('', {
nonNullable: true,
diff --git a/src/app/features/files/components/file-metadata/file-metadata.component.html b/src/app/features/files/components/file-metadata/file-metadata.component.html
index 868f4fbd1..1f24fde19 100644
--- a/src/app/features/files/components/file-metadata/file-metadata.component.html
+++ b/src/app/features/files/components/file-metadata/file-metadata.component.html
@@ -2,15 +2,17 @@
{{ 'files.detail.fileMetadata.title' | translate }}
-
-
+ @if (!hasViewOnly()) {
+
+
+
+ }
@if (isLoading()) {
diff --git a/src/app/features/files/components/file-metadata/file-metadata.component.ts b/src/app/features/files/components/file-metadata/file-metadata.component.ts
index cd7ec7d92..5c24dfa75 100644
--- a/src/app/features/files/components/file-metadata/file-metadata.component.ts
+++ b/src/app/features/files/components/file-metadata/file-metadata.component.ts
@@ -8,11 +8,12 @@ import { Skeleton } from 'primeng/skeleton';
import { filter, map, of } from 'rxjs';
-import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
+import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
-import { ActivatedRoute } from '@angular/router';
+import { ActivatedRoute, Router } from '@angular/router';
import { languageCodes } from '@osf/shared/constants';
+import { hasViewOnlyParam } from '@osf/shared/helpers';
import { LanguageCodeModel } from '@osf/shared/models';
import { FileMetadataFields } from '../../constants';
@@ -33,11 +34,13 @@ import { environment } from 'src/environments/environment';
export class FileMetadataComponent {
private readonly actions = createDispatchMap({ setFileMetadata: SetFileMetadata });
private readonly route = inject(ActivatedRoute);
+ private readonly router = inject(Router);
private readonly dialogService = inject(DialogService);
private readonly translateService = inject(TranslateService);
fileMetadata = select(FilesSelectors.getFileCustomMetadata);
isLoading = select(FilesSelectors.isFileMetadataLoading);
+ hasViewOnly = computed(() => hasViewOnlyParam(this.router));
readonly languageCodes = languageCodes;
diff --git a/src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.html b/src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.html
index 73a66aca3..06b9f50c5 100644
--- a/src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.html
+++ b/src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.html
@@ -98,7 +98,7 @@
{{ 'files.detail.resourceMetadata.fields.dateModified' | translate }}
@if (isResourceContributorsLoading()) {
} @else {
- @if (contributors()?.length) {
+ @if (contributors()?.length && !hasViewOnly()) {
{{ 'files.detail.resourceMetadata.fields.contributors' | translate }}
diff --git a/src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.ts b/src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.ts
index 3e962d0c2..adcaaab74 100644
--- a/src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.ts
+++ b/src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.ts
@@ -5,8 +5,10 @@ import { TranslatePipe } from '@ngx-translate/core';
import { Skeleton } from 'primeng/skeleton';
import { DatePipe } from '@angular/common';
-import { ChangeDetectionStrategy, Component, input } from '@angular/core';
-import { RouterLink } from '@angular/router';
+import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
+import { Router, RouterLink } from '@angular/router';
+
+import { hasViewOnlyParam } from '@osf/shared/helpers';
import { FilesSelectors } from '../../store';
@@ -18,9 +20,12 @@ import { FilesSelectors } from '../../store';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FileResourceMetadataComponent {
+ private readonly router = inject(Router);
+
resourceType = input
('nodes');
resourceMetadata = select(FilesSelectors.getResourceMetadata);
contributors = select(FilesSelectors.getContributors);
isResourceMetadataLoading = select(FilesSelectors.isResourceMetadataLoading);
isResourceContributorsLoading = select(FilesSelectors.isResourceContributorsLoading);
+ hasViewOnly = computed(() => hasViewOnlyParam(this.router));
}
diff --git a/src/app/features/files/mappers/resource-metadata.mapper.ts b/src/app/features/files/mappers/resource-metadata.mapper.ts
index b5a993af2..0f3890722 100644
--- a/src/app/features/files/mappers/resource-metadata.mapper.ts
+++ b/src/app/features/files/mappers/resource-metadata.mapper.ts
@@ -13,16 +13,19 @@ export function MapResourceMetadata(
description: shortInfo.data.attributes.description,
dateCreated: new Date(shortInfo.data.attributes.date_created),
dateModified: new Date(shortInfo.data.attributes.date_modified),
- funders: customMetadata.data.embeds.custom_metadata.data.attributes.funders.map((funder) => ({
- funderName: funder.funder_name,
- funderIdentifier: funder.funder_identifier,
- funderIdentifierType: funder.funder_identifier_type,
- awardNumber: funder.award_number,
- awardUri: funder.award_uri,
- awardTitle: funder.award_title,
- })),
- identifiers: IdentifiersMapper.fromJsonApi(shortInfo.data.embeds.identifiers),
- language: customMetadata.data.embeds.custom_metadata.data.attributes.language,
- resourceTypeGeneral: customMetadata.data.embeds.custom_metadata.data.attributes.resource_type_general,
+ funders:
+ customMetadata.data.embeds?.custom_metadata?.data?.attributes?.funders?.map((funder) => ({
+ funderName: funder.funder_name,
+ funderIdentifier: funder.funder_identifier,
+ funderIdentifierType: funder.funder_identifier_type,
+ awardNumber: funder.award_number,
+ awardUri: funder.award_uri,
+ awardTitle: funder.award_title,
+ })) || [],
+ identifiers: shortInfo.data.embeds?.identifiers?.data.length
+ ? IdentifiersMapper.fromJsonApi(shortInfo.data.embeds?.identifiers)
+ : [],
+ language: customMetadata.data.embeds?.custom_metadata?.data?.attributes?.language || '',
+ resourceTypeGeneral: customMetadata.data.embeds?.custom_metadata?.data?.attributes?.resource_type_general || '',
};
}
diff --git a/src/app/features/files/pages/file-detail/file-detail.component.html b/src/app/features/files/pages/file-detail/file-detail.component.html
index 05c85e754..1e7d75fd7 100644
--- a/src/app/features/files/pages/file-detail/file-detail.component.html
+++ b/src/app/features/files/pages/file-detail/file-detail.component.html
@@ -1,6 +1,6 @@
-
+
{{ 'files.detail.tabs.details' | translate }}
{{ 'files.detail.tabs.revisions' | translate }}
@@ -12,13 +12,13 @@
- @if (!isAnonymous()) {
+ @if (!isAnonymous() && !hasViewOnly()) {
}
- @if (file() && !isAnonymous()) {
+ @if (file() && !isAnonymous() && !hasViewOnly()) {
} @else {
-