Skip to content

Commit 7cde210

Browse files
committed
refactor(files): updated files and related components
1 parent 272f6c6 commit 7cde210

15 files changed

Lines changed: 238 additions & 313 deletions

File tree

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
@if (!isMoveDialogOpened()) {
2525
<osf-files-selection-actions
2626
[canUpdateFiles]="canUploadFiles()"
27-
[selectedFiles]="filesSelection"
27+
[selectedFilesCount]="filesSelection.length"
2828
[hasViewOnly]="hasViewOnly()"
2929
(deleteSelected)="onDeleteSelected()"
3030
(moveSelected)="onMoveSelected()"
@@ -130,10 +130,12 @@
130130
[viewOnly]="!canEdit()"
131131
[supportUpload]="canUploadFiles()"
132132
[resourceId]="resourceId()"
133+
[resourceType]="currentResourceType()"
133134
[provider]="provider()"
134135
[allowedMenuActions]="allowedMenuActions()"
135136
[scrollHeight]="'500px'"
136137
[selectedFiles]="filesSelection"
138+
[(foldersStack)]="foldersStack"
137139
(selectFile)="onFileTreeSelected($event)"
138140
(unselectFile)="onFileTreeUnselected($event)"
139141
(clearSelection)="onClearSelection()"
@@ -144,7 +146,6 @@
144146
(loadFiles)="onLoadFiles($event)"
145147
(setCurrentFolder)="setCurrentFolder($event)"
146148
(setMoveDialogCurrentFolder)="setMoveDialogCurrentFolder($event)"
147-
(updateFoldersStack)="onUpdateFoldersStack($event)"
148149
(resetFilesProvider)="resetOnDialogClose()"
149150
>
150151
</osf-files-tree>

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

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

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

5-
import { TreeDragDropService } from 'primeng/api';
65
import { Button } from 'primeng/button';
76
import { Select } from 'primeng/select';
87
import { TableModule } from 'primeng/table';
@@ -51,7 +50,7 @@ import { FILE_SIZE_LIMIT } from '@osf/shared/constants/files-limits.const';
5150
import { ALL_SORT_OPTIONS } from '@osf/shared/constants/sort-options.const';
5251
import { SupportedFeature } from '@osf/shared/enums/addon-supported-features.enum';
5352
import { FileMenuType } from '@osf/shared/enums/file-menu-type.enum';
54-
import { ResourceType } from '@osf/shared/enums/resource-type.enum';
53+
import { CurrentResourceType, ResourceType } from '@osf/shared/enums/resource-type.enum';
5554
import { FilePageLinkModel } from '@osf/shared/models/files/file-page-link.model';
5655
import { RenamedFileLinkModel } from '@osf/shared/models/files/renamed-file-link.model';
5756
import { CustomConfirmationService } from '@osf/shared/services/custom-confirmation.service';
@@ -112,7 +111,6 @@ import {
112111
templateUrl: './files.component.html',
113112
styleUrl: './files.component.scss',
114113
changeDetection: ChangeDetectionStrategy.OnPush,
115-
providers: [TreeDragDropService],
116114
})
117115
export class FilesComponent {
118116
googleFilePickerComponent = viewChild(GoogleFilePickerComponent);
@@ -162,6 +160,9 @@ export class FilesComponent {
162160
readonly supportedFeatures = select(FilesSelectors.getStorageSupportedFeatures);
163161
readonly hasWriteAccess = select(CurrentResourceSelectors.hasResourceWriteAccess);
164162
readonly hasAdminAccess = select(CurrentResourceSelectors.hasResourceAdminAccess);
163+
readonly currentResourceType = computed<CurrentResourceType>(
164+
() => (this.resourceMetadata()?.type as CurrentResourceType) ?? CurrentResourceType.Projects
165+
);
165166

166167
readonly isGoogleDrive = signal<boolean>(false);
167168
readonly accountId = signal<string>('');
@@ -428,8 +429,11 @@ export class FilesComponent {
428429
}
429430

430431
onFileTreeSelected(file: FileModel): void {
431-
this.filesSelection.push(file);
432-
this.filesSelection = [...new Set(this.filesSelection)];
432+
if (this.filesSelection.some((selectedFile) => selectedFile.id === file.id)) {
433+
return;
434+
}
435+
436+
this.filesSelection = [...this.filesSelection, file];
433437
}
434438

435439
onFileTreeUnselected(file: FileModel): void {
@@ -610,13 +614,24 @@ export class FilesComponent {
610614
}
611615

612616
navigateToFile(file: FileModel) {
617+
if (file.guid) {
618+
this.openFile(file.guid);
619+
return;
620+
}
621+
622+
this.filesService.getFileGuid(file.id).subscribe((file) => {
623+
if (file.guid) {
624+
this.openFile(file.guid);
625+
}
626+
});
627+
}
628+
629+
private openFile(guid: string): void {
613630
const extras = this.hasViewOnly()
614631
? { queryParams: { view_only: this.viewOnlyService.getViewOnlyParamFromUrl(this.router.url) } }
615632
: undefined;
616633

617-
const url = this.router.serializeUrl(this.router.createUrlTree(['/', file.guid], extras));
618-
619-
window.open(url, '_blank');
634+
window.open(this.router.serializeUrl(this.router.createUrlTree(['/', guid], extras)), '_blank');
620635
}
621636

622637
getAddonName(addons: ConfiguredAddonModel[], provider: string): string {
@@ -632,9 +647,7 @@ export class FilesComponent {
632647
const googleDrive = addons?.find((addon) => addon.externalServiceName === FileProvider.GoogleDrive);
633648
if (googleDrive) {
634649
this.accountId.set(googleDrive.baseAccountId);
635-
this.selectedRootFolder.set({
636-
itemId: googleDrive.selectedStorageItemId,
637-
});
650+
this.selectedRootFolder.set({ itemId: googleDrive.selectedStorageItemId });
638651
}
639652
}
640653

@@ -643,10 +656,6 @@ export class FilesComponent {
643656
this.updateFilesList();
644657
}
645658

646-
onUpdateFoldersStack(newStack: FileFolderModel[]): void {
647-
this.foldersStack = [...newStack];
648-
}
649-
650659
handleRootFolderChange(selectedFolder: FileLabelModel) {
651660
const provider = selectedFolder.folder?.provider;
652661
const resourceId = this.resourceId();

src/app/features/preprints/components/stepper/file-step/file-step.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ <h2>{{ 'preprints.preprintStepper.file.title' | translate }}</h2>
9595
[files]="projectFiles()"
9696
[totalCount]="filesTotalCount()"
9797
[storage]="null"
98+
[resourceType]="resourceType"
9899
[selectionMode]="null"
99100
[isLoading]="areProjectFilesLoading() || isCurrentFolderLoading()"
100101
[resourceId]="selectedProjectId()!"

src/app/features/preprints/components/stepper/file-step/file-step.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import {
4343
import { FilesTreeComponent } from '@osf/shared/components/files-tree/files-tree.component';
4444
import { IconComponent } from '@osf/shared/components/icon/icon.component';
4545
import { ClearFileDirective } from '@osf/shared/directives/clear-file.directive';
46+
import { CurrentResourceType } from '@osf/shared/enums/resource-type.enum';
4647
import { StringOrNull } from '@osf/shared/helpers/types.helper';
4748
import { FileModel } from '@osf/shared/models/files/file.model';
4849
import { FileFolderModel } from '@osf/shared/models/files/file-folder.model';
@@ -89,6 +90,7 @@ export class FileStepComponent implements OnInit {
8990
});
9091

9192
readonly PreprintFileSource = PreprintFileSource;
93+
readonly resourceType = CurrentResourceType.Preprints;
9294

9395
provider = input.required<PreprintProviderDetails>();
9496
preprint = select(PreprintStepperSelectors.getPreprint);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ <h2>{{ 'project.overview.files.filesPreview' | translate }}</h2>
3939
[storage]="currentRootFolder()!"
4040
[isLoading]="isFilesLoading() || isStorageLoading"
4141
[resourceId]="selectedRoot!"
42+
[resourceType]="resourceType"
4243
[provider]="provider()"
4344
[selectionMode]="null"
4445
[scrollHeight]="'300px'"

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {
3131
} from '@osf/features/files/store';
3232
import { FilesTreeComponent } from '@osf/shared/components/files-tree/files-tree.component';
3333
import { SelectComponent } from '@osf/shared/components/select/select.component';
34-
import { ResourceType } from '@osf/shared/enums/resource-type.enum';
34+
import { CurrentResourceType, ResourceType } from '@osf/shared/enums/resource-type.enum';
3535
import { Primitive } from '@osf/shared/helpers/types.helper';
3636
import { ConfiguredAddonModel } from '@osf/shared/models/addons/configured-addon.model';
3737
import { FileModel } from '@osf/shared/models/files/file.model';
@@ -41,6 +41,7 @@ import { FilePageLinkModel } from '@osf/shared/models/files/file-page-link.model
4141
import { NodeShortInfoModel } from '@osf/shared/models/nodes/node-with-children.model';
4242
import { ProjectModel } from '@osf/shared/models/projects/projects.model';
4343
import { SelectOption } from '@osf/shared/models/select-option.model';
44+
import { FilesService } from '@osf/shared/services/files.service';
4445
import { ViewOnlyLinkHelperService } from '@osf/shared/services/view-only-link-helper.service';
4546

4647
@Component({
@@ -59,6 +60,7 @@ export class FilesWidgetComponent {
5960

6061
private readonly destroyRef = inject(DestroyRef);
6162
private readonly viewOnlyService = inject(ViewOnlyLinkHelperService);
63+
private readonly filesService = inject(FilesService);
6264
private readonly platformId = inject(PLATFORM_ID);
6365
private readonly isBrowser = isPlatformBrowser(this.platformId);
6466

@@ -76,6 +78,7 @@ export class FilesWidgetComponent {
7678
pageNumber = signal(1);
7779

7880
readonly osfStorageLabel = 'OSF Storage';
81+
readonly resourceType = CurrentResourceType.Projects;
7982

8083
readonly options = computed(() => {
8184
const components = this.components().filter((component) => this.rootOption().value !== component.id);
@@ -222,13 +225,24 @@ export class FilesWidgetComponent {
222225
}
223226

224227
navigateToFile(file: FileModel) {
228+
if (file.guid) {
229+
this.openFile(file.guid);
230+
return;
231+
}
232+
233+
this.filesService.getFileGuid(file.id).subscribe((file) => {
234+
if (file.guid) {
235+
this.openFile(file.guid);
236+
}
237+
});
238+
}
239+
240+
private openFile(guid: string): void {
225241
const extras = this.hasViewOnly()
226242
? { queryParams: { view_only: this.viewOnlyService.getViewOnlyParamFromUrl(this.router.url) } }
227243
: undefined;
228244

229-
const url = this.router.serializeUrl(this.router.createUrlTree(['/', file.guid], extras));
230-
231-
window.open(url, '_blank');
245+
window.open(this.router.serializeUrl(this.router.createUrlTree(['/', guid], extras)), '_blank');
232246
}
233247

234248
onLoadFiles(event: FilePageLinkModel) {

src/app/features/registries/components/files-control/files-control.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
[scrollHeight]="'500px'"
5050
[viewOnly]="filesViewOnly()"
5151
[resourceId]="projectId()"
52+
[resourceType]="resourceType"
5253
[provider]="provider()"
5354
[selectedFiles]="filesSelection"
5455
(selectFile)="onFileTreeSelected($event)"

src/app/features/registries/components/files-control/files-control.component.spec.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import { Store } from '@ngxs/store';
22

33
import { MockComponents, MockProvider } from 'ng-mocks';
44

5-
import { TreeDragDropService } from 'primeng/api';
6-
75
import { of, Subject } from 'rxjs';
86

97
import { Mock } from 'vitest';
@@ -70,7 +68,6 @@ describe('FilesControlComponent', () => {
7068
MockProvider(CustomConfirmationService),
7169
MockProvider(FilesService, mockFilesService),
7270
MockProvider(CustomDialogService, mockDialogService),
73-
MockProvider(TreeDragDropService),
7471
provideMockStore({
7572
signals: [
7673
{ selector: RegistriesSelectors.getFiles, value: [] },

src/app/features/registries/components/files-control/files-control.component.ts

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

33
import { TranslatePipe } from '@ngx-translate/core';
44

5-
import { TreeDragDropService } from 'primeng/api';
65
import { Button } from 'primeng/button';
76

87
import { filter, finalize, switchMap, take } from 'rxjs';
@@ -17,6 +16,7 @@ import { FilesTreeComponent } from '@osf/shared/components/files-tree/files-tree
1716
import { LoadingSpinnerComponent } from '@osf/shared/components/loading-spinner/loading-spinner.component';
1817
import { FILE_SIZE_LIMIT } from '@osf/shared/constants/files-limits.const';
1918
import { ClearFileDirective } from '@osf/shared/directives/clear-file.directive';
19+
import { CurrentResourceType } from '@osf/shared/enums/resource-type.enum';
2020
import { FilePageLinkModel } from '@osf/shared/models/files/file-page-link.model';
2121
import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
2222
import { FilesService } from '@osf/shared/services/files.service';
@@ -46,7 +46,6 @@ import {
4646
templateUrl: './files-control.component.html',
4747
styleUrl: './files-control.component.scss',
4848
changeDetection: ChangeDetectionStrategy.OnPush,
49-
providers: [TreeDragDropService],
5049
})
5150
export class FilesControlComponent {
5251
attachedFiles = input.required<Partial<FileModel>[]>();
@@ -69,6 +68,7 @@ export class FilesControlComponent {
6968
readonly progress = signal(0);
7069
readonly fileName = signal('');
7170
readonly dataLoaded = signal(false);
71+
readonly resourceType = CurrentResourceType.Registrations;
7272

7373
fileIsUploading = signal(false);
7474
filesSelection: FileModel[] = [];

0 commit comments

Comments
 (0)