Skip to content

Commit ea8bc54

Browse files
committed
fix(files): moved some logic into helpers
1 parent 52a9635 commit ea8bc54

6 files changed

Lines changed: 69 additions & 64 deletions

File tree

src/app/features/files/pages/file-preview/file-preview.component.ts

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { ActivatedRoute, Router } from '@angular/router';
1212
import { FilesSelectors, GetFile } from '@osf/features/files/store';
1313
import { LoadingSpinnerComponent } from '@osf/shared/components/loading-spinner/loading-spinner.component';
1414
import { SubHeaderComponent } from '@osf/shared/components/sub-header/sub-header.component';
15+
import { getMfrUrlWithVersion } from '@osf/shared/helpers/mfr-url.helper';
1516
import { ViewOnlyLinkHelperService } from '@osf/shared/services/view-only-link-helper.service';
1617

1718
@Component({
@@ -50,30 +51,11 @@ export class FilePreviewComponent {
5051
}
5152

5253
getIframeLink(version: string) {
53-
const url = this.getMfrUrlWithVersion(version);
54+
const viewOnlyParam = this.hasViewOnly() ? this.viewOnlyService.getViewOnlyParam() : null;
55+
const url = getMfrUrlWithVersion(this.file()?.links.render, version, viewOnlyParam);
56+
5457
if (url) {
5558
this.safeLink = this.sanitizer.bypassSecurityTrustResourceUrl(url);
5659
}
5760
}
58-
59-
getMfrUrlWithVersion(version?: string): string | null {
60-
const mfrUrl = this.file()?.links.render;
61-
if (!mfrUrl) return null;
62-
const mfrUrlObj = new URL(mfrUrl);
63-
const encodedDownloadUrl = mfrUrlObj.searchParams.get('url');
64-
if (!encodedDownloadUrl) return mfrUrl;
65-
66-
const downloadUrlObj = new URL(decodeURIComponent(encodedDownloadUrl));
67-
68-
if (version) downloadUrlObj.searchParams.set('version', version);
69-
70-
if (this.hasViewOnly()) {
71-
const viewOnlyParam = this.viewOnlyService.getViewOnlyParam();
72-
if (viewOnlyParam) downloadUrlObj.searchParams.set('view_only', viewOnlyParam);
73-
}
74-
75-
mfrUrlObj.searchParams.set('url', downloadUrlObj.toString());
76-
77-
return mfrUrlObj.toString();
78-
}
7961
}

src/app/features/project/overview/components/files-widget/files-widget.component.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createDispatchMap, select } from '@ngxs/store';
22

3-
import { TranslatePipe } from '@ngx-translate/core';
3+
import { TranslatePipe, TranslateService } from '@ngx-translate/core';
44

