Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,24 +1,18 @@
import { MockComponents, MockProvider } from 'ng-mocks';
import { MockProvider } from 'ng-mocks';

import { DynamicDialogConfig } from 'primeng/dynamicdialog';

import { ComponentFixture, TestBed } from '@angular/core/testing';

import { FileSelectDestinationComponent } from '@osf/shared/components/file-select-destination/file-select-destination.component';
import { IconComponent } from '@osf/shared/components/icon/icon.component';
import { LoadingSpinnerComponent } from '@osf/shared/components/loading-spinner/loading-spinner.component';
import { CustomConfirmationService } from '@osf/shared/services/custom-confirmation.service';
import { FilesService } from '@osf/shared/services/files.service';
import { ToastService } from '@osf/shared/services/toast.service';

import { provideOSFCore } from '@testing/osf.testing.provider';
import { CustomConfirmationServiceMock } from '@testing/providers/custom-confirmation-provider.mock';
import { provideDynamicDialogRefMock } from '@testing/providers/dynamic-dialog-ref.mock';
import { provideMockStore } from '@testing/providers/store-provider.mock';
import { ToastServiceMock } from '@testing/providers/toast-provider.mock';

import { FilesSelectors } from '../../store';

import { ConfirmMoveFileDialogComponent } from './confirm-move-file-dialog.component';

