Skip to content

Commit 88898b9

Browse files
authored
[ENG-9644] update provider name for url link on file Provider combobox selection & show specified provider in combobox and files when accessing by link (#748)
- Ticket: https://openscience.atlassian.net/browse/ENG-9644 - Feature flag: n/a ## Purpose Users shared links to their project and registration files lists previously, using the format https://osf.io/GUID/files/provider/ . These now break and lead to a Not Found page. These need to redirect to https://osf.io/GUID/files/provider/ Ideal solution via BrianG: format links to open up the provider page ## Summary of Changes update provider name for url link on file Provider combobox selection & show specified provider in combobox and files when accessing by link
1 parent cc309be commit 88898b9

File tree

5 files changed

+54
-10
lines changed

5 files changed

+54
-10
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { CanMatchFn, Route, UrlSegment } from '@angular/router';
2+
3+
import { FileProvider } from '@osf/features/files/constants';
4+
5+
export const isFileProvider: CanMatchFn = (route: Route, segments: UrlSegment[]) => {
6+
const id = segments[0]?.path;
7+
8+
return !!(id && Object.values(FileProvider).some((provider) => provider === id));
9+
};

src/app/features/files/constants/file-provider.constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ export const FileProvider = {
1111
GitLab: 'gitlab',
1212
Figshare: 'figshare',
1313
Dataverse: 'dataverse',
14+
OwnCloud: 'owncloud',
15+
AzureBlobStorage: 'azureblobstorage',
1416
};

src/app/features/files/files.routes.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Routes } from '@angular/router';
22

3+
import { isFileProvider } from '@core/guards/is-file-provider.guard';
34
import { ResourceType } from '@osf/shared/enums/resource-type.enum';
45

56
import { FilesContainerComponent } from './pages/files-container/files-container.component';
@@ -11,6 +12,12 @@ export const filesRoutes: Routes = [
1112
children: [
1213
{
1314
path: '',
15+
pathMatch: 'full',
16+
redirectTo: 'osfstorage',
17+
},
18+
{
19+
path: ':fileProvider',
20+
canMatch: [isFileProvider],
1421
loadComponent: () => import('@osf/features/files/pages/files/files.component').then((c) => c.FilesComponent),
1522
},
1623
{

src/app/features/files/pages/files/files.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
inputId="in_label"
1414
[options]="rootFoldersOptions()"
1515
[(ngModel)]="currentRootFolder"
16+
(onChange)="handleRootFolderChange($event.value)"
1617
styleClass="w-full"
1718
variant="filled"
1819
>

src/app/features/files/pages/files/files.component.ts

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,18 @@ import { Button } from 'primeng/button';
77
import { Select } from 'primeng/select';
88
import { TableModule } from 'primeng/table';
99

10-
import { catchError, debounceTime, distinctUntilChanged, filter, finalize, forkJoin, of, switchMap, take } from 'rxjs';
10+
import {
11+
catchError,
12+
debounceTime,
13+
distinctUntilChanged,
14+
filter,
15+
finalize,
16+
forkJoin,
17+
map,
18+
of,
19+
switchMap,
20+
take,
21+
} from 'rxjs';
1122

1223
import { HttpEventType, HttpResponse } from '@angular/common/http';
1324
import {
@@ -22,7 +33,7 @@ import {
2233
signal,
2334
viewChild,
2435
} from '@angular/core';
25-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
36+
import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
2637
import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
2738
import { ActivatedRoute, Router } from '@angular/router';
2839

@@ -244,6 +255,11 @@ export class FilesComponent {
244255
() => this.isButtonDisabled() || (this.googleFilePickerComponent()?.isGFPDisabled() ?? false)
245256
);
246257

258+
private route = inject(ActivatedRoute);
259+
readonly providerName = toSignal(
260+
this.route?.params?.pipe(map((params) => params['fileProvider'])) ?? of('osfstorage')
261+
);
262+
247263
constructor() {
248264
this.activeRoute.parent?.parent?.parent?.params.subscribe((params) => {
249265
if (params['id']) {
@@ -264,15 +280,18 @@ export class FilesComponent {
264280
});
265281

266282
effect(() => {
267-
const rootFolders = this.rootFolders();
268-
if (rootFolders) {
269-
const osfRootFolder = rootFolders.find(
270-
(folder: FileFolderModel) => folder.provider === FileProvider.OsfStorage
271-
);
272-
if (osfRootFolder) {
283+
const rootFoldersOptions = this.rootFoldersOptions();
284+
const providerName = this.providerName();
285+
286+
if (rootFoldersOptions && rootFoldersOptions.length && providerName) {
287+
const rootFoldersOption = rootFoldersOptions.find((option) => option.folder.provider === providerName);
288+
289+
if (!rootFoldersOption) {
290+
this.router.navigate([`/${this.resourceId()}/files`, FileProvider.OsfStorage]);
291+
} else {
273292
this.currentRootFolder.set({
274-
label: this.translateService.instant('files.storageLocation'),
275-
folder: osfRootFolder,
293+
label: rootFoldersOption.label,
294+
folder: rootFoldersOption.folder,
276295
});
277296
}
278297
}
@@ -652,4 +671,10 @@ export class FilesComponent {
652671
onUpdateFoldersStack(newStack: FileFolderModel[]): void {
653672
this.foldersStack = [...newStack];
654673
}
674+
675+
handleRootFolderChange(selectedFolder: FileLabelModel) {
676+
const provider = selectedFolder.folder?.provider;
677+
const resourceId = this.resourceId();
678+
this.router.navigate([`/${resourceId}/files`, provider]);
679+
}
655680
}

0 commit comments

Comments
 (0)