55
import { Skeleton } from 'primeng/skeleton';
66
import { TabsModule } from 'primeng/tabs';
@@ -32,8 +32,8 @@ import {
3232
import { FilesTreeComponent } from '@osf/shared/components/files-tree/files-tree.component';
3333
import { SelectComponent } from '@osf/shared/components/select/select.component';
3434
import { CurrentResourceType, ResourceType } from '@osf/shared/enums/resource-type.enum';
35+
import { mapRootFoldersToStorageLabels } from '@osf/shared/helpers/storage-addon-options.helper';
3536
import { Primitive } from '@osf/shared/helpers/types.helper';
36-
import { ConfiguredAddonModel } from '@osf/shared/models/addons/configured-addon.model';
3737
import { FileModel } from '@osf/shared/models/files/file.model';
3838
import { FileFolderModel } from '@osf/shared/models/files/file-folder.model';
3939
import { FileLabelModel } from '@osf/shared/models/files/file-label.model';
@@ -61,6 +61,7 @@ export class FilesWidgetComponent {
6161
private readonly destroyRef = inject(DestroyRef);
6262
private readonly viewOnlyService = inject(ViewOnlyLinkHelperService);
6363
private readonly filesService = inject(FilesService);
64+
private readonly translateService = inject(TranslateService);
6465
private readonly platformId = inject(PLATFORM_ID);
6566
private readonly isBrowser = isPlatformBrowser(this.platformId);
6667

@@ -77,7 +78,6 @@ export class FilesWidgetComponent {
7778
currentRootFolder = model<FileLabelModel | null>(null);
7879
pageNumber = signal(1);
7980

80-
readonly osfStorageLabel = 'OSF Storage';
8181
readonly resourceType = CurrentResourceType.Projects;
8282

8383
readonly options = computed(() => {
@@ -86,15 +86,8 @@ export class FilesWidgetComponent {
8686
});
8787

8888
readonly storageAddons = computed(() => {
89-
const rootFolders = this.rootFolders();
90-
const addons = this.configuredStorageAddons();
91-
if (rootFolders && addons) {
92-
return rootFolders.map((folder) => ({
93-
label: this.getAddonName(addons, folder.provider),
94-
folder: folder,
95-
}));
96-
}
97-
return [];
89+
const osfLabel = this.translateService.instant('files.storageLocation');
90+
return mapRootFoldersToStorageLabels(this.rootFolders(), this.configuredStorageAddons(), osfLabel);
9891
});
9992

10093
readonly hasViewOnly = computed(() => this.viewOnlyService.hasViewOnlyParam(this.router));
@@ -132,7 +125,7 @@ export class FilesWidgetComponent {
132125
const osfRootFolder = rootFolders.find((folder) => folder.provider === FileProvider.OsfStorage);
133126
if (osfRootFolder) {
134127
this.currentRootFolder.set({
135-
label: this.osfStorageLabel,
128+
label: this.translateService.instant('files.storageLocation'),
136129
folder: osfRootFolder,
137130
});
138131
}
@@ -205,14 +198,6 @@ export class FilesWidgetComponent {
205198
}, []);
206199
}
207200

208-
private getAddonName(addons: ConfiguredAddonModel[], provider: string): string {
209-
if (provider === FileProvider.OsfStorage) {
210-
return this.osfStorageLabel;
211-
} else {
212-
return addons.find((addon) => addon.externalServiceName === provider)?.displayName ?? '';
213-
}
214-
}
215-
216201
onChangeProject(value: Primitive) {
217202
this.getStorageAddons(value as string);
218203
}

src/app/shared/components/file-select-destination/file-select-destination.component.ts

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createDispatchMap, select } from '@ngxs/store';
22

3-
import { TranslatePipe } from '@ngx-translate/core';
3+
import { TranslatePipe, TranslateService } from '@ngx-translate/core';
44

55
import { Button } from 'primeng/button';
66
import { Skeleton } from 'primeng/skeleton';
@@ -23,7 +23,6 @@ import {
2323
} from '@angular/core';
2424
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
2525

26-
import { FileProvider } from '@osf/features/files/constants';
2726
import {
2827
FilesSelectors,
2928
GetMoveDialogConfiguredStorageAddons,
@@ -35,8 +34,8 @@ import {
3534
import { SupportedFeature } from '@osf/shared/enums/addon-supported-features.enum';
3635
import { ResourceType } from '@osf/shared/enums/resource-type.enum';
3736
import { UserPermissions } from '@osf/shared/enums/user-permissions.enum';
37+
import { mapRootFoldersToStorageLabels } from '@osf/shared/helpers/storage-addon-options.helper';
3838
import { Primitive } from '@osf/shared/helpers/types.helper';
39-
import { ConfiguredAddonModel } from '@osf/shared/models/addons/configured-addon.model';
4039
import { FileLabelModel } from '@osf/shared/models/files/file-label.model';
4140
import { NodeShortInfoModel } from '@osf/shared/models/nodes/node-with-children.model';
4241
import { SelectOption } from '@osf/shared/models/select-option.model';
@@ -59,6 +58,7 @@ export class FileSelectDestinationComponent implements OnInit {
5958
selectStorage = output();
6059

6160
private readonly destroyRef = inject(DestroyRef);
61+
private readonly translateService = inject(TranslateService);
6262

6363
readonly rootFolders = select(FilesSelectors.getMoveDialogRootFolders);
6464
readonly isRootFoldersLoading = select(FilesSelectors.isMoveDialogRootFoldersLoading);
@@ -76,7 +76,6 @@ export class FileSelectDestinationComponent implements OnInit {
7676
setCurrentProvider: SetCurrentProvider,
7777
});
7878

79-
readonly osfStorageLabel = 'OSF Storage';
8079
initialSetup = true;
8180
currentRootFolder = model<FileLabelModel | null>(null);
8281
selectedProject = computed(() => this.options().find((c) => c.value === this.projectId()) || null);
@@ -95,15 +94,8 @@ export class FileSelectDestinationComponent implements OnInit {
9594
});
9695

9796
readonly storageAddons = computed(() => {
98-
const rootFolders = this.rootFolders();
99-
const addons = this.configuredStorageAddons();
100-
if (rootFolders && addons) {
101-
return rootFolders.map((folder) => ({
102-
label: this.getAddonName(addons, folder.provider),
103-
folder: folder,
104-
}));
105-
}
106-
return [];
97+
const osfLabel = this.translateService.instant('files.storageLocation');
98+
return mapRootFoldersToStorageLabels(this.rootFolders(), this.configuredStorageAddons(), osfLabel);
10799
});
108100

109101
private getHasWriteAccess = (project: NodeShortInfoModel): boolean =>
@@ -180,14 +172,6 @@ export class FileSelectDestinationComponent implements OnInit {
180172
});
181173
}
182174

183-
private getAddonName(addons: ConfiguredAddonModel[], provider: string): string {
184-
if (provider === FileProvider.OsfStorage) {
185-
return this.osfStorageLabel;
186-
} else {
187-
return addons.find((addon) => addon.externalServiceName === provider)?.displayName ?? '';
188-
}
189-
}
190-
191175
private buildOptions(nodes: NodeShortInfoModel[] = [], parentPath = '..'): SelectOption[] {
192176
return nodes.reduce<SelectOption[]>((acc, node) => {
193177
const pathParts: string[] = [];
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export function getMfrUrlWithVersion(
2+
mfrUrl: string | undefined,
3+
version?: string,
4+
viewOnlyParam?: string | null
5+
): string | null {
6+
if (!mfrUrl) return null;
7+
const mfrUrlObj = new URL(mfrUrl);
8+
const encodedDownloadUrl = mfrUrlObj.searchParams.get('url');
9+
if (!encodedDownloadUrl) return mfrUrl;
10+
11+
const downloadUrlObj = new URL(decodeURIComponent(encodedDownloadUrl));
12+
13+
if (version) downloadUrlObj.searchParams.set('version', version);
14+
if (viewOnlyParam) downloadUrlObj.searchParams.set('view_only', viewOnlyParam);
15+
16+
mfrUrlObj.searchParams.set('url', downloadUrlObj.toString());
17+
18+
return mfrUrlObj.toString();
19+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { FileProvider } from '@osf/features/files/constants';
2+
import { ConfiguredAddonModel } from '@shared/models/addons/configured-addon.model';
3+
import { FileFolderModel } from '@shared/models/files/file-folder.model';
4+
import { FileLabelModel } from '@shared/models/files/file-label.model';
5+
6+
export function getConfiguredStorageAddonDisplayName(
7+
addons: ConfiguredAddonModel[],
8+
provider: string,
9+
osfStorageLabel: string
10+
): string {
11+
if (provider === FileProvider.OsfStorage) {
12+
return osfStorageLabel;
13+
}
14+
15+
return addons.find((addon) => addon.externalServiceName === provider)?.displayName ?? '';
16+
}
17+
18+
export function mapRootFoldersToStorageLabels(
19+
rootFolders: FileFolderModel[] | null | undefined,
20+
addons: ConfiguredAddonModel[] | null | undefined,
21+
osfStorageLabel: string
22+
): FileLabelModel[] {
23+
if (!rootFolders || !addons) {
24+
return [];
25+
}
26+
27+
return rootFolders.map((folder) => ({
28+
label: getConfiguredStorageAddonDisplayName(addons, folder.provider, osfStorageLabel),
29+
folder,
30+
}));
31+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface FileLinkModel {
2+
file: File;
3+
link: string;
4+
}

0 commit comments

Comments
 (0)