describe('ConfirmConfirmMoveFileDialogComponent', () => {
Expand All @@ -31,23 +25,14 @@ describe('ConfirmConfirmMoveFileDialogComponent', () => {
};

TestBed.configureTestingModule({
imports: [
ConfirmMoveFileDialogComponent,
...MockComponents(IconComponent, LoadingSpinnerComponent, FileSelectDestinationComponent),
],
imports: [ConfirmMoveFileDialogComponent],
providers: [
provideOSFCore(),
provideDynamicDialogRefMock(),
MockProvider(DynamicDialogConfig, dialogConfigMock),
MockProvider(FilesService),
MockProvider(ToastService, ToastServiceMock.simple()),
MockProvider(CustomConfirmationService, CustomConfirmationServiceMock.simple()),
provideMockStore({
signals: [
{ selector: FilesSelectors.getMoveDialogFiles, value: [] },
{ selector: FilesSelectors.getProvider, value: null },
],
}),
],
});

Expand All @@ -63,10 +48,5 @@ describe('ConfirmConfirmMoveFileDialogComponent', () => {
it('should initialize with correct properties', () => {
expect(component.config).toBeDefined();
expect(component.dialogRef).toBeDefined();
expect(component.files).toBeDefined();
});

it('should get files from store', () => {
expect(component.files()).toEqual([]);
});
});
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { select } from '@ngxs/store';

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

import { Button } from 'primeng/button';
Expand All @@ -11,7 +9,6 @@ import { catchError } from 'rxjs/operators';
import { ChangeDetectionStrategy, Component, DestroyRef, inject } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';

import { FilesSelectors } from '@osf/features/files/store';
import { CustomConfirmationService } from '@osf/shared/services/custom-confirmation.service';
import { FilesService } from '@osf/shared/services/files.service';
import { ToastService } from '@osf/shared/services/toast.service';
Expand All @@ -35,8 +32,6 @@ export class ConfirmMoveFileDialogComponent {
private readonly toastService = inject(ToastService);
private readonly customConfirmationService = inject(CustomConfirmationService);

readonly files = select(FilesSelectors.getMoveDialogFiles);

readonly provider = this.config.data.storageProvider;

private fileProjectId = this.config.data.resourceId;
Expand Down Expand Up @@ -112,9 +107,7 @@ export class ConfirmMoveFileDialogComponent {
this.customConfirmationService.confirmDelete({
headerKey: conflictFiles.length > 1 ? 'files.dialogs.replaceFile.multiple' : 'files.dialogs.replaceFile.single',
messageKey: 'files.dialogs.replaceFile.message',
messageParams: {
name: conflictFiles.map((c) => c.file.name).join(', '),
},
messageParams: { name: conflictFiles.map((c) => c.file.name).join(', ') },
acceptLabelKey: 'common.buttons.replace',
onConfirm: () => {
const replaceRequests$ = conflictFiles.map(({ link }) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { languageCodes } from '@osf/shared/constants/language.const';
import { resourceTypes } from '@osf/shared/constants/resource-types.const';

import { OsfFileCustomMetadata, PatchFileMetadata } from '../../models';
import { OsfFileCustomMetadata } from '../../models/file-custom-metadata.model';
import { PatchFileMetadata } from '../../models/patch-file-metadata.model';

@Component({
selector: 'osf-edit-file-metadata-dialog',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export class FileBrowserInfoComponent {

readonly infoItems = FILE_BROWSER_INFO_ITEMS;

readonly filteredInfoItems = computed(() => {
return this.infoItems.filter((item) => item.showForResourceTypes.includes(this.resourceType()));
});
readonly filteredInfoItems = computed(() =>
this.infoItems.filter((item) => item.showForResourceTypes.includes(this.resourceType()))
);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { signal } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { provideOSFCore } from '@testing/osf.testing.provider';
Expand Down Expand Up @@ -26,10 +25,10 @@ describe('FileKeywordsComponent', () => {
provideOSFCore(),
provideMockStore({
signals: [
{ selector: FilesSelectors.getFileTags, value: signal(mockTags) },
{ selector: FilesSelectors.isFileTagsLoading, value: signal(false) },
{ selector: FilesSelectors.getOpenedFile, value: signal(mockFile) },
{ selector: FilesSelectors.hasWriteAccess, value: signal(true) },
{ selector: FilesSelectors.getFileTags, value: mockTags },
{ selector: FilesSelectors.isFileTagsLoading, value: false },
{ selector: FilesSelectors.getOpenedFile, value: mockFile },
{ selector: FilesSelectors.hasWriteAccess, value: true },
],
}),
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { ViewOnlyLinkHelperService } from '@osf/shared/services/view-only-link-h
import { LanguageCodeModel } from '@shared/models/language-code.model';

import { FileMetadataFields } from '../../constants';
import { PatchFileMetadata } from '../../models';
import { PatchFileMetadata } from '../../models/patch-file-metadata.model';
import { FilesSelectors, SetFileMetadata } from '../../store';
import { EditFileMetadataDialogComponent } from '../edit-file-metadata-dialog/edit-file-metadata-dialog.component';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ <h2>
<p-skeleton width="100%" height="4rem" />
<p-skeleton width="100%" height="4rem" />
} @else {
@for (funder of resourceMetadata()?.funders; track $index) {
@for (funder of resourceMetadata()?.funders; track funder.funderIdentifier) {
<div class="flex flex-column gap-2">
@if (funder.funderName) {
<div class="flex flex-column gap-1">
Expand All @@ -23,10 +23,10 @@ <h4>{{ 'files.detail.resourceMetadata.fields.awardTitle' | translate }}</h4>
<span>{{ funder.awardTitle }}</span>
</div>
}
@if (funder.awardTitle) {
@if (funder.awardNumber) {
<div class="flex flex-column gap-1">
<h4>{{ 'files.detail.resourceMetadata.fields.awardNumber' | translate }}</h4>
<span>{{ funder.awardTitle }}</span>
<span>{{ funder.awardNumber }}</span>
</div>
}
@if (funder.awardUri) {
Expand Down Expand Up @@ -98,7 +98,7 @@ <h4>{{ 'common.labels.dateModified' | translate }}</h4>
@if (isResourceContributorsLoading()) {
<p-skeleton width="100%" height="4rem" />
} @else {
@if (hasViewOnly() || contributors().length) {
@if (contributors().length) {
<div class="flex flex-column gap-2">
<h4>{{ 'common.labels.contributors' | translate }}</h4>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { CopyButtonComponent } from '@osf/shared/components/copy-button/copy-but
import { InfoIconComponent } from '@osf/shared/components/info-icon/info-icon.component';
import { StopPropagationDirective } from '@osf/shared/directives/stop-propagation.directive';

import { OsfFileRevision } from '../../models';
import { OsfFileRevision } from '../../models/file-revisions.model';

@Component({
selector: 'osf-file-revisions',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
@if (selectedFiles().length > 0) {
@if (selectedFilesCount() > 0) {
<div class="flex align-items-center flex-wrap gap-2 p-1 -mb-2">
<div>
<span class="mr-2">
<b>{{ selectedFiles().length }}</b> {{ 'files.selectedFiles' | translate }}
<b>{{ selectedFilesCount() }}</b> {{ 'files.selectedFiles' | translate }}
</span>

<p-button
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import { Button } from 'primeng/button';

import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';

import { FileModel } from '@osf/shared/models/files/file.model';

@Component({
selector: 'osf-files-selection-actions',
imports: [Button, TranslatePipe],
Expand All @@ -14,7 +12,7 @@ import { FileModel } from '@osf/shared/models/files/file.model';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FilesSelectionActionsComponent {
selectedFiles = input<FileModel[]>([]);
selectedFilesCount = input<number>(0);
canUpdateFiles = input<boolean>(true);
hasViewOnly = input<boolean>(false);
copySelected = output<void>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ResourceType } from '@osf/shared/enums/resource-type.enum';

import { FileInfoItem } from '../models';
import { FileInfoItem } from '../models/info-item.model';

export const FILE_BROWSER_INFO_ITEMS: FileInfoItem[] = [
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { MetadataField } from '../models';
import { MetadataField } from '../models/files-metadata-fields.model';

export const FileMetadataFields: MetadataField[] = [
{ key: 'title', label: 'common.labels.title' },
Expand Down
1 change: 0 additions & 1 deletion src/app/features/files/constants/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export * from './embed-content.constants';
export * from './file-browser-info.constants';
export * from './file-metadata-fields.constants';
export * from './file-provider.constants';
7 changes: 2 additions & 5 deletions src/app/features/files/files.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,8 @@ export const filesRoutes: Routes = [
{
path: ':fileGuid',
data: { canonicalPathTemplate: 'files/:fileGuid' },
loadComponent: () => {
return import('@osf/features/files/pages/file-detail/file-detail.component').then(
(c) => c.FileDetailComponent
);
},
loadComponent: () =>
import('@osf/features/files/pages/file-detail/file-detail.component').then((c) => c.FileDetailComponent),
},
],
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { ApiData } from '@osf/shared/models/common/json-api.model';
import { replaceBadEncodedChars } from '@shared/helpers/format-bad-encoding.helper';

import { FileCustomMetadata, OsfFileCustomMetadata } from '../models';
import { OsfFileCustomMetadata } from '../models/file-custom-metadata.model';
import { FileCustomMetadata } from '../models/get-file-metadata-response.model';

export function MapFileCustomMetadata(data: ApiData<FileCustomMetadata, null, null, null>): OsfFileCustomMetadata {
return {
Expand Down
17 changes: 17 additions & 0 deletions src/app/features/files/mappers/file-menu-actions.mapper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { SupportedFeature } from '@osf/shared/enums/addon-supported-features.enum';
import { FileMenuType } from '@osf/shared/enums/file-menu-type.enum';

export function mapMenuActions(supportedFeatures: SupportedFeature[]): Record<FileMenuType, boolean> {
return {
[FileMenuType.Download]: supportedFeatures.includes(SupportedFeature.DownloadAsZip),
[FileMenuType.Rename]: supportedFeatures.includes(SupportedFeature.AddUpdateFiles),
[FileMenuType.Delete]: supportedFeatures.includes(SupportedFeature.DeleteFiles),
[FileMenuType.Move]:
supportedFeatures.includes(SupportedFeature.CopyInto) &&
supportedFeatures.includes(SupportedFeature.DeleteFiles) &&
supportedFeatures.includes(SupportedFeature.AddUpdateFiles),
[FileMenuType.Embed]: true,
[FileMenuType.Share]: true,
[FileMenuType.Copy]: true,
};
}
3 changes: 2 additions & 1 deletion src/app/features/files/mappers/file-revision.mapper.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ApiData } from '@osf/shared/models/common/json-api.model';

import { FileRevisionJsonApi, OsfFileRevision } from '../models';
import { OsfFileRevision } from '../models/file-revisions.model';
import { FileRevisionJsonApi } from '../models/get-file-revisions-response.model';

export function MapFileRevision(data: ApiData<FileRevisionJsonApi, null, null, null>[]): OsfFileRevision[] {
const revision = data.map((revision) => ({
Expand Down
24 changes: 24 additions & 0 deletions src/app/features/files/models/files-actions-options.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Observable } from 'rxjs';

import { FileModel } from '@shared/models/files/file.model';
import { FileFolderModel } from '@shared/models/files/file-folder.model';

export interface DeleteSelectedOptions {
files: FileModel[];
deleteEntry: (link: string) => Observable<unknown>;
onSuccess: () => void;
}

export interface MoveFilesOptions {
files: FileModel[];
action: 'move' | 'copy';
resourceId: string;
storageProvider: string;
foldersStack: FileFolderModel[];
initialFolder: FileFolderModel | null | undefined;
}

export interface CreateFolderOptions {
newFolderLink: string;
createFolder: (newFolderLink: string, folderName: string) => Observable<unknown>;
}
16 changes: 16 additions & 0 deletions src/app/features/files/models/files-upload-options.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { FileLinkModel } from '@osf/shared/models/files/file-link.model';

export interface UploadFilesOptions {
files: File | File[];
uploadLink: string;
allowRevisions: boolean;
onStart: (fileName: string) => void;
onProgress: (progress: number) => void;
onComplete: () => void;
}

export interface UploadState {
completedUploads: number;
totalFiles: number;
conflictFiles: FileLinkModel[];
}
9 changes: 0 additions & 9 deletions src/app/features/files/models/index.ts

This file was deleted.

Loading
Loading