diff --git a/angular.json b/angular.json index 7f0feeb64..3eea998dd 100644 --- a/angular.json +++ b/angular.json @@ -29,7 +29,8 @@ "cedar-embeddable-editor", "cedar-artifact-viewer", "markdown-it-video", - "ace-builds/src-noconflict/ext-language_tools" + "ace-builds/src-noconflict/ext-language_tools", + "@traptitech/markdown-it-katex" ], "assets": [ "src/assets", @@ -63,7 +64,7 @@ "budgets": [ { "type": "initial", - "maximumWarning": "7MB", + "maximumWarning": "9MB", "maximumError": "10MB" }, { diff --git a/src/app/features/collections/components/add-to-collection/add-to-collection.component.ts b/src/app/features/collections/components/add-to-collection/add-to-collection.component.ts index ff3512069..95d51b8d4 100644 --- a/src/app/features/collections/components/add-to-collection/add-to-collection.component.ts +++ b/src/app/features/collections/components/add-to-collection/add-to-collection.component.ts @@ -93,6 +93,7 @@ export class AddToCollectionComponent implements CanDeactivateComponent { constructor() { this.initializeProvider(); this.setupEffects(); + this.setupCleanup(); } handleProjectSelected(): void { @@ -154,16 +155,6 @@ export class AddToCollectionComponent implements CanDeactivateComponent { } private setupEffects(): void { - effect(() => { - this.destroyRef.onDestroy(() => { - this.actions.clearAddToCollectionState(); - this.allowNavigation.set(false); - - HeaderStyleHelper.resetToDefaults(); - BrandService.resetBranding(); - }); - }); - effect(() => { const provider = this.collectionProvider(); @@ -174,6 +165,16 @@ export class AddToCollectionComponent implements CanDeactivateComponent { }); } + private setupCleanup() { + this.destroyRef.onDestroy(() => { + this.actions.clearAddToCollectionState(); + this.allowNavigation.set(false); + + HeaderStyleHelper.resetToDefaults(); + BrandService.resetBranding(); + }); + } + @HostListener('window:beforeunload', ['$event']) onBeforeUnload($event: BeforeUnloadEvent): boolean { $event.preventDefault(); diff --git a/src/app/features/files/pages/files/files.component.html b/src/app/features/files/pages/files/files.component.html index 229824a20..aa85e6279 100644 --- a/src/app/features/files/pages/files/files.component.html +++ b/src/app/features/files/pages/files/files.component.html @@ -102,22 +102,11 @@ -
- -
- {{ fileName() }} -
- -
-

{{ progress() }} %

-
-
-
+ (FilesTreeComponent); @HostBinding('class') classes = 'flex flex-column flex-1 w-full h-full'; @@ -297,6 +297,7 @@ export class FilesComponent { } this.actions.setCurrentProvider(provider ?? FileProvider.OsfStorage); this.actions.setCurrentFolder(currentRootFolder.folder); + this.filesTree()?.resetPagination(); } }); @@ -307,25 +308,27 @@ export class FilesComponent { }); this.searchControl.valueChanges - .pipe(skip(1), takeUntilDestroyed(this.destroyRef), distinctUntilChanged(), debounceTime(500)) + .pipe(takeUntilDestroyed(this.destroyRef), distinctUntilChanged(), debounceTime(500)) .subscribe((searchText) => { this.actions.setSearch(searchText ?? ''); + this.filesTree()?.resetPagination(); + if (!this.isFolderOpening()) { this.updateFilesList(); } }); - this.sortControl.valueChanges.pipe(skip(1), takeUntilDestroyed(this.destroyRef)).subscribe((sort) => { + this.sortControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((sort) => { this.actions.setSort(sort ?? ''); + this.filesTree()?.resetPagination(); + if (!this.isFolderOpening()) { this.updateFilesList(); } }); - effect(() => { - this.destroyRef.onDestroy(() => { - this.actions.resetState(); - }); + this.destroyRef.onDestroy(() => { + this.actions.resetState(); }); } @@ -491,7 +494,7 @@ export class FilesComponent { }); } - public updateFilesList = (): Observable => { + updateFilesList(): Observable { const currentFolder = this.currentFolder(); if (currentFolder?.relationships.filesLink) { this.filesTreeActions.setFilesIsLoading?.(true); @@ -499,7 +502,7 @@ export class FilesComponent { } return EMPTY; - }; + } folderIsOpening(value: boolean): void { this.isFolderOpening.set(value); diff --git a/src/app/features/project/overview/components/files-widget/files-widget.component.ts b/src/app/features/project/overview/components/files-widget/files-widget.component.ts index 3097d9dd0..da5f4b006 100644 --- a/src/app/features/project/overview/components/files-widget/files-widget.component.ts +++ b/src/app/features/project/overview/components/files-widget/files-widget.component.ts @@ -16,6 +16,7 @@ import { input, model, signal, + viewChild, } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; @@ -50,6 +51,8 @@ import { ProjectModel } from '@osf/shared/models/projects'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class FilesWidgetComponent { + filesTree = viewChild(FilesTreeComponent); + rootOption = input.required(); components = input.required(); areComponentsLoading = input(false); @@ -144,13 +147,12 @@ export class FilesWidgetComponent { const currentRootFolder = this.currentRootFolder(); if (currentRootFolder) { this.actions.setCurrentFolder(currentRootFolder.folder); + this.filesTree()?.resetPagination(); } }); - effect(() => { - this.destroyRef.onDestroy(() => { - this.actions.resetState(); - }); + this.destroyRef.onDestroy(() => { + this.actions.resetState(); }); } diff --git a/src/app/features/project/project-addons/components/configure-addon/configure-addon.component.ts b/src/app/features/project/project-addons/components/configure-addon/configure-addon.component.ts index 13e91adad..c30d2c0f2 100644 --- a/src/app/features/project/project-addons/components/configure-addon/configure-addon.component.ts +++ b/src/app/features/project/project-addons/components/configure-addon/configure-addon.component.ts @@ -120,10 +120,8 @@ export class ConfigureAddonComponent implements OnInit { constructor() { this.initializeAddon(); - effect(() => { - this.destroyRef.onDestroy(() => { - this.actions.clearOperationInvocations(); - }); + this.destroyRef.onDestroy(() => { + this.actions.clearOperationInvocations(); }); effect(() => { diff --git a/src/app/features/registries/components/files-control/files-control.component.html b/src/app/features/registries/components/files-control/files-control.component.html index 172236d64..b2efd64d4 100644 --- a/src/app/features/registries/components/files-control/files-control.component.html +++ b/src/app/features/registries/components/files-control/files-control.component.html @@ -33,22 +33,11 @@ } -
- -
- {{ fileName() }} -
- -
-

{{ progress() }} %

-
-
-
+ { - this.destroyRef.onDestroy(() => { - this.actions.clearOperationInvocations(); - }); + this.destroyRef.onDestroy(() => { + this.actions.clearOperationInvocations(); }); } diff --git a/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.html b/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.html new file mode 100644 index 000000000..17a4bccec --- /dev/null +++ b/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.html @@ -0,0 +1,14 @@ + +
+ {{ fileName() }} +
+ +
+

{{ progress() }} %

+
+
diff --git a/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.scss b/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.scss new file mode 100644 index 000000000..cf49a8d3f --- /dev/null +++ b/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.scss @@ -0,0 +1,3 @@ +.filename { + word-break: break-all; +} diff --git a/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.ts b/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.ts new file mode 100644 index 000000000..7445517c1 --- /dev/null +++ b/src/app/shared/components/file-upload-dialog/file-upload-dialog.component.ts @@ -0,0 +1,20 @@ +import { TranslatePipe } from '@ngx-translate/core'; + +import { DialogModule } from 'primeng/dialog'; + +import { ChangeDetectionStrategy, Component, input, model } from '@angular/core'; + +import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component'; + +@Component({ + selector: 'osf-file-upload-dialog', + imports: [DialogModule, TranslatePipe, LoadingSpinnerComponent], + templateUrl: './file-upload-dialog.component.html', + styleUrl: './file-upload-dialog.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class FileUploadDialogComponent { + visible = model(false); + fileName = input(''); + progress = input(0); +} diff --git a/src/app/shared/components/index.ts b/src/app/shared/components/index.ts index 594f14d55..9415be536 100644 --- a/src/app/shared/components/index.ts +++ b/src/app/shared/components/index.ts @@ -12,6 +12,7 @@ export { EducationHistoryDialogComponent } from './education-history-dialog/educ export { EmploymentHistoryComponent } from './employment-history/employment-history.component'; export { EmploymentHistoryDialogComponent } from './employment-history-dialog/employment-history-dialog.component'; export { FileMenuComponent } from './file-menu/file-menu.component'; +export { FileUploadDialogComponent } from './file-upload-dialog/file-upload-dialog.component'; export { FilesTreeComponent } from './files-tree/files-tree.component'; export { FilterChipsComponent } from './filter-chips/filter-chips.component'; export { FormSelectComponent } from './form-select/form-select.component'; diff --git a/src/app/shared/components/resource-citations/resource-citations.component.ts b/src/app/shared/components/resource-citations/resource-citations.component.ts index 9c3460096..7b5d51bd5 100644 --- a/src/app/shared/components/resource-citations/resource-citations.component.ts +++ b/src/app/shared/components/resource-citations/resource-citations.component.ts @@ -104,7 +104,7 @@ export class ResourceCitationsComponent { this.setupFilterDebounce(); this.setupDefaultCitationsEffect(); this.setupCitationStylesEffect(); - this.setupDestroyEffect(); + this.setupCleanup(); } setupDefaultCitationsEffect(): void { @@ -210,7 +210,7 @@ export class ResourceCitationsComponent { }); } - private setupDestroyEffect(): void { + private setupCleanup(): void { this.destroyRef.onDestroy(() => { this.destroy$.next(); this.destroy$.complete();