(2);
}
diff --git a/src/app/shared/components/make-decision-dialog/make-decision-dialog.component.spec.ts b/src/app/shared/components/make-decision-dialog/make-decision-dialog.component.spec.ts
index 973428d1f..9fdd56e65 100644
--- a/src/app/shared/components/make-decision-dialog/make-decision-dialog.component.spec.ts
+++ b/src/app/shared/components/make-decision-dialog/make-decision-dialog.component.spec.ts
@@ -7,7 +7,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ModerationType, SubmissionReviewStatus } from '@osf/features/moderation/enums';
import { CollectionsModerationSelectors } from '@osf/features/moderation/store/collections-moderation';
-import { ModerationDecisionFormControls, ModerationSubmitType } from '@osf/shared/enums';
+import { ModerationDecisionFormControls } from '@osf/shared/enums/moderation-decision-form-controls.enum';
+import { ModerationSubmitType } from '@osf/shared/enums/moderation-submit-type.enum';
import { CollectionsSelectors } from '@osf/shared/stores/collections';
import { MakeDecisionDialogComponent } from './make-decision-dialog.component';
diff --git a/src/app/shared/components/make-decision-dialog/make-decision-dialog.component.ts b/src/app/shared/components/make-decision-dialog/make-decision-dialog.component.ts
index e67247b1e..f8f0c76f2 100644
--- a/src/app/shared/components/make-decision-dialog/make-decision-dialog.component.ts
+++ b/src/app/shared/components/make-decision-dialog/make-decision-dialog.component.ts
@@ -15,9 +15,10 @@ import {
CollectionsModerationSelectors,
CreateCollectionSubmissionAction,
} from '@osf/features/moderation/store/collections-moderation';
-import { InputLimits } from '@osf/shared/constants';
-import { ModerationDecisionFormControls, ModerationSubmitType } from '@osf/shared/enums';
-import { DateAgoPipe } from '@osf/shared/pipes';
+import { InputLimits } from '@osf/shared/constants/input-limits.const';
+import { ModerationDecisionFormControls } from '@osf/shared/enums/moderation-decision-form-controls.enum';
+import { ModerationSubmitType } from '@osf/shared/enums/moderation-submit-type.enum';
+import { DateAgoPipe } from '@osf/shared/pipes/date-ago.pipe';
import { CollectionsSelectors } from '@osf/shared/stores/collections';
@Component({
@@ -31,9 +32,11 @@ export class MakeDecisionDialogComponent implements OnInit {
private readonly fb = inject(FormBuilder);
readonly config = inject(DynamicDialogConfig);
readonly dialogRef = inject(DynamicDialogRef);
+
readonly ModerationSubmitType = ModerationSubmitType;
readonly SubmissionReviewStatus = SubmissionReviewStatus;
readonly ModerationDecisionFormControls = ModerationDecisionFormControls;
+
collectionProvider = select(CollectionsSelectors.getCollectionProvider);
currentReviewAction = select(CollectionsModerationSelectors.getCurrentReviewAction);
diff --git a/src/app/shared/components/metadata-tabs/metadata-tabs.component.spec.ts b/src/app/shared/components/metadata-tabs/metadata-tabs.component.spec.ts
index 09ca0bbe4..38a68f4ad 100644
--- a/src/app/shared/components/metadata-tabs/metadata-tabs.component.spec.ts
+++ b/src/app/shared/components/metadata-tabs/metadata-tabs.component.spec.ts
@@ -1,13 +1,18 @@
+import { MockComponents } from 'ng-mocks';
+
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { CedarTemplateFormComponent } from '@osf/features/metadata/components';
import { CedarMetadataDataTemplateJsonApi, CedarRecordDataBinding } from '@osf/features/metadata/models';
-import { MetadataResourceEnum } from '@osf/shared/enums';
-import { MetadataTabsModel } from '@osf/shared/models';
+import { MetadataResourceEnum } from '@osf/shared/enums/metadata-resource.enum';
+import { MetadataTabsModel } from '@shared/models/metadata-tabs.model';
+
+import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';
import { MetadataTabsComponent } from './metadata-tabs.component';
-import { CEDAR_METADATA_DATA_TEMPLATE_JSON_API_MOCK } from '@testing/mocks';
+import { CEDAR_METADATA_DATA_TEMPLATE_JSON_API_MOCK } from '@testing/mocks/cedar-metadata-data-template-json-api.mock';
import { MOCK_CEDAR_METADATA_RECORD_DATA } from '@testing/mocks/cedar-metadata-record.mock';
import { OSFTestingModule } from '@testing/osf.testing.module';
@@ -27,7 +32,11 @@ describe('MetadataTabsComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [MetadataTabsComponent, OSFTestingModule],
+ imports: [
+ MetadataTabsComponent,
+ OSFTestingModule,
+ ...MockComponents(LoadingSpinnerComponent, CedarTemplateFormComponent),
+ ],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
diff --git a/src/app/shared/components/metadata-tabs/metadata-tabs.component.ts b/src/app/shared/components/metadata-tabs/metadata-tabs.component.ts
index d9ac7eb2f..31aa15c6c 100644
--- a/src/app/shared/components/metadata-tabs/metadata-tabs.component.ts
+++ b/src/app/shared/components/metadata-tabs/metadata-tabs.component.ts
@@ -10,7 +10,7 @@ import {
CedarMetadataRecordData,
CedarRecordDataBinding,
} from '@osf/features/metadata/models';
-import { MetadataTabsModel } from '@osf/shared/models';
+import { MetadataTabsModel } from '@osf/shared/models/metadata-tabs.model';
import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';
diff --git a/src/app/shared/components/my-projects-table/my-projects-table.component.html b/src/app/shared/components/my-projects-table/my-projects-table.component.html
index d56a1cb68..f67b93b39 100644
--- a/src/app/shared/components/my-projects-table/my-projects-table.component.html
+++ b/src/app/shared/components/my-projects-table/my-projects-table.component.html
@@ -39,7 +39,7 @@
|
- {{ item.title }}
+ {{ item.title | fixSpecialChar }}
|
diff --git a/src/app/shared/components/my-projects-table/my-projects-table.component.spec.ts b/src/app/shared/components/my-projects-table/my-projects-table.component.spec.ts
index 0843ffe6a..b750bf06d 100644
--- a/src/app/shared/components/my-projects-table/my-projects-table.component.spec.ts
+++ b/src/app/shared/components/my-projects-table/my-projects-table.component.spec.ts
@@ -10,7 +10,8 @@ import { IconComponent } from '../icon/icon.component';
import { MyProjectsTableComponent } from './my-projects-table.component';
-import { MOCK_CONTRIBUTOR, TranslateServiceMock } from '@testing/mocks';
+import { MOCK_CONTRIBUTOR } from '@testing/mocks/contributors.mock';
+import { TranslateServiceMock } from '@testing/mocks/translate.service.mock';
describe('MyProjectsTableComponent', () => {
let component: MyProjectsTableComponent;
diff --git a/src/app/shared/components/my-projects-table/my-projects-table.component.ts b/src/app/shared/components/my-projects-table/my-projects-table.component.ts
index 4bfaab38e..8d868ea60 100644
--- a/src/app/shared/components/my-projects-table/my-projects-table.component.ts
+++ b/src/app/shared/components/my-projects-table/my-projects-table.component.ts
@@ -7,14 +7,16 @@ import { TableModule, TablePageEvent } from 'primeng/table';
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
-import { SortOrder } from '@osf/shared/enums';
-import { MyResourcesItem, TableParameters } from '@osf/shared/models';
+import { SortOrder } from '@osf/shared/enums/sort-order.enum';
+import { MyResourcesItem } from '@osf/shared/models/my-resources/my-resources.models';
+import { TableParameters } from '@osf/shared/models/table-parameters.model';
+import { FixSpecialCharPipe } from '@osf/shared/pipes/fix-special-char.pipe';
import { IconComponent } from '../icon/icon.component';
@Component({
selector: 'osf-my-projects-table',
- imports: [CommonModule, TableModule, IconComponent, Skeleton, TranslatePipe],
+ imports: [CommonModule, TableModule, IconComponent, Skeleton, TranslatePipe, FixSpecialCharPipe],
templateUrl: './my-projects-table.component.html',
styleUrl: './my-projects-table.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
diff --git a/src/app/shared/components/password-input-hint/password-input-hint.component.spec.ts b/src/app/shared/components/password-input-hint/password-input-hint.component.spec.ts
index cbb980968..18924152f 100644
--- a/src/app/shared/components/password-input-hint/password-input-hint.component.spec.ts
+++ b/src/app/shared/components/password-input-hint/password-input-hint.component.spec.ts
@@ -1,4 +1,5 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FormControl, Validators } from '@angular/forms';
import { PasswordInputHintComponent } from './password-input-hint.component';
@@ -15,16 +16,66 @@ describe('PasswordInputHintComponent', () => {
fixture = TestBed.createComponent(PasswordInputHintComponent);
component = fixture.componentInstance;
- fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
- it('should display password requirements text', () => {
- const compiled = fixture.nativeElement as HTMLElement;
- const smallElement = compiled.querySelector('small');
- expect(smallElement).toBeTruthy();
+ it('should have default control input value as null', () => {
+ expect(component.control()).toBeNull();
+ });
+
+ it('should set control input correctly', () => {
+ const mockControl = new FormControl('');
+ fixture.componentRef.setInput('control', mockControl);
+ expect(component.control()).toBe(mockControl);
+ });
+
+ it('should return null for validationError when control is null', () => {
+ fixture.componentRef.setInput('control', null);
+ expect(component.validationError).toBeNull();
+ });
+
+ it('should return null for validationError when control has no errors', () => {
+ const mockControl = new FormControl('valid');
+ fixture.componentRef.setInput('control', mockControl);
+ expect(component.validationError).toBeNull();
+ });
+
+ it('should return null for validationError when control is not touched', () => {
+ const mockControl = new FormControl('', Validators.required);
+ mockControl.setErrors({ required: true });
+ fixture.componentRef.setInput('control', mockControl);
+ expect(component.validationError).toBeNull();
+ });
+
+ it('should return required for validationError when errors.required exists and control is touched', () => {
+ const mockControl = new FormControl('', Validators.required);
+ mockControl.markAsTouched();
+ fixture.componentRef.setInput('control', mockControl);
+ expect(component.validationError).toBe('required');
+ });
+
+ it('should return minlength for validationError when errors.minlength exists and control is touched', () => {
+ const mockControl = new FormControl('ab', Validators.minLength(5));
+ mockControl.markAsTouched();
+ fixture.componentRef.setInput('control', mockControl);
+ expect(component.validationError).toBe('minlength');
+ });
+
+ it('should return pattern for validationError when errors.pattern exists and control is touched', () => {
+ const mockControl = new FormControl('invalid', Validators.pattern(/[A-Z]/));
+ mockControl.markAsTouched();
+ fixture.componentRef.setInput('control', mockControl);
+ expect(component.validationError).toBe('pattern');
+ });
+
+ it('should return null for validationError when control has other errors and is touched', () => {
+ const mockControl = new FormControl('');
+ mockControl.setErrors({ customError: true });
+ mockControl.markAsTouched();
+ fixture.componentRef.setInput('control', mockControl);
+ expect(component.validationError).toBeNull();
});
});
diff --git a/src/app/shared/components/password-input-hint/password-input-hint.component.ts b/src/app/shared/components/password-input-hint/password-input-hint.component.ts
index dab3cfe2f..57e1c513f 100644
--- a/src/app/shared/components/password-input-hint/password-input-hint.component.ts
+++ b/src/app/shared/components/password-input-hint/password-input-hint.component.ts
@@ -1,12 +1,11 @@
import { TranslatePipe } from '@ngx-translate/core';
-import { CommonModule } from '@angular/common';
import { Component, input } from '@angular/core';
import { AbstractControl } from '@angular/forms';
@Component({
selector: 'osf-password-input-hint',
- imports: [TranslatePipe, CommonModule],
+ imports: [TranslatePipe],
templateUrl: './password-input-hint.component.html',
styleUrl: './password-input-hint.component.scss',
})
diff --git a/src/app/shared/components/pie-chart/pie-chart.component.spec.ts b/src/app/shared/components/pie-chart/pie-chart.component.spec.ts
index ee3b2dc12..0e52768ea 100644
--- a/src/app/shared/components/pie-chart/pie-chart.component.spec.ts
+++ b/src/app/shared/components/pie-chart/pie-chart.component.spec.ts
@@ -1,5 +1,9 @@
+import { MockComponent } from 'ng-mocks';
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';
+
import { PieChartComponent } from './pie-chart.component';
describe('PieChartComponent', () => {
@@ -8,7 +12,7 @@ describe('PieChartComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [PieChartComponent],
+ imports: [PieChartComponent, MockComponent(LoadingSpinnerComponent)],
}).compileComponents();
fixture = TestBed.createComponent(PieChartComponent);
diff --git a/src/app/shared/components/pie-chart/pie-chart.component.ts b/src/app/shared/components/pie-chart/pie-chart.component.ts
index 88144f29c..2c36e139f 100644
--- a/src/app/shared/components/pie-chart/pie-chart.component.ts
+++ b/src/app/shared/components/pie-chart/pie-chart.component.ts
@@ -14,8 +14,8 @@ import {
signal,
} from '@angular/core';
-import { PIE_CHART_PALETTE } from '@osf/shared/constants';
-import { DatasetInput } from '@osf/shared/models';
+import { PIE_CHART_PALETTE } from '@osf/shared/constants/pie-chart-palette';
+import { DatasetInput } from '@shared/models/charts/dataset-input';
import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';
diff --git a/src/app/shared/components/project-selector/project-selector.component.spec.ts b/src/app/shared/components/project-selector/project-selector.component.spec.ts
index 9b33e2e3e..4c3cfe41a 100644
--- a/src/app/shared/components/project-selector/project-selector.component.spec.ts
+++ b/src/app/shared/components/project-selector/project-selector.component.spec.ts
@@ -5,7 +5,7 @@ import { MockProvider } from 'ng-mocks';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { UserState } from '@core/store/user';
-import { ToastService } from '@shared/services';
+import { ToastService } from '@osf/shared/services/toast.service';
import { ProjectsState } from '@shared/stores/projects';
import { ProjectSelectorComponent } from './project-selector.component';
diff --git a/src/app/shared/components/project-selector/project-selector.component.ts b/src/app/shared/components/project-selector/project-selector.component.ts
index 7ece1bfdf..d150dc205 100644
--- a/src/app/shared/components/project-selector/project-selector.component.ts
+++ b/src/app/shared/components/project-selector/project-selector.component.ts
@@ -22,8 +22,8 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormsModule } from '@angular/forms';
import { UserSelectors } from '@core/store/user';
-import { CustomOption } from '@shared/models';
-import { ProjectModel } from '@shared/models/projects';
+import { ProjectModel } from '@shared/models/projects/projects.models';
+import { CustomOption } from '@shared/models/select-option.model';
import { GetProjects, ProjectsSelectors } from '@shared/stores/projects';
@Component({
diff --git a/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.html b/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.html
index ec75249f2..33ae60402 100644
--- a/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.html
+++ b/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.html
@@ -11,7 +11,7 @@
@if (reviewData()[question.responseKey!]) {
@switch (question.fieldType) {
@case (FieldType.Text) {
- {{ reviewData()[question.responseKey!] }}
+ {{ reviewData()[question.responseKey!] | fixSpecialChar }}
}
@case (FieldType.Checkbox) {
@for (option of reviewData()[question.responseKey!]; track option) {
@@ -36,7 +36,7 @@
}
}
@default {
- {{ reviewData()[question.responseKey!] }}
+ {{ reviewData()[question.responseKey!] | fixSpecialChar }}
}
}
} @else {
diff --git a/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.spec.ts b/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.spec.ts
index 282461d08..798ac1001 100644
--- a/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.spec.ts
+++ b/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.spec.ts
@@ -1,11 +1,12 @@
-import { TranslateModule } from '@ngx-translate/core';
+import { TranslatePipe } from '@ngx-translate/core';
+import { MockPipe } from 'ng-mocks';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { RegistrationBlocksDataComponent } from './registration-blocks-data.component';
-import { MOCK_REVIEW } from '@testing/mocks';
+import { MOCK_REVIEW } from '@testing/mocks/review.mock';
describe('RegistrationBlocksDataComponent', () => {
let component: RegistrationBlocksDataComponent;
@@ -15,7 +16,7 @@ describe('RegistrationBlocksDataComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [RegistrationBlocksDataComponent, TranslateModule.forRoot()],
+ imports: [RegistrationBlocksDataComponent, MockPipe(TranslatePipe)],
}).compileComponents();
fixture = TestBed.createComponent(RegistrationBlocksDataComponent);
diff --git a/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.ts b/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.ts
index 4d7d381b9..d1c49eb2f 100644
--- a/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.ts
+++ b/src/app/shared/components/registration-blocks-data/registration-blocks-data.component.ts
@@ -5,13 +5,14 @@ import { Tag } from 'primeng/tag';
import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
-import { INPUT_VALIDATION_MESSAGES } from '@osf/shared/constants';
-import { FieldType } from '@osf/shared/enums';
-import { Question } from '@osf/shared/models';
+import { INPUT_VALIDATION_MESSAGES } from '@osf/shared/constants/input-validation-messages.const';
+import { FieldType } from '@osf/shared/enums/field-type.enum';
+import { Question } from '@osf/shared/models/registration/page-schema.model';
+import { FixSpecialCharPipe } from '@osf/shared/pipes/fix-special-char.pipe';
@Component({
selector: 'osf-registration-blocks-data',
- imports: [Tag, TranslatePipe, Message],
+ imports: [FixSpecialCharPipe, Tag, TranslatePipe, Message],
templateUrl: './registration-blocks-data.component.html',
styleUrl: './registration-blocks-data.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
diff --git a/src/app/shared/components/registration-card/registration-card.component.html b/src/app/shared/components/registration-card/registration-card.component.html
index f28b93ec2..48ee2de8c 100644
--- a/src/app/shared/components/registration-card/registration-card.component.html
+++ b/src/app/shared/components/registration-card/registration-card.component.html
@@ -5,7 +5,7 @@
- {{ registrationData().title || 'project.registrations.card.noTitle' | translate }}
+ {{ (registrationData().title | fixSpecialChar) || ('project.registrations.card.noTitle' | translate) }}
@if (!isDraft()) {
diff --git a/src/app/shared/components/registration-card/registration-card.component.spec.ts b/src/app/shared/components/registration-card/registration-card.component.spec.ts
index 380f1a70a..adc8720ef 100644
--- a/src/app/shared/components/registration-card/registration-card.component.spec.ts
+++ b/src/app/shared/components/registration-card/registration-card.component.spec.ts
@@ -1,16 +1,22 @@
-import { MockProvider } from 'ng-mocks';
+import { MockComponents, MockProvider } from 'ng-mocks';
-import { NO_ERRORS_SCHEMA, signal } from '@angular/core';
+import { signal } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ActivatedRoute } from '@angular/router';
import { RegistriesSelectors } from '@osf/features/registries/store';
-import { RegistrationReviewStates, RevisionReviewStates } from '@osf/shared/enums';
-import { RegistrationCard } from '@osf/shared/models';
+import { RegistrationReviewStates } from '@osf/shared/enums/registration-review-states.enum';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
+import { RegistrationCard } from '@shared/models/registration/registration-card.model';
+
+import { ContributorsListComponent } from '../contributors-list/contributors-list.component';
+import { DataResourcesComponent } from '../data-resources/data-resources.component';
+import { IconComponent } from '../icon/icon.component';
+import { StatusBadgeComponent } from '../status-badge/status-badge.component';
import { RegistrationCardComponent } from './registration-card.component';
-import { MOCK_REGISTRATION } from '@testing/mocks';
+import { MOCK_REGISTRATION } from '@testing/mocks/registration.mock';
import { OSFTestingModule } from '@testing/osf.testing.module';
import { provideMockStore } from '@testing/providers/store-provider.mock';
@@ -22,8 +28,11 @@ describe('RegistrationCardComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [RegistrationCardComponent, OSFTestingModule],
- schemas: [NO_ERRORS_SCHEMA],
+ imports: [
+ RegistrationCardComponent,
+ OSFTestingModule,
+ ...MockComponents(StatusBadgeComponent, DataResourcesComponent, IconComponent, ContributorsListComponent),
+ ],
providers: [
provideMockStore({
signals: [{ selector: RegistriesSelectors.getSchemaResponse, value: signal(null) }],
diff --git a/src/app/shared/components/registration-card/registration-card.component.ts b/src/app/shared/components/registration-card/registration-card.component.ts
index f5df0e9f5..e9ba0f72a 100644
--- a/src/app/shared/components/registration-card/registration-card.component.ts
+++ b/src/app/shared/components/registration-card/registration-card.component.ts
@@ -12,8 +12,11 @@ import { ChangeDetectionStrategy, Component, inject, input, output } from '@angu
import { Router, RouterLink } from '@angular/router';
import { CreateSchemaResponse, FetchAllSchemaResponses, RegistriesSelectors } from '@osf/features/registries/store';
-import { RegistrationReviewStates, RevisionReviewStates, UserPermissions } from '@osf/shared/enums';
-import { RegistrationCard } from '@osf/shared/models';
+import { RegistrationReviewStates } from '@osf/shared/enums/registration-review-states.enum';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
+import { UserPermissions } from '@osf/shared/enums/user-permissions.enum';
+import { RegistrationCard } from '@osf/shared/models/registration/registration-card.model';
+import { FixSpecialCharPipe } from '@osf/shared/pipes/fix-special-char.pipe';
import { ContributorsListComponent } from '../contributors-list/contributors-list.component';
import { DataResourcesComponent } from '../data-resources/data-resources.component';
@@ -34,6 +37,7 @@ import { TruncatedTextComponent } from '../truncated-text/truncated-text.compone
IconComponent,
TruncatedTextComponent,
ContributorsListComponent,
+ FixSpecialCharPipe,
],
templateUrl: './registration-card.component.html',
styleUrl: './registration-card.component.scss',
@@ -42,6 +46,7 @@ import { TruncatedTextComponent } from '../truncated-text/truncated-text.compone
export class RegistrationCardComponent {
RevisionReviewStates = RevisionReviewStates;
RegistrationReviewStates = RegistrationReviewStates;
+
readonly isDraft = input (false);
readonly registrationData = input.required();
readonly deleteDraft = output();
diff --git a/src/app/shared/components/resource-card/components/file-secondary-metadata/file-secondary-metadata.component.spec.ts b/src/app/shared/components/resource-card/components/file-secondary-metadata/file-secondary-metadata.component.spec.ts
index d55082887..fd9c5984e 100644
--- a/src/app/shared/components/resource-card/components/file-secondary-metadata/file-secondary-metadata.component.spec.ts
+++ b/src/app/shared/components/resource-card/components/file-secondary-metadata/file-secondary-metadata.component.spec.ts
@@ -1,11 +1,11 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ResourceType } from '@shared/enums';
-import { ResourceModel } from '@shared/models';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { ResourceModel } from '@shared/models/search/resource.model';
import { FileSecondaryMetadataComponent } from './file-secondary-metadata.component';
-import { MOCK_RESOURCE } from '@testing/mocks';
+import { MOCK_RESOURCE } from '@testing/mocks/resource.mock';
import { OSFTestingModule } from '@testing/osf.testing.module';
describe('FileSecondaryMetadataComponent', () => {
diff --git a/src/app/shared/components/resource-card/components/file-secondary-metadata/file-secondary-metadata.component.ts b/src/app/shared/components/resource-card/components/file-secondary-metadata/file-secondary-metadata.component.ts
index f015564bf..96cdc6269 100644
--- a/src/app/shared/components/resource-card/components/file-secondary-metadata/file-secondary-metadata.component.ts
+++ b/src/app/shared/components/resource-card/components/file-secondary-metadata/file-secondary-metadata.component.ts
@@ -2,7 +2,7 @@ import { TranslatePipe } from '@ngx-translate/core';
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
-import { ResourceModel } from '@shared/models';
+import { ResourceModel } from '@osf/shared/models/search/resource.model';
@Component({
selector: 'osf-file-secondary-metadata',
diff --git a/src/app/shared/components/resource-card/components/preprint-secondary-metadata/preprint-secondary-metadata.component.spec.ts b/src/app/shared/components/resource-card/components/preprint-secondary-metadata/preprint-secondary-metadata.component.spec.ts
index e138b6b4f..c2f9776c4 100644
--- a/src/app/shared/components/resource-card/components/preprint-secondary-metadata/preprint-secondary-metadata.component.spec.ts
+++ b/src/app/shared/components/resource-card/components/preprint-secondary-metadata/preprint-secondary-metadata.component.spec.ts
@@ -1,11 +1,11 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ResourceType } from '@shared/enums';
-import { ResourceModel } from '@shared/models';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { ResourceModel } from '@shared/models/search/resource.model';
import { PreprintSecondaryMetadataComponent } from './preprint-secondary-metadata.component';
-import { MOCK_RESOURCE } from '@testing/mocks';
+import { MOCK_RESOURCE } from '@testing/mocks/resource.mock';
import { OSFTestingModule } from '@testing/osf.testing.module';
describe('PreprintSecondaryMetadataComponent', () => {
diff --git a/src/app/shared/components/resource-card/components/preprint-secondary-metadata/preprint-secondary-metadata.component.ts b/src/app/shared/components/resource-card/components/preprint-secondary-metadata/preprint-secondary-metadata.component.ts
index aaac6b0f7..5c9658941 100644
--- a/src/app/shared/components/resource-card/components/preprint-secondary-metadata/preprint-secondary-metadata.component.ts
+++ b/src/app/shared/components/resource-card/components/preprint-secondary-metadata/preprint-secondary-metadata.component.ts
@@ -2,7 +2,7 @@ import { TranslatePipe } from '@ngx-translate/core';
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
-import { ResourceModel } from '@shared/models';
+import { ResourceModel } from '@osf/shared/models/search/resource.model';
@Component({
selector: 'osf-preprint-secondary-metadata',
diff --git a/src/app/shared/components/resource-card/components/project-secondary-metadata/project-secondary-metadata.component.spec.ts b/src/app/shared/components/resource-card/components/project-secondary-metadata/project-secondary-metadata.component.spec.ts
index 3a045bec2..beb0316e1 100644
--- a/src/app/shared/components/resource-card/components/project-secondary-metadata/project-secondary-metadata.component.spec.ts
+++ b/src/app/shared/components/resource-card/components/project-secondary-metadata/project-secondary-metadata.component.spec.ts
@@ -1,11 +1,11 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ResourceType } from '@shared/enums';
-import { ResourceModel } from '@shared/models';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { ResourceModel } from '@shared/models/search/resource.model';
import { ProjectSecondaryMetadataComponent } from './project-secondary-metadata.component';
-import { MOCK_RESOURCE } from '@testing/mocks';
+import { MOCK_RESOURCE } from '@testing/mocks/resource.mock';
import { OSFTestingModule } from '@testing/osf.testing.module';
describe('ProjectSecondaryMetadataComponent', () => {
diff --git a/src/app/shared/components/resource-card/components/project-secondary-metadata/project-secondary-metadata.component.ts b/src/app/shared/components/resource-card/components/project-secondary-metadata/project-secondary-metadata.component.ts
index 49eebe9f3..7d3c7a568 100644
--- a/src/app/shared/components/resource-card/components/project-secondary-metadata/project-secondary-metadata.component.ts
+++ b/src/app/shared/components/resource-card/components/project-secondary-metadata/project-secondary-metadata.component.ts
@@ -2,8 +2,8 @@ import { TranslatePipe } from '@ngx-translate/core';
import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
-import { languageCodes } from '@shared/constants';
-import { ResourceModel } from '@shared/models';
+import { languageCodes } from '@osf/shared/constants/language.const';
+import { ResourceModel } from '@shared/models/search/resource.model';
@Component({
selector: 'osf-project-secondary-metadata',
diff --git a/src/app/shared/components/resource-card/components/registration-secondary-metadata/registration-secondary-metadata.component.spec.ts b/src/app/shared/components/resource-card/components/registration-secondary-metadata/registration-secondary-metadata.component.spec.ts
index 5e7c7405d..ea861554c 100644
--- a/src/app/shared/components/resource-card/components/registration-secondary-metadata/registration-secondary-metadata.component.spec.ts
+++ b/src/app/shared/components/resource-card/components/registration-secondary-metadata/registration-secondary-metadata.component.spec.ts
@@ -1,11 +1,11 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ResourceType } from '@shared/enums';
-import { ResourceModel } from '@shared/models';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { ResourceModel } from '@shared/models/search/resource.model';
import { RegistrationSecondaryMetadataComponent } from './registration-secondary-metadata.component';
-import { MOCK_RESOURCE } from '@testing/mocks';
+import { MOCK_RESOURCE } from '@testing/mocks/resource.mock';
import { OSFTestingModule } from '@testing/osf.testing.module';
describe('RegistrationSecondaryMetadataComponent', () => {
diff --git a/src/app/shared/components/resource-card/components/registration-secondary-metadata/registration-secondary-metadata.component.ts b/src/app/shared/components/resource-card/components/registration-secondary-metadata/registration-secondary-metadata.component.ts
index b5a610a09..aee4f388d 100644
--- a/src/app/shared/components/resource-card/components/registration-secondary-metadata/registration-secondary-metadata.component.ts
+++ b/src/app/shared/components/resource-card/components/registration-secondary-metadata/registration-secondary-metadata.component.ts
@@ -2,7 +2,7 @@ import { TranslatePipe } from '@ngx-translate/core';
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
-import { ResourceModel } from '@shared/models';
+import { ResourceModel } from '@osf/shared/models/search/resource.model';
@Component({
selector: 'osf-registration-secondary-metadata',
diff --git a/src/app/shared/components/resource-card/components/user-secondary-metadata/user-secondary-metadata.component.spec.ts b/src/app/shared/components/resource-card/components/user-secondary-metadata/user-secondary-metadata.component.spec.ts
index 66fa6ab68..ef77b5c06 100644
--- a/src/app/shared/components/resource-card/components/user-secondary-metadata/user-secondary-metadata.component.spec.ts
+++ b/src/app/shared/components/resource-card/components/user-secondary-metadata/user-secondary-metadata.component.spec.ts
@@ -1,11 +1,11 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ResourceType } from '@shared/enums';
-import { ResourceModel } from '@shared/models';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { ResourceModel } from '@shared/models/search/resource.model';
import { UserSecondaryMetadataComponent } from './user-secondary-metadata.component';
-import { MOCK_AGENT_RESOURCE } from '@testing/mocks';
+import { MOCK_AGENT_RESOURCE } from '@testing/mocks/resource.mock';
import { OSFTestingModule } from '@testing/osf.testing.module';
describe('UserSecondaryMetadataComponent', () => {
diff --git a/src/app/shared/components/resource-card/components/user-secondary-metadata/user-secondary-metadata.component.ts b/src/app/shared/components/resource-card/components/user-secondary-metadata/user-secondary-metadata.component.ts
index 93f131d1d..40eca1a87 100644
--- a/src/app/shared/components/resource-card/components/user-secondary-metadata/user-secondary-metadata.component.ts
+++ b/src/app/shared/components/resource-card/components/user-secondary-metadata/user-secondary-metadata.component.ts
@@ -4,7 +4,8 @@ import { Skeleton } from 'primeng/skeleton';
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
-import { ResourceModel, UserRelatedCounts } from '@shared/models';
+import { ResourceModel } from '@osf/shared/models/search/resource.model';
+import { UserRelatedCounts } from '@osf/shared/models/user-related-counts/user-related-counts.model';
@Component({
selector: 'osf-user-secondary-metadata',
diff --git a/src/app/shared/components/resource-card/resource-card.component.html b/src/app/shared/components/resource-card/resource-card.component.html
index dbe1167bf..279ab27ff 100644
--- a/src/app/shared/components/resource-card/resource-card.component.html
+++ b/src/app/shared/components/resource-card/resource-card.component.html
@@ -13,7 +13,7 @@
target="_blank"
rel="noopener noreferrer"
>
- {{ displayTitle() }}
+ {{ displayTitle() | fixSpecialChar }}
diff --git a/src/app/shared/components/resource-card/resource-card.component.spec.ts b/src/app/shared/components/resource-card/resource-card.component.spec.ts
index bb9364623..ebec3c9f3 100644
--- a/src/app/shared/components/resource-card/resource-card.component.spec.ts
+++ b/src/app/shared/components/resource-card/resource-card.component.spec.ts
@@ -1,16 +1,25 @@
-import { MockProvider } from 'ng-mocks';
+import { MockComponents, MockProvider } from 'ng-mocks';
import { of } from 'rxjs';
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { IS_XSMALL } from '@osf/shared/helpers';
-import { ResourceCardComponent } from '@shared/components';
-import { ResourceType } from '@shared/enums';
-import { ResourceModel } from '@shared/models';
-import { ResourceCardService } from '@shared/services';
+import { IS_XSMALL } from '@osf/shared/helpers/breakpoints.tokens';
+import { ResourceCardService } from '@osf/shared/services/resource-card.service';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { ResourceModel } from '@shared/models/search/resource.model';
-import { MOCK_AGENT_RESOURCE, MOCK_RESOURCE, MOCK_USER_RELATED_COUNTS } from '@testing/mocks';
+import { DataResourcesComponent } from '../data-resources/data-resources.component';
+
+import { FileSecondaryMetadataComponent } from './components/file-secondary-metadata/file-secondary-metadata.component';
+import { PreprintSecondaryMetadataComponent } from './components/preprint-secondary-metadata/preprint-secondary-metadata.component';
+import { ProjectSecondaryMetadataComponent } from './components/project-secondary-metadata/project-secondary-metadata.component';
+import { RegistrationSecondaryMetadataComponent } from './components/registration-secondary-metadata/registration-secondary-metadata.component';
+import { UserSecondaryMetadataComponent } from './components/user-secondary-metadata/user-secondary-metadata.component';
+import { ResourceCardComponent } from './resource-card.component';
+
+import { MOCK_USER_RELATED_COUNTS } from '@testing/mocks/data.mock';
+import { MOCK_AGENT_RESOURCE, MOCK_RESOURCE } from '@testing/mocks/resource.mock';
import { OSFTestingModule } from '@testing/osf.testing.module';
describe('ResourceCardComponent', () => {
@@ -24,7 +33,18 @@ describe('ResourceCardComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [ResourceCardComponent, OSFTestingModule],
+ imports: [
+ ResourceCardComponent,
+ OSFTestingModule,
+ ...MockComponents(
+ DataResourcesComponent,
+ UserSecondaryMetadataComponent,
+ RegistrationSecondaryMetadataComponent,
+ ProjectSecondaryMetadataComponent,
+ PreprintSecondaryMetadataComponent,
+ FileSecondaryMetadataComponent
+ ),
+ ],
providers: [
MockProvider(ResourceCardService, {
getUserRelatedCounts: jest.fn().mockReturnValue(of(mockUserCounts)),
diff --git a/src/app/shared/components/resource-card/resource-card.component.ts b/src/app/shared/components/resource-card/resource-card.component.ts
index 55d01d1cf..d4b6429a5 100644
--- a/src/app/shared/components/resource-card/resource-card.component.ts
+++ b/src/app/shared/components/resource-card/resource-card.component.ts
@@ -11,12 +11,15 @@ import { toSignal } from '@angular/core/rxjs-interop';
import { getPreprintDocumentType } from '@osf/features/preprints/helpers';
import { PreprintProviderDetails } from '@osf/features/preprints/models';
-import { CardLabelTranslationKeys } from '@osf/shared/constants';
-import { ResourceType } from '@osf/shared/enums';
-import { getSortedContributorsByPermissions, IS_XSMALL } from '@osf/shared/helpers';
-import { ResourceModel, UserRelatedCounts } from '@osf/shared/models';
-import { ResourceCardService } from '@osf/shared/services';
-import { StopPropagationDirective } from '@shared/directives';
+import { CardLabelTranslationKeys } from '@osf/shared/constants/resource-card-labels.const';
+import { StopPropagationDirective } from '@osf/shared/directives/stop-propagation.directive';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { IS_XSMALL } from '@osf/shared/helpers/breakpoints.tokens';
+import { getSortedContributorsByPermissions } from '@osf/shared/helpers/sort-contributors-by-permissions';
+import { ResourceModel } from '@osf/shared/models/search/resource.model';
+import { UserRelatedCounts } from '@osf/shared/models/user-related-counts/user-related-counts.model';
+import { FixSpecialCharPipe } from '@osf/shared/pipes/fix-special-char.pipe';
+import { ResourceCardService } from '@osf/shared/services/resource-card.service';
import { DataResourcesComponent } from '../data-resources/data-resources.component';
@@ -44,6 +47,7 @@ import { UserSecondaryMetadataComponent } from './components/user-secondary-meta
PreprintSecondaryMetadataComponent,
FileSecondaryMetadataComponent,
StopPropagationDirective,
+ FixSpecialCharPipe,
],
templateUrl: './resource-card.component.html',
styleUrl: './resource-card.component.scss',
diff --git a/src/app/shared/components/resource-citations/resource-citations.component.html b/src/app/shared/components/resource-citations/resource-citations.component.html
index 9cdce7d8c..eb4b31678 100644
--- a/src/app/shared/components/resource-citations/resource-citations.component.html
+++ b/src/app/shared/components/resource-citations/resource-citations.component.html
@@ -1,36 +1,39 @@
-@let resource = currentResource();
+@let customCitation = customCitations();
-@if (resource) {
+@if (resourceId()) {
}
+
{{ 'project.overview.metadata.getMoreCitations' | translate }}
+
{{ citation.title }}
@if (styledCitation()) {
{{ styledCitation()?.citation }}
}
+
+
@if (!hasViewOnly || canEdit()) {
}
}
@@ -87,29 +94,32 @@ {{ citation.title }}
class="w-full"
[formControl]="customCitationInput"
>
+
diff --git a/src/app/shared/components/resource-citations/resource-citations.component.spec.ts b/src/app/shared/components/resource-citations/resource-citations.component.spec.ts
index 1a412fda0..df5fc86f8 100644
--- a/src/app/shared/components/resource-citations/resource-citations.component.spec.ts
+++ b/src/app/shared/components/resource-citations/resource-citations.component.spec.ts
@@ -3,15 +3,16 @@ import { MockProvider } from 'ng-mocks';
import { Clipboard } from '@angular/cdk/clipboard';
import { signal } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { Router } from '@angular/router';
-import { ResourceOverview } from '@shared/models';
-import { ToastService } from '@shared/services';
+import { CurrentResourceType } from '@osf/shared/enums/resource-type.enum';
+import { ToastService } from '@osf/shared/services/toast.service';
import { CitationsSelectors } from '@shared/stores/citations';
import { ResourceCitationsComponent } from './resource-citations.component';
-import { MOCK_RESOURCE_OVERVIEW } from '@testing/mocks';
import { OSFTestingModule } from '@testing/osf.testing.module';
+import { RouterMockBuilder } from '@testing/providers/router-provider.mock';
import { provideMockStore } from '@testing/providers/store-provider.mock';
import { ToastServiceMockBuilder } from '@testing/providers/toast-provider.mock';
@@ -20,14 +21,18 @@ describe('ResourceCitationsComponent', () => {
let fixture: ComponentFixture;
let mockClipboard: jest.Mocked;
let mockToastService: ReturnType;
+ let mockRouter: ReturnType;
- const mockResource: ResourceOverview = MOCK_RESOURCE_OVERVIEW;
+ const mockResourceId = 'resource-123';
+ const mockResourceType = CurrentResourceType.Projects;
+ const mockCustomCitation = 'Custom citation text';
beforeEach(async () => {
mockClipboard = {
copy: jest.fn(),
} as any;
mockToastService = ToastServiceMockBuilder.create().build();
+ mockRouter = RouterMockBuilder.create().build();
await TestBed.configureTestingModule({
imports: [ResourceCitationsComponent, OSFTestingModule],
@@ -44,6 +49,7 @@ describe('ResourceCitationsComponent', () => {
}),
MockProvider(Clipboard, mockClipboard),
MockProvider(ToastService, mockToastService),
+ MockProvider(Router, mockRouter),
],
}).compileComponents();
@@ -52,24 +58,28 @@ describe('ResourceCitationsComponent', () => {
});
it('should create', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
fixture.detectChanges();
expect(component).toBeTruthy();
});
- it('should have currentResource as required input', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
+ it('should have canEdit input with default value false', () => {
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
fixture.detectChanges();
- expect(component.currentResource()).toEqual(mockResource);
+ expect(component.canEdit()).toBe(false);
});
- it('should have canEdit input with default value false', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
+ it('should have customCitations input', () => {
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
+ fixture.componentRef.setInput('customCitations', mockCustomCitation);
fixture.detectChanges();
- expect(component.canEdit()).toBe(false);
+ expect(component.customCitations()).toBe(mockCustomCitation);
});
it('should prevent default event and not throw error', () => {
@@ -78,74 +88,48 @@ describe('ResourceCitationsComponent', () => {
filter: 'apa',
} as any;
- fixture.componentRef.setInput('currentResource', mockResource);
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
fixture.detectChanges();
expect(() => component.handleCitationStyleFilterSearch(mockEvent)).not.toThrow();
expect(mockEvent.originalEvent.preventDefault).toHaveBeenCalled();
});
- it('should call action when resource exists', () => {
- const mockEvent = {
- value: { id: 'citation-style-id' },
- } as any;
-
- fixture.componentRef.setInput('currentResource', mockResource);
- fixture.detectChanges();
-
- expect(() => component.handleGetStyledCitation(mockEvent)).not.toThrow();
- });
-
- it('should not throw when resource is null', () => {
+ it('should not throw when resourceId is empty', () => {
const mockEvent = {
value: { id: 'citation-style-id' },
} as any;
- fixture.componentRef.setInput('currentResource', null);
+ fixture.componentRef.setInput('resourceId', '');
+ fixture.componentRef.setInput('resourceType', mockResourceType);
fixture.detectChanges();
expect(() => component.handleGetStyledCitation(mockEvent)).not.toThrow();
});
- it('should call handleUpdateCustomCitation without errors when citation is valid', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
- component.customCitationInput.setValue('New custom citation');
-
- expect(() => component.handleUpdateCustomCitation()).not.toThrow();
- });
-
it('should not emit when citation text is empty', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
component.customCitationInput.setValue(' ');
- const emitSpy = jest.spyOn(component.customCitation, 'emit');
+ const emitSpy = jest.spyOn(component.customCitationChange, 'emit');
component.handleUpdateCustomCitation();
expect(emitSpy).not.toHaveBeenCalled();
});
- it('should not throw when resource is null', () => {
- fixture.componentRef.setInput('currentResource', null);
- component.customCitationInput.setValue('Some citation');
-
- expect(() => component.handleUpdateCustomCitation()).not.toThrow();
- });
-
- it('should call handleDeleteCustomCitation without errors', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
-
- expect(() => component.handleDeleteCustomCitation()).not.toThrow();
- });
-
- it('should not throw handleDeleteCustomCitation when resource is null', () => {
- fixture.componentRef.setInput('currentResource', null);
+ it('should not throw handleDeleteCustomCitation when resourceId is empty', () => {
+ fixture.componentRef.setInput('resourceId', '');
+ fixture.componentRef.setInput('resourceType', mockResourceType);
expect(() => component.handleDeleteCustomCitation()).not.toThrow();
});
it('should toggle isEditMode from false to true', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
fixture.detectChanges();
expect(component.isEditMode()).toBe(false);
@@ -156,7 +140,8 @@ describe('ResourceCitationsComponent', () => {
});
it('should toggle isEditMode from true to false', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
fixture.detectChanges();
component.isEditMode.set(true);
@@ -166,20 +151,10 @@ describe('ResourceCitationsComponent', () => {
expect(component.isEditMode()).toBe(false);
});
- it('should call toggleEditMode without errors', () => {
- fixture.componentRef.setInput('currentResource', mockResource);
- fixture.detectChanges();
-
- expect(() => component.toggleEditMode()).not.toThrow();
- });
-
- it('should copy citation to clipboard when customCitation exists', () => {
- const resourceWithCitation = {
- ...mockResource,
- customCitation: 'Citation to copy',
- };
-
- fixture.componentRef.setInput('currentResource', resourceWithCitation);
+ it('should copy citation to clipboard when customCitations exists', () => {
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
+ fixture.componentRef.setInput('customCitations', 'Citation to copy');
fixture.detectChanges();
component.copyCitation();
@@ -188,13 +163,10 @@ describe('ResourceCitationsComponent', () => {
expect(mockToastService.showSuccess).toHaveBeenCalledWith('settings.developerApps.messages.copied');
});
- it('should not copy when customCitation is empty', () => {
- const resourceWithoutCitation = {
- ...mockResource,
- customCitation: '',
- };
-
- fixture.componentRef.setInput('currentResource', resourceWithoutCitation);
+ it('should not copy when customCitations is empty', () => {
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
+ fixture.componentRef.setInput('customCitations', '');
fixture.detectChanges();
component.copyCitation();
@@ -203,11 +175,15 @@ describe('ResourceCitationsComponent', () => {
expect(mockToastService.showSuccess).not.toHaveBeenCalled();
});
- it('should not throw when resource is null', () => {
- fixture.componentRef.setInput('currentResource', null);
+ it('should not copy when customCitations is null', () => {
+ fixture.componentRef.setInput('resourceId', mockResourceId);
+ fixture.componentRef.setInput('resourceType', mockResourceType);
+ fixture.componentRef.setInput('customCitations', null);
fixture.detectChanges();
- expect(() => component.copyCitation()).not.toThrow();
+ component.copyCitation();
+
expect(mockClipboard.copy).not.toHaveBeenCalled();
+ expect(mockToastService.showSuccess).not.toHaveBeenCalled();
});
});
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 e3f73d608..406c82261 100644
--- a/src/app/shared/components/resource-citations/resource-citations.component.ts
+++ b/src/app/shared/components/resource-citations/resource-citations.component.ts
@@ -9,7 +9,7 @@ import { Select, SelectChangeEvent, SelectFilterEvent } from 'primeng/select';
import { Skeleton } from 'primeng/skeleton';
import { Textarea } from 'primeng/textarea';
-import { debounceTime, distinctUntilChanged, Subject, takeUntil } from 'rxjs';
+import { debounceTime, distinctUntilChanged, Subject } from 'rxjs';
import { Clipboard } from '@angular/cdk/clipboard';
import {
@@ -23,12 +23,15 @@ import {
output,
signal,
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormControl, ReactiveFormsModule } from '@angular/forms';
import { Router } from '@angular/router';
-import { hasViewOnlyParam } from '@shared/helpers';
-import { CitationStyle, CustomOption, ResourceOverview } from '@shared/models';
-import { ToastService } from '@shared/services';
+import { CurrentResourceType } from '@osf/shared/enums/resource-type.enum';
+import { hasViewOnlyParam } from '@osf/shared/helpers/view-only.helper';
+import { ToastService } from '@osf/shared/services/toast.service';
+import { CitationStyle } from '@shared/models/citations/citation-style.model';
+import { CustomOption } from '@shared/models/select-option.model';
import {
CitationsSelectors,
ClearStyledCitation,
@@ -61,15 +64,16 @@ export class ResourceCitationsComponent {
private readonly destroyRef = inject(DestroyRef);
private readonly router = inject(Router);
- currentResource = input.required();
+ resourceId = input.required();
+ resourceType = input.required();
+ customCitations = input();
canEdit = input(false);
private readonly clipboard = inject(Clipboard);
private readonly toastService = inject(ToastService);
- private readonly destroy$ = new Subject();
private readonly filterSubject = new Subject();
- customCitation = output();
+ customCitationChange = output();
defaultCitations = select(CitationsSelectors.getDefaultCitations);
isCitationsLoading = select(CitationsSelectors.getDefaultCitationsLoading);
citationStyles = select(CitationsSelectors.getCitationStyles);
@@ -100,16 +104,17 @@ export class ResourceCitationsComponent {
this.setupFilterDebounce();
this.setupDefaultCitationsEffect();
this.setupCitationStylesEffect();
- this.setupCleanup();
}
setupDefaultCitationsEffect(): void {
effect(() => {
- const resource = this.currentResource();
+ const customCitations = this.customCitations();
+ const resourceId = this.resourceId();
+ const resourceType = this.resourceType();
- if (resource) {
- this.actions.getDefaultCitations(resource.type, resource.id);
- this.customCitationInput.setValue(resource.customCitation);
+ if (resourceId && resourceType) {
+ this.actions.getDefaultCitations(resourceType, resourceId);
+ this.customCitationInput.setValue(customCitations ?? '');
}
});
}
@@ -120,27 +125,29 @@ export class ResourceCitationsComponent {
}
handleGetStyledCitation(event: SelectChangeEvent) {
- const resource = this.currentResource();
+ const resourceId = this.resourceId();
+ const resourceType = this.resourceType();
- if (resource) {
- this.actions.getStyledCitation(resource.type, resource.id, event.value.id);
+ if (resourceId && resourceType) {
+ this.actions.getStyledCitation(resourceType, resourceId, event.value.id);
}
}
handleUpdateCustomCitation(): void {
- const resource = this.currentResource();
+ const resourceId = this.resourceId();
+ const resourceType = this.resourceType();
const customCitationText = this.customCitationInput.value?.trim();
- if (resource && customCitationText) {
+ if (resourceId && resourceType && customCitationText) {
const payload = {
- id: resource.id,
- type: resource.type,
+ id: resourceId,
+ type: resourceType,
citationText: customCitationText,
};
this.actions.updateCustomCitation(payload).subscribe({
next: () => {
- this.customCitation.emit(customCitationText);
+ this.customCitationChange.emit(customCitationText);
},
complete: () => {
this.toggleEditMode();
@@ -150,18 +157,19 @@ export class ResourceCitationsComponent {
}
handleDeleteCustomCitation(): void {
- const resource = this.currentResource();
+ const resourceId = this.resourceId();
+ const resourceType = this.resourceType();
- if (resource) {
+ if (resourceId && resourceType) {
const payload = {
- id: resource.id,
- type: resource.type,
+ id: resourceId,
+ type: resourceType,
citationText: '',
};
this.actions.updateCustomCitation(payload).subscribe({
next: () => {
- this.customCitation.emit('');
+ this.customCitationChange.emit('');
},
complete: () => {
this.toggleEditMode();
@@ -178,20 +186,18 @@ export class ResourceCitationsComponent {
}
copyCitation(): void {
- const resource = this.currentResource();
+ const customCitations = this.customCitations();
- if (resource?.customCitation) {
- this.clipboard.copy(resource.customCitation);
+ if (customCitations) {
+ this.clipboard.copy(customCitations);
this.toastService.showSuccess('settings.developerApps.messages.copied');
}
}
private setupFilterDebounce(): void {
this.filterSubject
- .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))
- .subscribe((filterValue) => {
- this.actions.getCitationStyles(filterValue);
- });
+ .pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
+ .subscribe((filterValue) => this.actions.getCitationStyles(filterValue));
}
private setupCitationStylesEffect(): void {
@@ -202,14 +208,8 @@ export class ResourceCitationsComponent {
label: style.title,
value: style,
}));
- this.citationStylesOptions.set(options);
- });
- }
- private setupCleanup(): void {
- this.destroyRef.onDestroy(() => {
- this.destroy$.next();
- this.destroy$.complete();
+ this.citationStylesOptions.set(options);
});
}
}
diff --git a/src/app/shared/components/resource-doi/resource-doi.component.html b/src/app/shared/components/resource-doi/resource-doi.component.html
new file mode 100644
index 000000000..7793ad01a
--- /dev/null
+++ b/src/app/shared/components/resource-doi/resource-doi.component.html
@@ -0,0 +1,13 @@
+@if (isLoading()) {
+
+} @else {
+ @for (identifier of identifiers(); track identifier.id) {
+ @if (identifier.category === 'doi') {
+
+ {{ identifier.value }}
+
+ }
+ } @empty {
+ {{ 'common.labels.noDoi' | translate }}
+ }
+}
diff --git a/src/app/shared/components/resource-doi/resource-doi.component.scss b/src/app/shared/components/resource-doi/resource-doi.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/shared/components/resource-doi/resource-doi.component.spec.ts b/src/app/shared/components/resource-doi/resource-doi.component.spec.ts
new file mode 100644
index 000000000..5dbf0fb17
--- /dev/null
+++ b/src/app/shared/components/resource-doi/resource-doi.component.spec.ts
@@ -0,0 +1,46 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { IdentifierModel } from '@osf/shared/models/identifiers/identifier.model';
+
+import { ResourceDoiComponent } from './resource-doi.component';
+
+import { MOCK_PROJECT_IDENTIFIERS } from '@testing/mocks/project-overview.mock';
+
+describe('ResourceDoiComponent', () => {
+ let component: ResourceDoiComponent;
+ let fixture: ComponentFixture;
+
+ const mockIdentifiers: IdentifierModel[] = [
+ MOCK_PROJECT_IDENTIFIERS,
+ {
+ id: 'identifier-2',
+ type: 'identifiers',
+ category: 'doi',
+ value: '10.5678/another.doi',
+ },
+ ];
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ResourceDoiComponent],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(ResourceDoiComponent);
+ component = fixture.componentInstance;
+ });
+
+ it('should have default input values', () => {
+ expect(component.identifiers()).toEqual([]);
+ expect(component.isLoading()).toBe(false);
+ });
+
+ it('should set identifiers input correctly', () => {
+ fixture.componentRef.setInput('identifiers', mockIdentifiers);
+ expect(component.identifiers()).toEqual(mockIdentifiers);
+ });
+
+ it('should set isLoading input correctly', () => {
+ fixture.componentRef.setInput('isLoading', true);
+ expect(component.isLoading()).toBe(true);
+ });
+});
diff --git a/src/app/shared/components/resource-doi/resource-doi.component.ts b/src/app/shared/components/resource-doi/resource-doi.component.ts
new file mode 100644
index 000000000..df013d293
--- /dev/null
+++ b/src/app/shared/components/resource-doi/resource-doi.component.ts
@@ -0,0 +1,19 @@
+import { TranslatePipe } from '@ngx-translate/core';
+
+import { Skeleton } from 'primeng/skeleton';
+
+import { ChangeDetectionStrategy, Component, input } from '@angular/core';
+
+import { IdentifierModel } from '@osf/shared/models/identifiers/identifier.model';
+
+@Component({
+ selector: 'osf-resource-doi',
+ imports: [Skeleton, TranslatePipe],
+ templateUrl: './resource-doi.component.html',
+ styleUrl: './resource-doi.component.scss',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class ResourceDoiComponent {
+ identifiers = input([]);
+ isLoading = input(false);
+}
diff --git a/src/app/shared/components/resource-license/resource-license.component.html b/src/app/shared/components/resource-license/resource-license.component.html
new file mode 100644
index 000000000..8a0c6955c
--- /dev/null
+++ b/src/app/shared/components/resource-license/resource-license.component.html
@@ -0,0 +1,5 @@
+@if (isLoading()) {
+
+} @else {
+ {{ license()?.name ?? ('common.labels.noLicense' | translate) }}
+}
diff --git a/src/app/shared/components/resource-license/resource-license.component.scss b/src/app/shared/components/resource-license/resource-license.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/shared/components/resource-license/resource-license.component.spec.ts b/src/app/shared/components/resource-license/resource-license.component.spec.ts
new file mode 100644
index 000000000..c2765d03e
--- /dev/null
+++ b/src/app/shared/components/resource-license/resource-license.component.spec.ts
@@ -0,0 +1,56 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+
+import { ResourceLicenseComponent } from './resource-license.component';
+
+import { MOCK_LICENSE } from '@testing/mocks/license.mock';
+import { OSFTestingModule } from '@testing/osf.testing.module';
+
+describe('ResourceLicenseComponent', () => {
+ let component: ResourceLicenseComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ResourceLicenseComponent, OSFTestingModule],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(ResourceLicenseComponent);
+ component = fixture.componentInstance;
+ });
+
+ it('should have default input values', () => {
+ expect(component.license()).toBeUndefined();
+ expect(component.isLoading()).toBe(false);
+ });
+
+ it('should set license input correctly with LicenseModel', () => {
+ fixture.componentRef.setInput('license', MOCK_LICENSE);
+ expect(component.license()).toEqual(MOCK_LICENSE);
+ });
+
+ it('should set license input correctly with null value', () => {
+ fixture.componentRef.setInput('license', null);
+ expect(component.license()).toBeNull();
+ });
+
+ it('should set license input correctly with undefined value', () => {
+ fixture.componentRef.setInput('license', undefined);
+ expect(component.license()).toBeUndefined();
+ });
+
+ it('should set isLoading input correctly', () => {
+ fixture.componentRef.setInput('isLoading', true);
+ expect(component.isLoading()).toBe(true);
+ });
+
+ it('should display license name when license is provided and isLoading is false', () => {
+ fixture.componentRef.setInput('license', MOCK_LICENSE);
+ fixture.componentRef.setInput('isLoading', false);
+ fixture.detectChanges();
+
+ const divElement = fixture.debugElement.query(By.css('div'));
+ expect(divElement).toBeTruthy();
+ expect(divElement.nativeElement.textContent.trim()).toBe('Apache License, 2.0');
+ });
+});
diff --git a/src/app/shared/components/resource-license/resource-license.component.ts b/src/app/shared/components/resource-license/resource-license.component.ts
new file mode 100644
index 000000000..cd58b0082
--- /dev/null
+++ b/src/app/shared/components/resource-license/resource-license.component.ts
@@ -0,0 +1,19 @@
+import { TranslatePipe } from '@ngx-translate/core';
+
+import { Skeleton } from 'primeng/skeleton';
+
+import { ChangeDetectionStrategy, Component, input } from '@angular/core';
+
+import { LicenseModel } from '@osf/shared/models/license/license.model';
+
+@Component({
+ selector: 'osf-resource-license',
+ imports: [Skeleton, TranslatePipe],
+ templateUrl: './resource-license.component.html',
+ styleUrl: './resource-license.component.scss',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class ResourceLicenseComponent {
+ license = input();
+ isLoading = input(false);
+}
diff --git a/src/app/shared/components/resource-metadata/resource-metadata.component.html b/src/app/shared/components/resource-metadata/resource-metadata.component.html
deleted file mode 100644
index 7e79448a9..000000000
--- a/src/app/shared/components/resource-metadata/resource-metadata.component.html
+++ /dev/null
@@ -1,178 +0,0 @@
-@let resource = currentResource();
-
-@if (resource) {
-
-}
diff --git a/src/app/shared/components/resource-metadata/resource-metadata.component.ts b/src/app/shared/components/resource-metadata/resource-metadata.component.ts
deleted file mode 100644
index b83423090..000000000
--- a/src/app/shared/components/resource-metadata/resource-metadata.component.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { TranslatePipe } from '@ngx-translate/core';
-
-import { Button } from 'primeng/button';
-import { Tag } from 'primeng/tag';
-
-import { DatePipe } from '@angular/common';
-import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';
-import { Router, RouterLink } from '@angular/router';
-
-import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { OverviewCollectionsComponent } from '@osf/features/project/overview/components/overview-collections/overview-collections.component';
-import { CurrentResourceType } from '@osf/shared/enums';
-import { ContributorModel, ResourceOverview } from '@shared/models';
-
-import { AffiliatedInstitutionsViewComponent } from '../affiliated-institutions-view/affiliated-institutions-view.component';
-import { ContributorsListComponent } from '../contributors-list/contributors-list.component';
-import { ResourceCitationsComponent } from '../resource-citations/resource-citations.component';
-import { TruncatedTextComponent } from '../truncated-text/truncated-text.component';
-
-@Component({
- selector: 'osf-resource-metadata',
- imports: [
- Button,
- TranslatePipe,
- TruncatedTextComponent,
- RouterLink,
- Tag,
- DatePipe,
- ResourceCitationsComponent,
- OverviewCollectionsComponent,
- AffiliatedInstitutionsViewComponent,
- ContributorsListComponent,
- ],
- templateUrl: './resource-metadata.component.html',
- styleUrl: './resource-metadata.component.scss',
- changeDetection: ChangeDetectionStrategy.OnPush,
-})
-export class ResourceMetadataComponent {
- private readonly environment = inject(ENVIRONMENT);
- private readonly router = inject(Router);
-
- currentResource = input.required();
- customCitationUpdated = output();
- isCollectionsRoute = input(false);
- canEdit = input.required();
- showEditButton = input();
- bibliographicContributors = input([]);
- isBibliographicContributorsLoading = input(false);
- hasMoreBibliographicContributors = input(false);
- loadMoreContributors = output();
-
- readonly resourceTypes = CurrentResourceType;
- readonly dateFormat = 'MMM d, y, h:mm a';
- readonly webUrl = this.environment.webUrl;
-
- isProject = computed(() => this.currentResource()?.type === CurrentResourceType.Projects);
- isRegistration = computed(() => this.currentResource()?.type === CurrentResourceType.Registrations);
-
- onCustomCitationUpdated(citation: string): void {
- this.customCitationUpdated.emit(citation);
- }
-
- tagClicked(tag: string) {
- this.router.navigate(['/search'], { queryParams: { search: tag } });
- }
-}
diff --git a/src/app/shared/components/search-filters/search-filters.component.spec.ts b/src/app/shared/components/search-filters/search-filters.component.spec.ts
index 90885f1eb..1177919c0 100644
--- a/src/app/shared/components/search-filters/search-filters.component.spec.ts
+++ b/src/app/shared/components/search-filters/search-filters.component.spec.ts
@@ -1,7 +1,16 @@
+import { MockComponents } from 'ng-mocks';
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import {
+ DiscoverableFilter,
+ FilterOperatorOption,
+ FilterOption,
+} from '@osf/shared/models/search/discaverable-filter.model';
import { FILTER_PLACEHOLDERS } from '@shared/constants/filter-placeholders';
-import { DiscoverableFilter, FilterOperator, FilterOption } from '@shared/models';
+
+import { GenericFilterComponent } from '../generic-filter/generic-filter.component';
+import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';
import { SearchFiltersComponent } from './search-filters.component';
@@ -15,7 +24,7 @@ describe('SearchFiltersComponent', () => {
{
key: 'subject',
label: 'Subject',
- operator: FilterOperator.IsPresent,
+ operator: FilterOperatorOption.IsPresent,
resultCount: 150,
options: [
{ label: 'Psychology', value: 'psychology', cardSearchResultCount: 10 },
@@ -25,7 +34,7 @@ describe('SearchFiltersComponent', () => {
{
key: 'resourceType',
label: 'Resource Type',
- operator: FilterOperator.IsPresent,
+ operator: FilterOperatorOption.IsPresent,
resultCount: 100,
options: [
{ label: 'Project', value: 'project', cardSearchResultCount: 50 },
@@ -35,7 +44,7 @@ describe('SearchFiltersComponent', () => {
{
key: 'hasData',
label: 'Has Data',
- operator: FilterOperator.IsPresent,
+ operator: FilterOperatorOption.IsPresent,
resultCount: 75,
},
];
@@ -46,7 +55,11 @@ describe('SearchFiltersComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [SearchFiltersComponent, OSFTestingModule],
+ imports: [
+ SearchFiltersComponent,
+ OSFTestingModule,
+ ...MockComponents(GenericFilterComponent, LoadingSpinnerComponent),
+ ],
}).compileComponents();
fixture = TestBed.createComponent(SearchFiltersComponent);
@@ -90,11 +103,11 @@ describe('SearchFiltersComponent', () => {
it('should filter out invalid filters in visibleFilters', () => {
const filtersWithInvalid = [
...mockFilters,
- { key: '', label: 'Invalid', operator: FilterOperator.IsPresent } as DiscoverableFilter,
+ { key: '', label: 'Invalid', operator: FilterOperatorOption.IsPresent } as DiscoverableFilter,
{
key: 'noCount',
label: 'No Count',
- operator: FilterOperator.IsPresent,
+ operator: FilterOperatorOption.IsPresent,
resultCount: 0,
options: [],
} as DiscoverableFilter,
@@ -116,7 +129,7 @@ describe('SearchFiltersComponent', () => {
expect(splitFilters.individual.length).toBe(0);
expect(splitFilters.grouped.length).toBe(3);
- expect(splitFilters.grouped[0].operator).toBe(FilterOperator.IsPresent);
+ expect(splitFilters.grouped[0].operator).toBe(FilterOperatorOption.IsPresent);
});
it('should compute selectedOptionValues from selectedOptions', () => {
diff --git a/src/app/shared/components/search-filters/search-filters.component.ts b/src/app/shared/components/search-filters/search-filters.component.ts
index 5c5fb3239..f8999fcf1 100644
--- a/src/app/shared/components/search-filters/search-filters.component.ts
+++ b/src/app/shared/components/search-filters/search-filters.component.ts
@@ -11,8 +11,12 @@ import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject, input
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { FILTER_PLACEHOLDERS } from '@osf/shared/constants';
-import { DiscoverableFilter, FilterOperator, FilterOption } from '@osf/shared/models';
+import { FILTER_PLACEHOLDERS } from '@osf/shared/constants/filter-placeholders';
+import {
+ DiscoverableFilter,
+ FilterOperatorOption,
+ FilterOption,
+} from '@shared/models/search/discaverable-filter.model';
import { GenericFilterComponent } from '../generic-filter/generic-filter.component';
import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';
@@ -81,7 +85,7 @@ export class SearchFiltersComponent {
const groupedFilters: DiscoverableFilter[] = [];
filters.forEach((filter) => {
- if (filter.operator === FilterOperator.IsPresent) {
+ if (filter.operator === FilterOperatorOption.IsPresent) {
groupedFilters.push(filter);
} else {
individualFilters.push(filter);
diff --git a/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.html b/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.html
index 70c7ad960..4faf30679 100644
--- a/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.html
+++ b/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.html
@@ -10,10 +10,10 @@ {{ step.title | translate }}
@if ($index + 1 !== steps().length) {
-
-
+
+
} @else {
-
+
}
diff --git a/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.spec.ts b/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.spec.ts
index ba5745abd..01c26344d 100644
--- a/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.spec.ts
+++ b/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.spec.ts
@@ -1,7 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { SEARCH_TUTORIAL_STEPS } from '@shared/constants';
-import { TutorialStep } from '@shared/models';
+import { SEARCH_TUTORIAL_STEPS } from '@osf/shared/constants/search-tutorial-steps.const';
+import { TutorialStep } from '@shared/models/tutorial-step.model';
import { SearchHelpTutorialComponent } from './search-help-tutorial.component';
diff --git a/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.ts b/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.ts
index ac46c14a4..bc4d90aa4 100644
--- a/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.ts
+++ b/src/app/shared/components/search-help-tutorial/search-help-tutorial.component.ts
@@ -2,17 +2,17 @@ import { TranslatePipe } from '@ngx-translate/core';
import { Button } from 'primeng/button';
-import { CommonModule } from '@angular/common';
+import { NgStyle } from '@angular/common';
import { ChangeDetectionStrategy, Component, inject, model, signal } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
-import { SEARCH_TUTORIAL_STEPS } from '@osf/shared/constants';
-import { TutorialStep } from '@osf/shared/models';
-import { IS_MEDIUM } from '@shared/helpers';
+import { SEARCH_TUTORIAL_STEPS } from '@osf/shared/constants/search-tutorial-steps.const';
+import { IS_MEDIUM } from '@osf/shared/helpers/breakpoints.tokens';
+import { TutorialStep } from '@shared/models/tutorial-step.model';
@Component({
selector: 'osf-search-help-tutorial',
- imports: [Button, TranslatePipe, CommonModule],
+ imports: [Button, TranslatePipe, NgStyle],
templateUrl: './search-help-tutorial.component.html',
styleUrl: './search-help-tutorial.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
diff --git a/src/app/shared/components/search-input/search-input.component.spec.ts b/src/app/shared/components/search-input/search-input.component.spec.ts
index d77f68456..cbe1ef082 100644
--- a/src/app/shared/components/search-input/search-input.component.spec.ts
+++ b/src/app/shared/components/search-input/search-input.component.spec.ts
@@ -1,6 +1,10 @@
+import { MockComponent } from 'ng-mocks';
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FormControl } from '@angular/forms';
+import { IconComponent } from '../icon/icon.component';
+
import { SearchInputComponent } from './search-input.component';
describe('SearchInputComponent', () => {
@@ -9,7 +13,7 @@ describe('SearchInputComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [SearchInputComponent],
+ imports: [SearchInputComponent, MockComponent(IconComponent)],
}).compileComponents();
fixture = TestBed.createComponent(SearchInputComponent);
diff --git a/src/app/shared/components/search-results-container/search-results-container.component.spec.ts b/src/app/shared/components/search-results-container/search-results-container.component.spec.ts
index cd9935688..91206fd6e 100644
--- a/src/app/shared/components/search-results-container/search-results-container.component.spec.ts
+++ b/src/app/shared/components/search-results-container/search-results-container.component.spec.ts
@@ -1,7 +1,13 @@
+import { MockComponents } from 'ng-mocks';
+
import { ComponentRef } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ResourceType } from '@shared/enums';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+
+import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';
+import { ResourceCardComponent } from '../resource-card/resource-card.component';
+import { SelectComponent } from '../select/select.component';
import { SearchResultsContainerComponent } from './search-results-container.component';
@@ -14,7 +20,11 @@ describe('SearchResultsContainerComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [SearchResultsContainerComponent, OSFTestingModule],
+ imports: [
+ SearchResultsContainerComponent,
+ OSFTestingModule,
+ ...MockComponents(ResourceCardComponent, SelectComponent, LoadingSpinnerComponent),
+ ],
}).compileComponents();
fixture = TestBed.createComponent(SearchResultsContainerComponent);
diff --git a/src/app/shared/components/search-results-container/search-results-container.component.ts b/src/app/shared/components/search-results-container/search-results-container.component.ts
index 39d24c5cb..507311b46 100644
--- a/src/app/shared/components/search-results-container/search-results-container.component.ts
+++ b/src/app/shared/components/search-results-container/search-results-container.component.ts
@@ -18,9 +18,11 @@ import {
import { FormsModule } from '@angular/forms';
import { PreprintProviderDetails } from '@osf/features/preprints/models';
-import { searchSortingOptions } from '@osf/shared/constants';
-import { ResourceType } from '@osf/shared/enums';
-import { DiscoverableFilter, FilterOption, ResourceModel, TabOption } from '@osf/shared/models';
+import { searchSortingOptions } from '@osf/shared/constants/search-sort-options.const';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { DiscoverableFilter, FilterOption } from '@shared/models/search/discaverable-filter.model';
+import { ResourceModel } from '@shared/models/search/resource.model';
+import { TabOption } from '@shared/models/tab-option.model';
import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';
import { ResourceCardComponent } from '../resource-card/resource-card.component';
diff --git a/src/app/shared/components/select/select.component.html b/src/app/shared/components/select/select.component.html
index 75ceb01cb..a6ddb6200 100644
--- a/src/app/shared/components/select/select.component.html
+++ b/src/app/shared/components/select/select.component.html
@@ -12,10 +12,10 @@
[loading]="loading()"
>
- {{ selectedOption.label | translate }}
+ {{ selectedOption.label | fixSpecialChar | translate }}
- {{ item.label | translate }}
+ {{ item.label | fixSpecialChar | translate }}
diff --git a/src/app/shared/components/select/select.component.spec.ts b/src/app/shared/components/select/select.component.spec.ts
index 74845d3d0..273c86ec2 100644
--- a/src/app/shared/components/select/select.component.spec.ts
+++ b/src/app/shared/components/select/select.component.spec.ts
@@ -1,7 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { Primitive } from '@shared/helpers';
-import { SelectOption } from '@shared/models';
+import { SelectOption } from '@shared/models/select-option.model';
import { SelectComponent } from './select.component';
diff --git a/src/app/shared/components/select/select.component.ts b/src/app/shared/components/select/select.component.ts
index 0f0d87a05..9478cdfa8 100644
--- a/src/app/shared/components/select/select.component.ts
+++ b/src/app/shared/components/select/select.component.ts
@@ -5,12 +5,13 @@ import { Select } from 'primeng/select';
import { ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';
import { FormsModule } from '@angular/forms';
-import { Primitive } from '@osf/shared/helpers';
-import { SelectOption } from '@osf/shared/models';
+import { Primitive } from '@osf/shared/helpers/types.helper';
+import { SelectOption } from '@osf/shared/models/select-option.model';
+import { FixSpecialCharPipe } from '@osf/shared/pipes/fix-special-char.pipe';
@Component({
selector: 'osf-select',
- imports: [FormsModule, Select, TranslatePipe],
+ imports: [FormsModule, Select, TranslatePipe, FixSpecialCharPipe],
templateUrl: './select.component.html',
styleUrl: './select.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
diff --git a/src/app/shared/components/socials-share-button/socials-share-button.component.spec.ts b/src/app/shared/components/socials-share-button/socials-share-button.component.spec.ts
index d13d418b0..036d5acea 100644
--- a/src/app/shared/components/socials-share-button/socials-share-button.component.spec.ts
+++ b/src/app/shared/components/socials-share-button/socials-share-button.component.spec.ts
@@ -3,8 +3,8 @@ import { MockComponent, MockPipe, MockProvider } from 'ng-mocks';
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ResourceType } from '@osf/shared/enums';
-import { SocialShareService } from '@osf/shared/services';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { SocialShareService } from '@osf/shared/services/social-share.service';
import { IconComponent } from '../icon/icon.component';
diff --git a/src/app/shared/components/socials-share-button/socials-share-button.component.ts b/src/app/shared/components/socials-share-button/socials-share-button.component.ts
index 5906560d6..23ed332eb 100644
--- a/src/app/shared/components/socials-share-button/socials-share-button.component.ts
+++ b/src/app/shared/components/socials-share-button/socials-share-button.component.ts
@@ -6,9 +6,9 @@ import { Tooltip } from 'primeng/tooltip';
import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
-import { ResourceType } from '@osf/shared/enums';
-import { SocialShareContentModel } from '@osf/shared/models';
-import { SocialShareService } from '@osf/shared/services';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { SocialShareContentModel } from '@osf/shared/models/socials/social-share-content.model';
+import { SocialShareService } from '@osf/shared/services/social-share.service';
import { IconComponent } from '../icon/icon.component';
diff --git a/src/app/shared/components/statistic-card/statistic-card.component.ts b/src/app/shared/components/statistic-card/statistic-card.component.ts
index d549716ba..dfadbb826 100644
--- a/src/app/shared/components/statistic-card/statistic-card.component.ts
+++ b/src/app/shared/components/statistic-card/statistic-card.component.ts
@@ -1,6 +1,6 @@
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
-import { Primitive } from '@shared/helpers';
+import { Primitive } from '@osf/shared/helpers/types.helper';
@Component({
selector: 'osf-statistic-card',
diff --git a/src/app/shared/components/status-badge/status-badge.component.spec.ts b/src/app/shared/components/status-badge/status-badge.component.spec.ts
index 589b06267..732b6d463 100644
--- a/src/app/shared/components/status-badge/status-badge.component.spec.ts
+++ b/src/app/shared/components/status-badge/status-badge.component.spec.ts
@@ -1,6 +1,6 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { RegistryStatus } from '@osf/shared/enums';
+import { RegistryStatus } from '@osf/shared/enums/registry-status.enum';
import { StatusBadgeComponent } from './status-badge.component';
diff --git a/src/app/shared/components/status-badge/status-badge.component.ts b/src/app/shared/components/status-badge/status-badge.component.ts
index dfcc56bd8..39e13c512 100644
--- a/src/app/shared/components/status-badge/status-badge.component.ts
+++ b/src/app/shared/components/status-badge/status-badge.component.ts
@@ -4,9 +4,9 @@ import { Tag } from 'primeng/tag';
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
-import { RegistryStatusMap } from '@osf/shared/constants';
-import { RegistryStatus } from '@osf/shared/enums';
-import { SeverityType } from '@osf/shared/models';
+import { RegistryStatusMap } from '@osf/shared/constants/registration-statuses';
+import { RegistryStatus } from '@osf/shared/enums/registry-status.enum';
+import { SeverityType } from '@shared/models/severity.type';
@Component({
selector: 'osf-status-badge',
diff --git a/src/app/shared/components/stepper/stepper.component.spec.ts b/src/app/shared/components/stepper/stepper.component.spec.ts
index e92a8f7b5..aa1550679 100644
--- a/src/app/shared/components/stepper/stepper.component.spec.ts
+++ b/src/app/shared/components/stepper/stepper.component.spec.ts
@@ -1,7 +1,12 @@
+import { MockComponent } from 'ng-mocks';
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { StepperComponent } from '@shared/components';
-import { StepOption } from '@shared/models';
+import { StepOption } from '@shared/models/step-option.model';
+
+import { IconComponent } from '../icon/icon.component';
+
+import { StepperComponent } from './stepper.component';
describe('StepperComponent', () => {
let component: StepperComponent;
@@ -17,7 +22,7 @@ describe('StepperComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [StepperComponent],
+ imports: [StepperComponent, MockComponent(IconComponent)],
}).compileComponents();
fixture = TestBed.createComponent(StepperComponent);
diff --git a/src/app/shared/components/stepper/stepper.component.ts b/src/app/shared/components/stepper/stepper.component.ts
index 9b9ea5f11..382fe0e74 100644
--- a/src/app/shared/components/stepper/stepper.component.ts
+++ b/src/app/shared/components/stepper/stepper.component.ts
@@ -2,7 +2,7 @@ import { TranslatePipe } from '@ngx-translate/core';
import { ChangeDetectionStrategy, Component, input, model } from '@angular/core';
-import { StepOption } from '@shared/models';
+import { StepOption } from '@shared/models/step-option.model';
import { IconComponent } from '../icon/icon.component';
diff --git a/src/app/shared/components/sub-header/sub-header.component.spec.ts b/src/app/shared/components/sub-header/sub-header.component.spec.ts
index a8fd72506..fadd15d00 100644
--- a/src/app/shared/components/sub-header/sub-header.component.spec.ts
+++ b/src/app/shared/components/sub-header/sub-header.component.spec.ts
@@ -1,5 +1,11 @@
+import { MockPipes } from 'ng-mocks';
+
+import { SafeHtmlPipe } from 'primeng/menu';
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FixSpecialCharPipe } from '@osf/shared/pipes/fix-special-char.pipe';
+
import { SubHeaderComponent } from './sub-header.component';
describe('SubHeaderComponent', () => {
@@ -8,7 +14,7 @@ describe('SubHeaderComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [SubHeaderComponent],
+ imports: [SubHeaderComponent, ...MockPipes(SafeHtmlPipe, FixSpecialCharPipe)],
}).compileComponents();
fixture = TestBed.createComponent(SubHeaderComponent);
diff --git a/src/app/shared/components/sub-header/sub-header.component.ts b/src/app/shared/components/sub-header/sub-header.component.ts
index 62649318c..e0150cc8f 100644
--- a/src/app/shared/components/sub-header/sub-header.component.ts
+++ b/src/app/shared/components/sub-header/sub-header.component.ts
@@ -5,7 +5,7 @@ import { Tooltip } from 'primeng/tooltip';
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
-import { FixSpecialCharPipe } from '@osf/shared/pipes';
+import { FixSpecialCharPipe } from '@osf/shared/pipes/fix-special-char.pipe';
@Component({
selector: 'osf-sub-header',
diff --git a/src/app/shared/components/subjects-list/subjects-list.component.html b/src/app/shared/components/subjects-list/subjects-list.component.html
new file mode 100644
index 000000000..6afb23da7
--- /dev/null
+++ b/src/app/shared/components/subjects-list/subjects-list.component.html
@@ -0,0 +1,11 @@
+
+ @if (isLoading()) {
+
+ } @else {
+ @for (subject of subjects(); track subject.id) {
+
+ } @empty {
+ {{ 'common.labels.none' | translate }}
+ }
+ }
+
diff --git a/src/app/shared/components/subjects-list/subjects-list.component.scss b/src/app/shared/components/subjects-list/subjects-list.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/shared/components/subjects-list/subjects-list.component.spec.ts b/src/app/shared/components/subjects-list/subjects-list.component.spec.ts
new file mode 100644
index 000000000..9033cb5ea
--- /dev/null
+++ b/src/app/shared/components/subjects-list/subjects-list.component.spec.ts
@@ -0,0 +1,67 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+
+import { SubjectsListComponent } from './subjects-list.component';
+
+import { SUBJECTS_MOCK } from '@testing/mocks/subject.mock';
+import { OSFTestingModule } from '@testing/osf.testing.module';
+
+describe('SubjectsListComponent', () => {
+ let component: SubjectsListComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SubjectsListComponent, OSFTestingModule],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(SubjectsListComponent);
+ component = fixture.componentInstance;
+ });
+
+ it('should have default input values', () => {
+ expect(component.subjects()).toEqual([]);
+ expect(component.isLoading()).toBe(false);
+ });
+
+ it('should set subjects input correctly', () => {
+ fixture.componentRef.setInput('subjects', SUBJECTS_MOCK);
+ expect(component.subjects()).toEqual(SUBJECTS_MOCK);
+ });
+
+ it('should set isLoading input correctly', () => {
+ fixture.componentRef.setInput('isLoading', true);
+ expect(component.isLoading()).toBe(true);
+ });
+
+ it('should render subjects when subjects array has items and isLoading is false', () => {
+ fixture.componentRef.setInput('subjects', SUBJECTS_MOCK);
+ fixture.componentRef.setInput('isLoading', false);
+ fixture.detectChanges();
+
+ const tagElements = fixture.debugElement.queryAll(By.css('p-tag'));
+ expect(tagElements.length).toBe(2);
+ });
+
+ it('should render none message when subjects array is empty and isLoading is false', () => {
+ fixture.componentRef.setInput('subjects', []);
+ fixture.componentRef.setInput('isLoading', false);
+ fixture.detectChanges();
+
+ const messageElement = fixture.debugElement.query(By.css('p'));
+ expect(messageElement).toBeTruthy();
+ expect(messageElement.nativeElement.textContent).toContain('common.labels.none');
+ });
+
+ it('should show skeleton and not subjects when isLoading is true', () => {
+ fixture.componentRef.setInput('subjects', SUBJECTS_MOCK);
+ fixture.componentRef.setInput('isLoading', true);
+ fixture.detectChanges();
+
+ const skeleton = fixture.debugElement.query(By.css('p-skeleton'));
+ const tagElements = fixture.debugElement.queryAll(By.css('p-tag'));
+
+ expect(skeleton).toBeTruthy();
+ expect(tagElements.length).toBe(0);
+ });
+});
diff --git a/src/app/shared/components/subjects-list/subjects-list.component.ts b/src/app/shared/components/subjects-list/subjects-list.component.ts
new file mode 100644
index 000000000..0927a649c
--- /dev/null
+++ b/src/app/shared/components/subjects-list/subjects-list.component.ts
@@ -0,0 +1,20 @@
+import { TranslatePipe } from '@ngx-translate/core';
+
+import { Skeleton } from 'primeng/skeleton';
+import { Tag } from 'primeng/tag';
+
+import { ChangeDetectionStrategy, Component, input } from '@angular/core';
+
+import { SubjectModel } from '@osf/shared/models/subject/subject.model';
+
+@Component({
+ selector: 'osf-subjects-list',
+ imports: [Tag, Skeleton, TranslatePipe],
+ templateUrl: './subjects-list.component.html',
+ styleUrl: './subjects-list.component.scss',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class SubjectsListComponent {
+ subjects = input([]);
+ isLoading = input(false);
+}
diff --git a/src/app/shared/components/subjects/subjects.component.spec.ts b/src/app/shared/components/subjects/subjects.component.spec.ts
index 54b62ea68..29e8a7866 100644
--- a/src/app/shared/components/subjects/subjects.component.spec.ts
+++ b/src/app/shared/components/subjects/subjects.component.spec.ts
@@ -1,7 +1,13 @@
+import { MockComponent } from 'ng-mocks';
+
+import { signal } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { SubjectModel } from '@osf/shared/models/subject/subject.model';
import { SubjectsSelectors } from '@osf/shared/stores/subjects';
+import { SearchInputComponent } from '../search-input/search-input.component';
+
import { SubjectsComponent } from './subjects.component';
import { OSFTestingStoreModule } from '@testing/osf.testing.module';
@@ -11,16 +17,40 @@ describe('SubjectsComponent', () => {
let component: SubjectsComponent;
let fixture: ComponentFixture;
+ const mockParentSubject: SubjectModel = {
+ id: 'parent-1',
+ name: 'Parent Subject',
+ children: [],
+ parent: null,
+ };
+
+ const mockChildSubject: SubjectModel = {
+ id: 'child-1',
+ name: 'Child Subject',
+ children: [],
+ parent: mockParentSubject,
+ };
+
+ const mockSubjectWithChildren: SubjectModel = {
+ id: 'parent-2',
+ name: 'Parent with Children',
+ children: [mockChildSubject],
+ parent: null,
+ };
+
+ const mockSubjects: SubjectModel[] = [mockParentSubject, mockSubjectWithChildren];
+ const mockSearchedSubjects: SubjectModel[] = [mockChildSubject];
+
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [SubjectsComponent, OSFTestingStoreModule],
+ imports: [SubjectsComponent, OSFTestingStoreModule, MockComponent(SearchInputComponent)],
providers: [
provideMockStore({
signals: [
- { selector: SubjectsSelectors.getSubjects, value: [] },
- { selector: SubjectsSelectors.getSubjectsLoading, value: false },
- { selector: SubjectsSelectors.getSearchedSubjects, value: [] },
- { selector: SubjectsSelectors.getSearchedSubjectsLoading, value: false },
+ { selector: SubjectsSelectors.getSubjects, value: signal(mockSubjects) },
+ { selector: SubjectsSelectors.getSubjectsLoading, value: signal(false) },
+ { selector: SubjectsSelectors.getSearchedSubjects, value: signal(mockSearchedSubjects) },
+ { selector: SubjectsSelectors.getSearchedSubjectsLoading, value: signal(false) },
],
}),
],
@@ -28,17 +58,232 @@ describe('SubjectsComponent', () => {
fixture = TestBed.createComponent(SubjectsComponent);
component = fixture.componentInstance;
- fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
- it('should render with label and description', () => {
- const headerElement = fixture.nativeElement.querySelector('h2');
- expect(headerElement.textContent).toEqual('shared.subjects.title');
- const descriptionElement = fixture.nativeElement.querySelector('p');
- expect(descriptionElement.textContent).toEqual('shared.subjects.description');
+ it('should initialize FormControl with empty string', () => {
+ expect(component.searchControl.value).toBe('');
+ });
+
+ it('should have default areSubjectsUpdating input value as false', () => {
+ expect(component.areSubjectsUpdating()).toBe(false);
+ });
+
+ it('should have default selected input value as empty array', () => {
+ expect(component.selected()).toEqual([]);
+ });
+
+ it('should have default readonly input value as false', () => {
+ expect(component.readonly()).toBe(false);
+ });
+
+ it('should set areSubjectsUpdating input correctly', () => {
+ fixture.componentRef.setInput('areSubjectsUpdating', true);
+ expect(component.areSubjectsUpdating()).toBe(true);
+ });
+
+ it('should set selected input correctly', () => {
+ const selectedSubjects = [mockParentSubject];
+ fixture.componentRef.setInput('selected', selectedSubjects);
+ expect(component.selected()).toEqual(selectedSubjects);
+ });
+
+ it('should set readonly input correctly', () => {
+ fixture.componentRef.setInput('readonly', true);
+ expect(component.readonly()).toBe(true);
+ });
+
+ it('should compute subjectsTree correctly', () => {
+ fixture.detectChanges();
+ const tree = component.subjectsTree();
+ expect(tree.length).toBe(2);
+ expect(tree[0].label).toBe('Parent Subject');
+ expect(tree[0].data).toBe(mockParentSubject);
+ expect(tree[0].key).toBe('parent-1');
+ expect(tree[1].children?.length).toBe(1);
+ });
+
+ it('should compute selectedTree correctly', () => {
+ fixture.componentRef.setInput('selected', [mockParentSubject]);
+ fixture.detectChanges();
+ const tree = component.selectedTree();
+ expect(tree.length).toBe(1);
+ expect(tree[0].label).toBe('Parent Subject');
+ expect(tree[0].data).toBe(mockParentSubject);
+ });
+
+ it('should compute searchedList correctly with parents', () => {
+ fixture.detectChanges();
+ const list = component.searchedList();
+ expect(list.length).toBe(1);
+ expect(list[0].length).toBeGreaterThan(0);
+ expect(list[0][list[0].length - 1]).toBe(mockChildSubject);
+ });
+
+ it('should compute childrenIdsMap correctly', () => {
+ fixture.detectChanges();
+ const map = component.childrenIdsMap();
+ expect(map).toBeDefined();
+ expect(typeof map).toBe('object');
+ });
+
+ it('should update expanded state and emit loadChildren when loadNode is called with empty children', () => {
+ const emitSpy = jest.spyOn(component.loadChildren, 'emit');
+ const mockTreeNode = {
+ data: { id: 'parent-1', children: [] },
+ } as any;
+
+ component.loadNode(mockTreeNode);
+
+ expect(component.expanded['parent-1']).toBe(true);
+ expect(emitSpy).toHaveBeenCalledWith('parent-1');
+ });
+
+ it('should not emit loadChildren when loadNode is called with non-empty children', () => {
+ const emitSpy = jest.spyOn(component.loadChildren, 'emit');
+ const mockTreeNode = {
+ data: { id: 'parent-2', children: [mockChildSubject] },
+ } as any;
+
+ component.loadNode(mockTreeNode);
+
+ expect(component.expanded['parent-2']).toBe(true);
+ expect(emitSpy).not.toHaveBeenCalled();
+ });
+
+ it('should update expanded state when collapseNode is called', () => {
+ component.expanded['parent-1'] = true;
+ const mockTreeNode = {
+ data: { id: 'parent-1' },
+ } as any;
+
+ component.collapseNode(mockTreeNode);
+
+ expect(component.expanded['parent-1']).toBe(false);
+ });
+
+ it('should emit updateSelection when selectSubject is called and readonly is false', () => {
+ const emitSpy = jest.spyOn(component.updateSelection, 'emit');
+ fixture.componentRef.setInput('readonly', false);
+ fixture.detectChanges();
+
+ component.selectSubject(mockParentSubject);
+
+ expect(emitSpy).toHaveBeenCalled();
+ });
+
+ it('should not emit updateSelection when selectSubject is called and readonly is true', () => {
+ const emitSpy = jest.spyOn(component.updateSelection, 'emit');
+ fixture.componentRef.setInput('readonly', true);
+ fixture.detectChanges();
+
+ component.selectSubject(mockParentSubject);
+
+ expect(emitSpy).not.toHaveBeenCalled();
+ });
+
+ it('should emit updateSelection when removeSubject is called and readonly is false', () => {
+ const emitSpy = jest.spyOn(component.updateSelection, 'emit');
+ fixture.componentRef.setInput('selected', [mockParentSubject]);
+ fixture.componentRef.setInput('readonly', false);
+ fixture.detectChanges();
+
+ component.removeSubject(mockParentSubject);
+
+ expect(emitSpy).toHaveBeenCalled();
+ });
+
+ it('should not emit updateSelection when removeSubject is called and readonly is true', () => {
+ const emitSpy = jest.spyOn(component.updateSelection, 'emit');
+ fixture.componentRef.setInput('selected', [mockParentSubject]);
+ fixture.componentRef.setInput('readonly', true);
+ fixture.detectChanges();
+
+ component.removeSubject(mockParentSubject);
+
+ expect(emitSpy).not.toHaveBeenCalled();
+ });
+
+ it('should emit updateSelection when selectSearched is called with checked true', () => {
+ const emitSpy = jest.spyOn(component.updateSelection, 'emit');
+ fixture.componentRef.setInput('readonly', false);
+ fixture.detectChanges();
+
+ const mockEvent = {
+ checked: true,
+ } as any;
+
+ component.selectSearched(mockEvent, [mockParentSubject]);
+
+ expect(emitSpy).toHaveBeenCalled();
+ });
+
+ it('should emit updateSelection when selectSearched is called with checked false', () => {
+ const emitSpy = jest.spyOn(component.updateSelection, 'emit');
+ fixture.componentRef.setInput('selected', [mockParentSubject]);
+ fixture.componentRef.setInput('readonly', false);
+ fixture.detectChanges();
+
+ const mockEvent = {
+ checked: false,
+ } as any;
+
+ component.selectSearched(mockEvent, [mockParentSubject]);
+
+ expect(emitSpy).toHaveBeenCalled();
+ });
+
+ it('should not emit updateSelection when selectSearched is called and readonly is true', () => {
+ const emitSpy = jest.spyOn(component.updateSelection, 'emit');
+ fixture.componentRef.setInput('readonly', true);
+ fixture.detectChanges();
+
+ const mockEvent = {
+ checked: true,
+ } as any;
+
+ component.selectSearched(mockEvent, [mockParentSubject]);
+
+ expect(emitSpy).not.toHaveBeenCalled();
+ });
+
+ it('should return true for isChecked when all subjects are selected', () => {
+ fixture.componentRef.setInput('selected', [mockParentSubject, mockChildSubject]);
+ fixture.detectChanges();
+
+ const result = component.isChecked([mockParentSubject, mockChildSubject]);
+
+ expect(result).toBe(true);
+ });
+
+ it('should return false for isChecked when not all subjects are selected', () => {
+ fixture.componentRef.setInput('selected', [mockParentSubject]);
+ fixture.detectChanges();
+
+ const result = component.isChecked([mockParentSubject, mockChildSubject]);
+
+ expect(result).toBe(false);
+ });
+
+ it('should return false for isChecked when subjects array is empty', () => {
+ fixture.detectChanges();
+
+ const result = component.isChecked([]);
+
+ expect(result).toBe(false);
+ });
+
+ it('should emit searchChanged with debounce when searchControl value changes', () => {
+ jest.useFakeTimers();
+ const emitSpy = jest.spyOn(component.searchChanged, 'emit');
+
+ component.searchControl.setValue('test search');
+ jest.advanceTimersByTime(300);
+
+ expect(emitSpy).toHaveBeenCalledWith('test search');
+ jest.useRealTimers();
});
});
diff --git a/src/app/shared/components/subjects/subjects.component.ts b/src/app/shared/components/subjects/subjects.component.ts
index 63f86297b..966742a8b 100644
--- a/src/app/shared/components/subjects/subjects.component.ts
+++ b/src/app/shared/components/subjects/subjects.component.ts
@@ -14,7 +14,7 @@ import { debounceTime, distinctUntilChanged } from 'rxjs';
import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';
import { FormControl, FormsModule } from '@angular/forms';
-import { SubjectModel } from '@osf/shared/models';
+import { SubjectModel } from '@osf/shared/models/subject/subject.model';
import { SubjectsSelectors } from '@osf/shared/stores/subjects';
import { SearchInputComponent } from '../search-input/search-input.component';
diff --git a/src/app/shared/components/tags-list/tags-list.component.html b/src/app/shared/components/tags-list/tags-list.component.html
new file mode 100644
index 000000000..69ea7d7ec
--- /dev/null
+++ b/src/app/shared/components/tags-list/tags-list.component.html
@@ -0,0 +1,11 @@
+
+ @if (isLoading()) {
+
+ } @else {
+ @for (tag of tags(); track tag) {
+
+ } @empty {
+ {{ 'project.overview.metadata.noTags' | translate }}
+ }
+ }
+
diff --git a/src/app/shared/components/tags-list/tags-list.component.scss b/src/app/shared/components/tags-list/tags-list.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/shared/components/tags-list/tags-list.component.spec.ts b/src/app/shared/components/tags-list/tags-list.component.spec.ts
new file mode 100644
index 000000000..7ace3f459
--- /dev/null
+++ b/src/app/shared/components/tags-list/tags-list.component.spec.ts
@@ -0,0 +1,65 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+
+import { TagsListComponent } from './tags-list.component';
+
+import { OSFTestingModule } from '@testing/osf.testing.module';
+
+describe('TagsListComponent', () => {
+ let component: TagsListComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [TagsListComponent, OSFTestingModule],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(TagsListComponent);
+ component = fixture.componentInstance;
+ });
+
+ it('should have default input values', () => {
+ expect(component.tags()).toEqual([]);
+ expect(component.isLoading()).toBe(false);
+ });
+
+ it('should set tags input correctly', () => {
+ const mockTags = ['tag1', 'tag2', 'tag3'];
+ fixture.componentRef.setInput('tags', mockTags);
+ expect(component.tags()).toEqual(mockTags);
+ });
+
+ it('should set isLoading input correctly', () => {
+ fixture.componentRef.setInput('isLoading', true);
+ expect(component.isLoading()).toBe(true);
+ });
+
+ it('should render tags when tags array has items and isLoading is false', () => {
+ const mockTags = ['tag1', 'tag2', 'tag3'];
+ fixture.componentRef.setInput('tags', mockTags);
+ fixture.componentRef.setInput('isLoading', false);
+ fixture.detectChanges();
+
+ const tagElements = fixture.debugElement.queryAll(By.css('p-tag'));
+ expect(tagElements.length).toBe(3);
+ });
+
+ it('should have tagClick output defined', () => {
+ expect(component.tagClick).toBeDefined();
+ });
+
+ it('should emit tagClick with correct tag value when tag is clicked', () => {
+ const mockTags = ['tag1', 'tag2', 'tag3'];
+ fixture.componentRef.setInput('tags', mockTags);
+ fixture.componentRef.setInput('isLoading', false);
+ fixture.detectChanges();
+
+ const emitSpy = jest.spyOn(component.tagClick, 'emit');
+ const tagElements = fixture.debugElement.queryAll(By.css('p-tag'));
+
+ tagElements[0].triggerEventHandler('click', null);
+
+ expect(emitSpy).toHaveBeenCalledTimes(1);
+ expect(emitSpy).toHaveBeenCalledWith('tag1');
+ });
+});
diff --git a/src/app/shared/components/tags-list/tags-list.component.ts b/src/app/shared/components/tags-list/tags-list.component.ts
new file mode 100644
index 000000000..b1a3b4a56
--- /dev/null
+++ b/src/app/shared/components/tags-list/tags-list.component.ts
@@ -0,0 +1,23 @@
+import { TranslatePipe } from '@ngx-translate/core';
+
+import { Skeleton } from 'primeng/skeleton';
+import { Tag } from 'primeng/tag';
+
+import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
+
+@Component({
+ selector: 'osf-tags-list',
+ imports: [Tag, Skeleton, TranslatePipe],
+ templateUrl: './tags-list.component.html',
+ styleUrl: './tags-list.component.scss',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class TagsListComponent {
+ tags = input([]);
+ isLoading = input(false);
+ tagClick = output();
+
+ onTagClick(tag: string): void {
+ this.tagClick.emit(tag);
+ }
+}
diff --git a/src/app/shared/components/text-input/text-input.component.spec.ts b/src/app/shared/components/text-input/text-input.component.spec.ts
index 90a390777..a820f858b 100644
--- a/src/app/shared/components/text-input/text-input.component.spec.ts
+++ b/src/app/shared/components/text-input/text-input.component.spec.ts
@@ -1,8 +1,9 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FormControl, Validators } from '@angular/forms';
-import { INPUT_VALIDATION_MESSAGES } from '@osf/shared/constants';
-import { TextInputComponent } from '@shared/components';
+import { INPUT_VALIDATION_MESSAGES } from '@osf/shared/constants/input-validation-messages.const';
+
+import { TextInputComponent } from './text-input.component';
import { OSFTestingModule } from '@testing/osf.testing.module';
diff --git a/src/app/shared/components/text-input/text-input.component.ts b/src/app/shared/components/text-input/text-input.component.ts
index b1c708bb8..29156ae12 100644
--- a/src/app/shared/components/text-input/text-input.component.ts
+++ b/src/app/shared/components/text-input/text-input.component.ts
@@ -6,8 +6,8 @@ import { MessageModule } from 'primeng/message';
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
import { FormControl, ReactiveFormsModule } from '@angular/forms';
-import { INPUT_VALIDATION_MESSAGES } from '@osf/shared/constants';
-import { ValidationParams } from '@osf/shared/models';
+import { INPUT_VALIDATION_MESSAGES } from '@osf/shared/constants/input-validation-messages.const';
+import { ValidationParams } from '@shared/models/validation-params.model';
@Component({
selector: 'osf-text-input',
diff --git a/src/app/shared/components/toast/toast.component.spec.ts b/src/app/shared/components/toast/toast.component.spec.ts
index f70be3841..0a64d913c 100644
--- a/src/app/shared/components/toast/toast.component.spec.ts
+++ b/src/app/shared/components/toast/toast.component.spec.ts
@@ -4,11 +4,11 @@ import { ToastModule } from 'primeng/toast';
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ToastService } from '@shared/services';
+import { ToastService } from '@osf/shared/services/toast.service';
import { ToastComponent } from './toast.component';
-import { TranslateServiceMock } from '@testing/mocks';
+import { TranslateServiceMock } from '@testing/mocks/translate.service.mock';
describe('ToastComponent', () => {
let component: ToastComponent;
diff --git a/src/app/shared/components/truncated-text/truncated-text.component.spec.ts b/src/app/shared/components/truncated-text/truncated-text.component.spec.ts
index d953c0e85..cf1b72f87 100644
--- a/src/app/shared/components/truncated-text/truncated-text.component.spec.ts
+++ b/src/app/shared/components/truncated-text/truncated-text.component.spec.ts
@@ -2,7 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { TruncatedTextComponent } from './truncated-text.component';
-import { TranslateServiceMock } from '@testing/mocks';
+import { TranslateServiceMock } from '@testing/mocks/translate.service.mock';
describe('TruncatedTextComponent', () => {
let component: TruncatedTextComponent;
diff --git a/src/app/shared/components/truncated-text/truncated-text.component.ts b/src/app/shared/components/truncated-text/truncated-text.component.ts
index b6c7d3d10..d821033db 100644
--- a/src/app/shared/components/truncated-text/truncated-text.component.ts
+++ b/src/app/shared/components/truncated-text/truncated-text.component.ts
@@ -4,15 +4,25 @@ import { Button } from 'primeng/button';
import { timer } from 'rxjs';
-import { CommonModule } from '@angular/common';
-import { AfterViewInit, Component, effect, ElementRef, inject, input, signal, viewChild } from '@angular/core';
+import {
+ AfterViewInit,
+ Component,
+ DestroyRef,
+ effect,
+ ElementRef,
+ inject,
+ input,
+ signal,
+ viewChild,
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { Router } from '@angular/router';
@Component({
selector: 'osf-truncated-text',
+ imports: [TranslatePipe, Button],
templateUrl: './truncated-text.component.html',
styleUrls: ['./truncated-text.component.scss'],
- imports: [CommonModule, TranslatePipe, Button],
})
export class TruncatedTextComponent implements AfterViewInit {
readonly text = input('');
@@ -25,6 +35,7 @@ export class TruncatedTextComponent implements AfterViewInit {
readonly contentElement = viewChild('textContent');
private readonly router = inject(Router);
+ private readonly destroyRef = inject(DestroyRef);
isTextExpanded = signal(false);
hasOverflowingText = signal(false);
@@ -42,7 +53,9 @@ export class TruncatedTextComponent implements AfterViewInit {
const currentText = this.text();
if (currentText) {
this.isTextExpanded.set(false);
- timer(0).subscribe(() => this.checkTextOverflow());
+ timer(0)
+ .pipe(takeUntilDestroyed(this.destroyRef))
+ .subscribe(() => this.checkTextOverflow());
}
});
}
diff --git a/src/app/shared/components/view-only-table/view-only-table.component.spec.ts b/src/app/shared/components/view-only-table/view-only-table.component.spec.ts
index 308b86eb0..47a22eb90 100644
--- a/src/app/shared/components/view-only-table/view-only-table.component.spec.ts
+++ b/src/app/shared/components/view-only-table/view-only-table.component.spec.ts
@@ -2,12 +2,14 @@ import { MockComponent } from 'ng-mocks';
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { CopyButtonComponent } from '@shared/components';
-import { PaginatedViewOnlyLinksModel } from '@shared/models';
+import { PaginatedViewOnlyLinksModel } from '@shared/models/view-only-links/view-only-link.model';
+
+import { CopyButtonComponent } from '../copy-button/copy-button.component';
import { ViewOnlyTableComponent } from './view-only-table.component';
-import { MOCK_PAGINATED_VIEW_ONLY_LINKS, MOCK_VIEW_ONLY_LINK, TranslateServiceMock } from '@testing/mocks';
+import { TranslateServiceMock } from '@testing/mocks/translate.service.mock';
+import { MOCK_PAGINATED_VIEW_ONLY_LINKS, MOCK_VIEW_ONLY_LINK } from '@testing/mocks/view-only-link.mock';
describe('ViewOnlyTableComponent', () => {
let component: ViewOnlyTableComponent;
diff --git a/src/app/shared/components/view-only-table/view-only-table.component.ts b/src/app/shared/components/view-only-table/view-only-table.component.ts
index 974286825..c04b01b3c 100644
--- a/src/app/shared/components/view-only-table/view-only-table.component.ts
+++ b/src/app/shared/components/view-only-table/view-only-table.component.ts
@@ -9,7 +9,10 @@ import { DatePipe } from '@angular/common';
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
-import { PaginatedViewOnlyLinksModel, ViewOnlyLinkModel } from '@osf/shared/models';
+import {
+ PaginatedViewOnlyLinksModel,
+ ViewOnlyLinkModel,
+} from '@osf/shared/models/view-only-links/view-only-link.model';
import { CopyButtonComponent } from '../copy-button/copy-button.component';
diff --git a/src/app/shared/components/wiki/add-wiki-dialog/add-wiki-dialog.component.spec.ts b/src/app/shared/components/wiki/add-wiki-dialog/add-wiki-dialog.component.spec.ts
index 06ea0bf4d..be22defa6 100644
--- a/src/app/shared/components/wiki/add-wiki-dialog/add-wiki-dialog.component.spec.ts
+++ b/src/app/shared/components/wiki/add-wiki-dialog/add-wiki-dialog.component.spec.ts
@@ -1,18 +1,20 @@
import { Store } from '@ngxs/store';
-import { MockProvider } from 'ng-mocks';
+import { MockComponent, MockProvider } from 'ng-mocks';
import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ReactiveFormsModule } from '@angular/forms';
+import { ToastService } from '@osf/shared/services/toast.service';
import { WikiSelectors } from '@osf/shared/stores/wiki';
-import { ToastService } from '@shared/services';
+
+import { TextInputComponent } from '../../text-input/text-input.component';
import { AddWikiDialogComponent } from './add-wiki-dialog.component';
-import { MOCK_STORE, TranslateServiceMock } from '@testing/mocks';
+import { MOCK_STORE } from '@testing/mocks/mock-store.mock';
+import { TranslateServiceMock } from '@testing/mocks/translate.service.mock';
describe('AddWikiDialogComponent', () => {
let component: AddWikiDialogComponent;
@@ -27,7 +29,7 @@ describe('AddWikiDialogComponent', () => {
});
await TestBed.configureTestingModule({
- imports: [AddWikiDialogComponent, ReactiveFormsModule],
+ imports: [AddWikiDialogComponent, MockComponent(TextInputComponent)],
providers: [
TranslateServiceMock,
MockProvider(DynamicDialogRef),
diff --git a/src/app/shared/components/wiki/add-wiki-dialog/add-wiki-dialog.component.ts b/src/app/shared/components/wiki/add-wiki-dialog/add-wiki-dialog.component.ts
index 4e80244de..1a42cf2f8 100644
--- a/src/app/shared/components/wiki/add-wiki-dialog/add-wiki-dialog.component.ts
+++ b/src/app/shared/components/wiki/add-wiki-dialog/add-wiki-dialog.component.ts
@@ -8,10 +8,10 @@ import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
-import { InputLimits } from '@osf/shared/constants';
-import { ResourceType } from '@osf/shared/enums';
-import { CustomValidators } from '@osf/shared/helpers';
-import { ToastService } from '@osf/shared/services';
+import { InputLimits } from '@osf/shared/constants/input-limits.const';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { CustomValidators } from '@osf/shared/helpers/custom-form-validators.helper';
+import { ToastService } from '@osf/shared/services/toast.service';
import { CreateWiki, WikiSelectors } from '@osf/shared/stores/wiki';
import { TextInputComponent } from '../../text-input/text-input.component';
diff --git a/src/app/shared/components/wiki/compare-section/compare-section.component.spec.ts b/src/app/shared/components/wiki/compare-section/compare-section.component.spec.ts
index ea89c3925..45b8e8aec 100644
--- a/src/app/shared/components/wiki/compare-section/compare-section.component.spec.ts
+++ b/src/app/shared/components/wiki/compare-section/compare-section.component.spec.ts
@@ -1,12 +1,11 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { FormsModule } from '@angular/forms';
import { provideNoopAnimations } from '@angular/platform-browser/animations';
-import { WikiVersion } from '@shared/models';
+import { WikiVersion } from '@shared/models/wiki/wiki.model';
import { CompareSectionComponent } from './compare-section.component';
-import { TranslateServiceMock } from '@testing/mocks';
+import { TranslateServiceMock } from '@testing/mocks/translate.service.mock';
describe('CompareSectionComponent', () => {
let component: CompareSectionComponent;
@@ -30,7 +29,7 @@ describe('CompareSectionComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [CompareSectionComponent, FormsModule],
+ imports: [CompareSectionComponent],
providers: [TranslateServiceMock, provideNoopAnimations()],
}).compileComponents();
diff --git a/src/app/shared/components/wiki/compare-section/compare-section.component.ts b/src/app/shared/components/wiki/compare-section/compare-section.component.ts
index 36bd6d22a..6142ba17d 100644
--- a/src/app/shared/components/wiki/compare-section/compare-section.component.ts
+++ b/src/app/shared/components/wiki/compare-section/compare-section.component.ts
@@ -7,7 +7,7 @@ import { Skeleton } from 'primeng/skeleton';
import { ChangeDetectionStrategy, Component, computed, effect, input, output } from '@angular/core';
import { FormsModule } from '@angular/forms';
-import { WikiVersion } from '@osf/shared/models';
+import { WikiVersion } from '@osf/shared/models/wiki/wiki.model';
import * as Diff from 'diff';
diff --git a/src/app/shared/components/wiki/edit-section/edit-section.component.spec.ts b/src/app/shared/components/wiki/edit-section/edit-section.component.spec.ts
index 5eea079be..b9f9faa9b 100644
--- a/src/app/shared/components/wiki/edit-section/edit-section.component.spec.ts
+++ b/src/app/shared/components/wiki/edit-section/edit-section.component.spec.ts
@@ -2,7 +2,7 @@ import { MockProvider } from 'ng-mocks';
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { CustomDialogService } from '@shared/services';
+import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
import { EditSectionComponent } from './edit-section.component';
diff --git a/src/app/shared/components/wiki/edit-section/edit-section.component.ts b/src/app/shared/components/wiki/edit-section/edit-section.component.ts
index df05a7c9e..1a4d84894 100644
--- a/src/app/shared/components/wiki/edit-section/edit-section.component.ts
+++ b/src/app/shared/components/wiki/edit-section/edit-section.component.ts
@@ -8,7 +8,7 @@ import { Panel } from 'primeng/panel';
import { ChangeDetectionStrategy, Component, effect, inject, input, output } from '@angular/core';
import { FormsModule } from '@angular/forms';
-import { CustomDialogService } from '@osf/shared/services';
+import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
import 'ace-builds/src-noconflict/ext-language_tools';
diff --git a/src/app/shared/components/wiki/index.ts b/src/app/shared/components/wiki/index.ts
deleted file mode 100644
index 79047f684..000000000
--- a/src/app/shared/components/wiki/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export * from './add-wiki-dialog/add-wiki-dialog.component';
-export * from './compare-section/compare-section.component';
-export * from './edit-section/edit-section.component';
-export * from './view-section/view-section.component';
-export * from './wiki-list/wiki-list.component';
-export * from './wiki-syntax-help-dialog/wiki-syntax-help-dialog.component';
diff --git a/src/app/shared/components/wiki/view-section/view-section.component.spec.ts b/src/app/shared/components/wiki/view-section/view-section.component.spec.ts
index cc4b16ee1..7b8efd281 100644
--- a/src/app/shared/components/wiki/view-section/view-section.component.spec.ts
+++ b/src/app/shared/components/wiki/view-section/view-section.component.spec.ts
@@ -3,12 +3,13 @@ import { MockComponent } from 'ng-mocks';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { provideNoopAnimations } from '@angular/platform-browser/animations';
-import { MarkdownComponent } from '@shared/components';
-import { WikiVersion } from '@shared/models';
+import { WikiVersion } from '@shared/models/wiki/wiki.model';
+
+import { MarkdownComponent } from '../../markdown/markdown.component';
import { ViewSectionComponent } from './view-section.component';
-import { TranslateServiceMock } from '@testing/mocks';
+import { TranslateServiceMock } from '@testing/mocks/translate.service.mock';
describe('ViewSectionComponent', () => {
let component: ViewSectionComponent;
diff --git a/src/app/shared/components/wiki/view-section/view-section.component.ts b/src/app/shared/components/wiki/view-section/view-section.component.ts
index 45c33345c..1be0f88e9 100644
--- a/src/app/shared/components/wiki/view-section/view-section.component.ts
+++ b/src/app/shared/components/wiki/view-section/view-section.component.ts
@@ -7,7 +7,7 @@ import { Skeleton } from 'primeng/skeleton';
import { ChangeDetectionStrategy, Component, computed, effect, input, output, signal } from '@angular/core';
import { FormsModule } from '@angular/forms';
-import { WikiVersion } from '@osf/shared/models';
+import { WikiVersion } from '@osf/shared/models/wiki/wiki.model';
import { MarkdownComponent } from '../../markdown/markdown.component';
diff --git a/src/app/shared/components/wiki/wiki-list/wiki-list.component.spec.ts b/src/app/shared/components/wiki/wiki-list/wiki-list.component.spec.ts
index cd81c07c2..847a87c59 100644
--- a/src/app/shared/components/wiki/wiki-list/wiki-list.component.spec.ts
+++ b/src/app/shared/components/wiki/wiki-list/wiki-list.component.spec.ts
@@ -3,8 +3,10 @@ import { MockProvider } from 'ng-mocks';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { Router } from '@angular/router';
-import { ComponentWiki, Wiki, WikiItemType } from '@shared/models';
-import { CustomConfirmationService, CustomDialogService } from '@shared/services';
+import { CustomConfirmationService } from '@osf/shared/services/custom-confirmation.service';
+import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
+import { ComponentWiki, WikiModel } from '@shared/models/wiki/wiki.model';
+import { WikiItemType } from '@shared/models/wiki/wiki-type.model';
import { WikiListComponent } from './wiki-list.component';
@@ -20,7 +22,7 @@ describe('WikiListComponent', () => {
let mockCustomConfirmationService: ReturnType;
let mockRouter: ReturnType;
- const mockWikiList: Wiki[] = [
+ const mockWikiList: WikiModel[] = [
{ id: 'wiki1', name: 'Home', kind: 'Home content' },
{ id: 'wiki2', name: 'Getting Started', kind: 'Getting started content' },
{ id: 'wiki3', name: 'API Documentation', kind: 'API docs' },
diff --git a/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts b/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts
index f65d26d75..7c55dec8e 100644
--- a/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts
+++ b/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts
@@ -8,8 +8,12 @@ import { Skeleton } from 'primeng/skeleton';
import { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';
import { Router } from '@angular/router';
-import { ComponentWiki, Wiki, WikiItemType, WikiMenuItem } from '@osf/shared/models';
-import { CustomConfirmationService, CustomDialogService } from '@osf/shared/services';
+import { WikiModel } from '@osf/shared/models/wiki/wiki.model';
+import { WikiMenuItem } from '@osf/shared/models/wiki/wiki-menu.model';
+import { WikiItemType } from '@osf/shared/models/wiki/wiki-type.model';
+import { CustomConfirmationService } from '@osf/shared/services/custom-confirmation.service';
+import { CustomDialogService } from '@osf/shared/services/custom-dialog.service';
+import { ComponentWiki } from '@osf/shared/stores/wiki';
import { AddWikiDialogComponent } from '../add-wiki-dialog/add-wiki-dialog.component';
@@ -21,7 +25,7 @@ import { AddWikiDialogComponent } from '../add-wiki-dialog/add-wiki-dialog.compo
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class WikiListComponent {
- readonly list = input.required();
+ readonly list = input.required();
readonly resourceId = input.required();
readonly currentWikiId = input.required();
readonly componentsList = input.required();
diff --git a/src/app/shared/components/wiki/wiki-syntax-help-dialog/wiki-syntax-help-dialog.component.html b/src/app/shared/components/wiki/wiki-syntax-help-dialog/wiki-syntax-help-dialog.component.html
index 09b500b35..7b474041b 100644
--- a/src/app/shared/components/wiki/wiki-syntax-help-dialog/wiki-syntax-help-dialog.component.html
+++ b/src/app/shared/components/wiki/wiki-syntax-help-dialog/wiki-syntax-help-dialog.component.html
@@ -10,5 +10,5 @@
diff --git a/src/app/shared/components/wiki/wiki-syntax-help-dialog/wiki-syntax-help-dialog.component.spec.ts b/src/app/shared/components/wiki/wiki-syntax-help-dialog/wiki-syntax-help-dialog.component.spec.ts
index c172730b3..e5b1465de 100644
--- a/src/app/shared/components/wiki/wiki-syntax-help-dialog/wiki-syntax-help-dialog.component.spec.ts
+++ b/src/app/shared/components/wiki/wiki-syntax-help-dialog/wiki-syntax-help-dialog.component.spec.ts
@@ -6,7 +6,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { WikiSyntaxHelpDialogComponent } from './wiki-syntax-help-dialog.component';
-import { TranslateServiceMock } from '@testing/mocks';
+import { TranslateServiceMock } from '@testing/mocks/translate.service.mock';
describe('WikiSyntaxHelpDialogComponent', () => {
let component: WikiSyntaxHelpDialogComponent;
diff --git a/src/app/shared/constants/addon-terms.const.ts b/src/app/shared/constants/addon-terms.const.ts
index f69a2fe31..936331982 100644
--- a/src/app/shared/constants/addon-terms.const.ts
+++ b/src/app/shared/constants/addon-terms.const.ts
@@ -1,4 +1,4 @@
-import { Term } from '@shared/models';
+import { Term } from '../models/addons/addon-utils.models';
export const ADDON_TERMS: Term[] = [
{
diff --git a/src/app/shared/constants/addons-category-options.const.ts b/src/app/shared/constants/addons-category-options.const.ts
index 7d36a88f3..0db918573 100644
--- a/src/app/shared/constants/addons-category-options.const.ts
+++ b/src/app/shared/constants/addons-category-options.const.ts
@@ -1,5 +1,5 @@
import { AddonCategory } from '@shared/enums/addons-category.enum';
-import { SelectOption } from '@shared/models';
+import { SelectOption } from '@shared/models/select-option.model';
export const ADDON_CATEGORY_OPTIONS: SelectOption[] = [
{
diff --git a/src/app/shared/constants/addons-tab-options.const.ts b/src/app/shared/constants/addons-tab-options.const.ts
index 5f85df2f4..9db4a138c 100644
--- a/src/app/shared/constants/addons-tab-options.const.ts
+++ b/src/app/shared/constants/addons-tab-options.const.ts
@@ -1,5 +1,5 @@
import { AddonTabValue } from '@shared/enums/addon-tab.enum';
-import { SelectOption } from '@shared/models';
+import { SelectOption } from '@shared/models/select-option.model';
export const ADDON_TAB_OPTIONS: SelectOption[] = [
{
diff --git a/src/app/shared/constants/contributors.constants.ts b/src/app/shared/constants/contributors.constants.ts
index 8e4b5f474..420f852b3 100644
--- a/src/app/shared/constants/contributors.constants.ts
+++ b/src/app/shared/constants/contributors.constants.ts
@@ -1,5 +1,5 @@
-import { ContributorPermission } from '@osf/shared/enums';
-import { SelectOption } from '@osf/shared/models';
+import { ContributorPermission } from '@osf/shared/enums/contributors/contributor-permission.enum';
+import { SelectOption } from '@osf/shared/models/select-option.model';
export const PERMISSION_OPTIONS: SelectOption[] = [
{
diff --git a/src/app/shared/constants/default-citation-titles.const.ts b/src/app/shared/constants/default-citation-titles.const.ts
index 0f543dcc7..d0756f96f 100644
--- a/src/app/shared/constants/default-citation-titles.const.ts
+++ b/src/app/shared/constants/default-citation-titles.const.ts
@@ -1,4 +1,4 @@
-import { CitationTypes } from '@shared/enums';
+import { CitationTypes } from '../enums/citation-types.enum';
export const CITATION_TITLES: Record = {
[CitationTypes.APA]: 'APA',
diff --git a/src/app/shared/constants/default-table-params.constants.ts b/src/app/shared/constants/default-table-params.constants.ts
index fc16beb3b..228d306c8 100644
--- a/src/app/shared/constants/default-table-params.constants.ts
+++ b/src/app/shared/constants/default-table-params.constants.ts
@@ -1,4 +1,4 @@
-import { TableParameters } from '@shared/models';
+import { TableParameters } from '../models/table-parameters.model';
export const DEFAULT_TABLE_PARAMS: TableParameters = {
rows: 10,
diff --git a/src/app/shared/constants/index.ts b/src/app/shared/constants/index.ts
deleted file mode 100644
index 0fb592994..000000000
--- a/src/app/shared/constants/index.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-export * from './addon-terms.const';
-export * from './addons-category-options.const';
-export * from './addons-tab-options.const';
-export * from './built-in-citation-styles.const';
-export * from './contributors.constants';
-export * from './default-citation-titles.const';
-export * from './default-table-params.constants';
-export * from './files-limits.const';
-export * from './filter-placeholders';
-export * from './input-limits.const';
-export * from './input-validation-messages.const';
-export * from './language.const';
-export * from './pie-chart-palette';
-export * from './registration-statuses';
-export * from './registry-services-icons.const';
-export * from './resource-card-labels.const';
-export * from './resource-types.const';
-export * from './scientists.const';
-export * from './search-sort-options.const';
-export * from './search-tab-options.const';
-export * from './search-tutorial-steps.const';
-export * from './social-links.const';
-export * from './social-links.const';
-export * from './social-platforms.const';
-export * from './social-share.config';
-export * from './sort-options.const';
diff --git a/src/app/shared/constants/registration-statuses.ts b/src/app/shared/constants/registration-statuses.ts
index f57867033..d83bd52e5 100644
--- a/src/app/shared/constants/registration-statuses.ts
+++ b/src/app/shared/constants/registration-statuses.ts
@@ -1,5 +1,5 @@
-import { RegistryStatus } from '../enums';
-import { StatusInfo } from '../models';
+import { RegistryStatus } from '../enums/registry-status.enum';
+import { StatusInfo } from '../models/status-info.model';
export const RegistryStatusMap: Record = {
[RegistryStatus.None]: { label: '', severity: null },
diff --git a/src/app/shared/constants/resource-card-labels.const.ts b/src/app/shared/constants/resource-card-labels.const.ts
index 7b002e21c..ed6c45d67 100644
--- a/src/app/shared/constants/resource-card-labels.const.ts
+++ b/src/app/shared/constants/resource-card-labels.const.ts
@@ -1,4 +1,4 @@
-import { ResourceType } from '../enums';
+import { ResourceType } from '../enums/resource-type.enum';
export const CardLabelTranslationKeys: Partial> = {
[ResourceType.Project]: 'resourceCard.type.project',
diff --git a/src/app/shared/constants/search-tab-options.const.ts b/src/app/shared/constants/search-tab-options.const.ts
index 8e60c41a8..95211266d 100644
--- a/src/app/shared/constants/search-tab-options.const.ts
+++ b/src/app/shared/constants/search-tab-options.const.ts
@@ -1,5 +1,5 @@
-import { ResourceType } from '../enums';
-import { TabOption } from '../models';
+import { ResourceType } from '../enums/resource-type.enum';
+import { TabOption } from '../models/tab-option.model';
export const SEARCH_TAB_OPTIONS: TabOption[] = [
{ label: 'common.search.tabs.all', value: ResourceType.Null },
diff --git a/src/app/shared/constants/search-tutorial-steps.const.ts b/src/app/shared/constants/search-tutorial-steps.const.ts
index 14895ee02..f84de4dc7 100644
--- a/src/app/shared/constants/search-tutorial-steps.const.ts
+++ b/src/app/shared/constants/search-tutorial-steps.const.ts
@@ -1,4 +1,4 @@
-import { TutorialStep } from '../models';
+import { TutorialStep } from '../models/tutorial-step.model';
export const SEARCH_TUTORIAL_STEPS: TutorialStep[] = [
{
diff --git a/src/app/shared/constants/social-links.const.ts b/src/app/shared/constants/social-links.const.ts
index 56e3352f6..eb39182a2 100644
--- a/src/app/shared/constants/social-links.const.ts
+++ b/src/app/shared/constants/social-links.const.ts
@@ -1,4 +1,4 @@
-import { SocialLinksModel } from '../models';
+import { SocialLinksModel } from '../models/user/social-links.model';
export const SOCIAL_LINKS: SocialLinksModel[] = [
{
diff --git a/src/app/shared/constants/social-platforms.const.ts b/src/app/shared/constants/social-platforms.const.ts
index a1689fad3..9b594d681 100644
--- a/src/app/shared/constants/social-platforms.const.ts
+++ b/src/app/shared/constants/social-platforms.const.ts
@@ -1,4 +1,4 @@
-import { SocialPlatformConfig } from '../models';
+import { SocialPlatformConfig } from '../models/socials/social-platform-config.model';
export const SOCIAL_PLATFORMS: SocialPlatformConfig[] = [
{
diff --git a/src/app/shared/constants/sort-options.const.ts b/src/app/shared/constants/sort-options.const.ts
index 36485c0cf..338850799 100644
--- a/src/app/shared/constants/sort-options.const.ts
+++ b/src/app/shared/constants/sort-options.const.ts
@@ -1,5 +1,5 @@
-import { SortType } from '../enums';
-import { CustomOption } from '../models';
+import { SortType } from '../enums/sort-type.enum';
+import { CustomOption } from '../models/select-option.model';
export const ALL_SORT_OPTIONS: CustomOption[] = [
{
diff --git a/src/app/shared/directives/index.ts b/src/app/shared/directives/index.ts
deleted file mode 100644
index b08fc7ae2..000000000
--- a/src/app/shared/directives/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export { ClearFileDirective } from './clear-file.directive';
-export { ScrollTopOnRouteChangeDirective } from './scroll-top.directive';
-export { StopPropagationDirective } from './stop-propagation.directive';
diff --git a/src/app/shared/directives/scroll-top.directive.ts b/src/app/shared/directives/scroll-top.directive.ts
index ba9369496..bbd14ea78 100644
--- a/src/app/shared/directives/scroll-top.directive.ts
+++ b/src/app/shared/directives/scroll-top.directive.ts
@@ -1,6 +1,6 @@
import { filter } from 'rxjs';
-import { Directive, ElementRef, inject } from '@angular/core';
+import { DestroyRef, Directive, ElementRef, inject } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { NavigationEnd, Router } from '@angular/router';
@@ -10,12 +10,13 @@ import { NavigationEnd, Router } from '@angular/router';
export class ScrollTopOnRouteChangeDirective {
private el = inject(ElementRef);
private router = inject(Router);
+ private destroyRef = inject(DestroyRef);
constructor() {
this.router.events
.pipe(
filter((e) => e instanceof NavigationEnd),
- takeUntilDestroyed()
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(() => {
let route = this.router.routerState.root;
diff --git a/src/app/shared/enums/addon-service-names.enum.ts b/src/app/shared/enums/addon-service-names.enum.ts
index d0957f948..e4367b848 100644
--- a/src/app/shared/enums/addon-service-names.enum.ts
+++ b/src/app/shared/enums/addon-service-names.enum.ts
@@ -1,4 +1,5 @@
export enum AddonServiceNames {
+ azureblobstorage = 'Azure Blob Storage',
figshare = 'figshare',
onedrive = 'Onedrive',
dropbox = 'Dropbox',
diff --git a/src/app/shared/enums/contributors/index.ts b/src/app/shared/enums/contributors/index.ts
deleted file mode 100644
index 3f08f1f18..000000000
--- a/src/app/shared/enums/contributors/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export { AddContributorType } from './add-contributor-type.enum';
-export { AddDialogState } from './add-dialog-state.enum';
-export { ContributorPermission } from './contributor-permission.enum';
diff --git a/src/app/shared/models/datacite/datacite-event.enum.ts b/src/app/shared/enums/datacite/datacite-event.enum.ts
similarity index 100%
rename from src/app/shared/models/datacite/datacite-event.enum.ts
rename to src/app/shared/enums/datacite/datacite-event.enum.ts
diff --git a/src/app/shared/enums/index.ts b/src/app/shared/enums/index.ts
deleted file mode 100644
index 05460f357..000000000
--- a/src/app/shared/enums/index.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-export * from './addon-form-controls.enum';
-export * from './addon-service-names.enum';
-export * from './addon-supported-features.enum';
-export * from './addon-tab.enum';
-export * from './addon-type.enum';
-export * from './addons-category.enum';
-export * from './addons-credentials-format.enum';
-export * from './block-type.enum';
-export * from './breakpoint-queries.enum';
-export * from './citation-types.enum';
-export * from './contributors';
-export * from './create-component-form-controls.enum';
-export * from './create-project-form-controls.enum';
-export * from './field-type.enum';
-export * from './file-kind.enum';
-export * from './file-menu-type.enum';
-export * from './filter-type.enum';
-export * from './get-resources-request-type.enum';
-export * from './metadata-record-format.enum';
-export * from './metadata-resource.enum';
-export * from './mode.enum';
-export * from './moderation-decision-form-controls.enum';
-export * from './moderation-submit-type.enum';
-export * from './operation-names.enum';
-export * from './profile-addons-stepper.enum';
-export * from './profile-settings-key.enum';
-export * from './registration-review-states.enum';
-export * from './registry-resource.enum';
-export * from './registry-status.enum';
-export * from './request-access-trigger.enum';
-export * from './request-access-type.enum';
-export * from './resource-search-mode.enum';
-export * from './resource-type.enum';
-export * from './reusable-filter-type.enum';
-export * from './review-permissions.enum';
-export * from './revision-review-states.enum';
-export * from './share-indexing.enum';
-export * from './sort-order.enum';
-export * from './sort-type.enum';
-export * from './storage-item-type.enum';
-export * from './subscriptions';
-export * from './trigger-action.enum';
-export * from './user-permissions.enum';
diff --git a/src/app/shared/enums/storage-item-type.enum.ts b/src/app/shared/enums/storage-item-type.enum.ts
index 91ab6cfcf..7c32fd2a3 100644
--- a/src/app/shared/enums/storage-item-type.enum.ts
+++ b/src/app/shared/enums/storage-item-type.enum.ts
@@ -2,5 +2,6 @@ export enum StorageItemType {
Folder = 'FOLDER',
Resource = 'RESOURCE',
Document = 'DOCUMENT',
+ File = 'FILE',
Collection = 'COLLECTION',
}
diff --git a/src/app/shared/enums/subscriptions/index.ts b/src/app/shared/enums/subscriptions/index.ts
deleted file mode 100644
index 64dbd8be9..000000000
--- a/src/app/shared/enums/subscriptions/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './subscription-event.enum';
-export * from './subscription-frequency.enum';
-export * from './subscription-type.enum';
diff --git a/src/app/shared/enums/subscriptions/subscription-event.enum.ts b/src/app/shared/enums/subscriptions/subscription-event.enum.ts
index f3913133f..3ce040bfe 100644
--- a/src/app/shared/enums/subscriptions/subscription-event.enum.ts
+++ b/src/app/shared/enums/subscriptions/subscription-event.enum.ts
@@ -1,6 +1,5 @@
export enum SubscriptionEvent {
GlobalFileUpdated = 'global_file_updated',
- GlobalMentions = 'global_mentions',
GlobalReviews = 'global_reviews',
FileUpdated = 'file_updated',
}
diff --git a/src/app/shared/guards/confirm-leaving.guard.ts b/src/app/shared/guards/confirm-leaving.guard.ts
index 1bdf3dab9..7b2bfa372 100644
--- a/src/app/shared/guards/confirm-leaving.guard.ts
+++ b/src/app/shared/guards/confirm-leaving.guard.ts
@@ -3,8 +3,9 @@ import { Subject } from 'rxjs';
import { inject } from '@angular/core';
import { CanDeactivateFn } from '@angular/router';
-import { CanDeactivateComponent } from '@shared/models';
-import { CustomConfirmationService } from '@shared/services';
+import { CanDeactivateComponent } from '@shared/models/can-deactivate.interface';
+
+import { CustomConfirmationService } from '../services/custom-confirmation.service';
export const ConfirmLeavingGuard: CanDeactivateFn = (component) => {
const confirmationService = inject(CustomConfirmationService);
diff --git a/src/app/shared/helpers/addon-card.helper.ts b/src/app/shared/helpers/addon-card.helper.ts
index 092b6ffcb..e71c1e815 100644
--- a/src/app/shared/helpers/addon-card.helper.ts
+++ b/src/app/shared/helpers/addon-card.helper.ts
@@ -1,4 +1,6 @@
-import { AddonCardModel, AddonModel, ConfiguredAddonModel } from '../models';
+import { AddonModel } from '../models/addons/addon.model';
+import { AddonCardModel } from '../models/addons/addon-card.model';
+import { ConfiguredAddonModel } from '../models/addons/configured-addon.model';
export function createAddonCardModel(
addon: AddonModel,
diff --git a/src/app/shared/helpers/addon-type.helper.ts b/src/app/shared/helpers/addon-type.helper.ts
index beea10396..2b4c65f11 100644
--- a/src/app/shared/helpers/addon-type.helper.ts
+++ b/src/app/shared/helpers/addon-type.helper.ts
@@ -1,5 +1,9 @@
-import { AddonCategory, AddonType, AuthorizedAccountType, ConfiguredAddonType } from '@shared/enums';
-import { AddonModel, AuthorizedAccountModel, ConfiguredAddonModel } from '@shared/models';
+import { AddonModel } from '@shared/models/addons/addon.model';
+import { AuthorizedAccountModel } from '@shared/models/addons/authorized-account.model';
+import { ConfiguredAddonModel } from '@shared/models/addons/configured-addon.model';
+
+import { AddonType, AuthorizedAccountType, ConfiguredAddonType } from '../enums/addon-type.enum';
+import { AddonCategory } from '../enums/addons-category.enum';
export function isStorageAddon(addon: AddonModel | AuthorizedAccountModel | ConfiguredAddonModel | null): boolean {
if (!addon) return false;
diff --git a/src/app/shared/helpers/breakpoints.tokens.ts b/src/app/shared/helpers/breakpoints.tokens.ts
index 7e7f910f0..d89eaeaac 100644
--- a/src/app/shared/helpers/breakpoints.tokens.ts
+++ b/src/app/shared/helpers/breakpoints.tokens.ts
@@ -3,7 +3,7 @@ import { map, Observable } from 'rxjs';
import { BreakpointObserver } from '@angular/cdk/layout';
import { inject, InjectionToken } from '@angular/core';
-import { BreakpointQueries } from '@osf/shared/enums';
+import { BreakpointQueries } from '../enums/breakpoint-queries.enum';
function createBreakpointToken(query: string): InjectionToken> {
return new InjectionToken>(`Breakpoint ${query}`, {
diff --git a/src/app/shared/helpers/citation-formatter.helper.ts b/src/app/shared/helpers/citation-formatter.helper.ts
index 5591e8290..1139ea7ca 100644
--- a/src/app/shared/helpers/citation-formatter.helper.ts
+++ b/src/app/shared/helpers/citation-formatter.helper.ts
@@ -1,4 +1,4 @@
-import { StorageItem } from '@shared/models';
+import { StorageItem } from '../models/addons/storage-item.model';
import { Cite } from '@citation-js/core';
diff --git a/src/app/shared/helpers/format-bad-encoding.helper.ts b/src/app/shared/helpers/format-bad-encoding.helper.ts
new file mode 100644
index 000000000..8df1c1d44
--- /dev/null
+++ b/src/app/shared/helpers/format-bad-encoding.helper.ts
@@ -0,0 +1,3 @@
+export function replaceBadEncodedChars(text: string) {
+ return text.replace(/&/gi, '&').replace(/</gi, '<').replace(/>/gi, '>');
+}
diff --git a/src/app/shared/helpers/get-resource-types.helper.ts b/src/app/shared/helpers/get-resource-types.helper.ts
index 942a7724b..4dc60b462 100644
--- a/src/app/shared/helpers/get-resource-types.helper.ts
+++ b/src/app/shared/helpers/get-resource-types.helper.ts
@@ -1,4 +1,4 @@
-import { ResourceType } from '@osf/shared/enums';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
export function getResourceTypeStringFromEnum(resourceTab: ResourceType): string {
switch (resourceTab) {
diff --git a/src/app/shared/helpers/http.helper.ts b/src/app/shared/helpers/http.helper.ts
index 09b8c526e..d44e37207 100644
--- a/src/app/shared/helpers/http.helper.ts
+++ b/src/app/shared/helpers/http.helper.ts
@@ -1,7 +1,8 @@
import { Params } from '@angular/router';
-import { SortOrder } from '@osf/shared/enums';
-import { QueryParams } from '@osf/shared/models';
+import { QueryParams } from '@shared/models/query-params.model';
+
+import { SortOrder } from '../enums/sort-order.enum';
export const parseQueryFilterParams = (params: Params): QueryParams => {
const page = parseInt(params['page'], 10) || 1;
diff --git a/src/app/shared/helpers/index.ts b/src/app/shared/helpers/index.ts
deleted file mode 100644
index 468122427..000000000
--- a/src/app/shared/helpers/index.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-export * from './addon-card.helper';
-export * from './addon-type.helper';
-export * from './addons-query-params.helper';
-export * from './breakpoints.tokens';
-export * from './browser-tab.helper';
-export * from './camel-case';
-export * from './camel-case-to-normal.helper';
-export * from './citation-formatter.helper';
-export * from './convert-to-snake-case.helper';
-export * from './custom-form-validators.helper';
-export * from './find-changed-fields';
-export * from './find-changed-items.helper';
-export * from './form-validation.helper';
-export * from './get-resource-types.helper';
-export * from './header-style.helper';
-export * from './http.helper';
-export * from './normalize-quotes';
-export * from './password.helper';
-export * from './path-join.helper';
-export * from './remove-nullable.helper';
-export * from './search-pref-to-json-api-query-params.helper';
-export * from './sort-contributors-by-permissions';
-export * from './state-error.handler';
-export * from './types.helper';
-export * from './url-param.helper';
-export * from './view-only.helper';
diff --git a/src/app/shared/helpers/search-pref-to-json-api-query-params.helper.ts b/src/app/shared/helpers/search-pref-to-json-api-query-params.helper.ts
index 465ab1b76..ac5e321a7 100644
--- a/src/app/shared/helpers/search-pref-to-json-api-query-params.helper.ts
+++ b/src/app/shared/helpers/search-pref-to-json-api-query-params.helper.ts
@@ -1,5 +1,5 @@
-import { SortOrder } from '@shared/enums';
-import { SearchFilters } from '@shared/models';
+import { SortOrder } from '@shared/enums/sort-order.enum';
+import { SearchFilters } from '@shared/models/search-filters.model';
export function searchPreferencesToJsonApiQueryParams(
params: Record,
diff --git a/src/app/shared/helpers/sort-contributors-by-permissions.ts b/src/app/shared/helpers/sort-contributors-by-permissions.ts
index cb9e8b730..553d9094e 100644
--- a/src/app/shared/helpers/sort-contributors-by-permissions.ts
+++ b/src/app/shared/helpers/sort-contributors-by-permissions.ts
@@ -1,4 +1,4 @@
-import { Creator, IsContainedBy, QualifiedAttribution, ResourceModel } from '@shared/models';
+import { Creator, IsContainedBy, QualifiedAttribution, ResourceModel } from '../models/search/resource.model';
export function getSortedContributorsByPermissions(base: ResourceModel | IsContainedBy) {
const objectOrder = Object.fromEntries(
diff --git a/src/app/shared/mappers/activity-logs.mapper.ts b/src/app/shared/mappers/activity-logs.mapper.ts
index 2a5a4fff4..d0b7877a6 100644
--- a/src/app/shared/mappers/activity-logs.mapper.ts
+++ b/src/app/shared/mappers/activity-logs.mapper.ts
@@ -1,13 +1,8 @@
-import { DEFAULT_TABLE_PARAMS } from '../constants';
-import {
- ActivityLog,
- ActivityLogJsonApi,
- JsonApiResponseWithMeta,
- LogContributor,
- LogContributorJsonApi,
- MetaAnonymousJsonApi,
- PaginatedData,
-} from '../models';
+import { DEFAULT_TABLE_PARAMS } from '../constants/default-table-params.constants';
+import { ActivityLog, LogContributor } from '../models/activity-logs/activity-logs.model';
+import { ActivityLogJsonApi, LogContributorJsonApi } from '../models/activity-logs/activity-logs-json-api.model';
+import { JsonApiResponseWithMeta, MetaAnonymousJsonApi } from '../models/common/json-api.model';
+import { PaginatedData } from '../models/paginated-data.model';
export class ActivityLogsMapper {
static fromActivityLogJsonApi(log: ActivityLogJsonApi, isAnonymous?: boolean): ActivityLog {
diff --git a/src/app/shared/mappers/addon.mapper.ts b/src/app/shared/mappers/addon.mapper.ts
index fa3c4d73d..c3a70ed48 100644
--- a/src/app/shared/mappers/addon.mapper.ts
+++ b/src/app/shared/mappers/addon.mapper.ts
@@ -1,16 +1,19 @@
-import { AddonCategory, AuthorizedAccountType, ConfiguredAddonType } from '../enums';
+import { AuthorizedAccountType, ConfiguredAddonType } from '../enums/addon-type.enum';
+import { AddonCategory } from '../enums/addons-category.enum';
+import { AddonModel } from '../models/addons/addon.model';
import {
AddonGetResponseJsonApi,
- AddonModel,
- AuthorizedAccountModel,
AuthorizedAddonGetResponseJsonApi,
ConfiguredAddonGetResponseJsonApi,
- ConfiguredAddonModel,
IncludedAddonData,
- OperationInvocation,
+} from '../models/addons/addon-json-api.models';
+import {
OperationInvocationResponseJsonApi,
StorageItemResponseJsonApi,
-} from '../models';
+} from '../models/addons/addon-operations-json-api.models';
+import { AuthorizedAccountModel } from '../models/addons/authorized-account.model';
+import { ConfiguredAddonModel } from '../models/addons/configured-addon.model';
+import { OperationInvocation } from '../models/addons/operation-invocation.model';
export class AddonMapper {
static fromResponse(response: AddonGetResponseJsonApi): AddonModel {
@@ -26,6 +29,7 @@ export class AddonMapper {
credentialsFormat: response.attributes.credentials_format,
providerName: response.attributes.display_name,
iconUrl: response.attributes.icon_url,
+ configurableApiRoot: response.attributes.configurable_api_root,
};
}
diff --git a/src/app/shared/mappers/citations.mapper.ts b/src/app/shared/mappers/citations.mapper.ts
index c70dbb1ce..5ae176049 100644
--- a/src/app/shared/mappers/citations.mapper.ts
+++ b/src/app/shared/mappers/citations.mapper.ts
@@ -1,13 +1,11 @@
-import { CITATION_TITLES } from '../constants';
-import { CitationTypes } from '../enums';
-import {
- CitationStyle,
- CitationStyleJsonApi,
- CustomCitationPayload,
- CustomCitationPayloadJsonApi,
- StyledCitation,
- StyledCitationJsonApi,
-} from '../models';
+import { CITATION_TITLES } from '../constants/default-citation-titles.const';
+import { CitationTypes } from '../enums/citation-types.enum';
+import { CitationStyle } from '../models/citations/citation-style.model';
+import { CitationStyleJsonApi } from '../models/citations/citation-style-json-api.model';
+import { CustomCitationPayload } from '../models/citations/custom-citation-payload.model';
+import { CustomCitationPayloadJsonApi } from '../models/citations/custom-citation-payload-json-api.model';
+import { StyledCitation } from '../models/citations/styled-citation.model';
+import { StyledCitationJsonApi } from '../models/citations/styled-citation-json-api.model';
export class CitationsMapper {
static fromGetCitationStylesResponse(response: CitationStyleJsonApi[]): CitationStyle[] {
diff --git a/src/app/shared/mappers/collections/collections.mapper.ts b/src/app/shared/mappers/collections/collections.mapper.ts
index 22969da39..b0fb73392 100644
--- a/src/app/shared/mappers/collections/collections.mapper.ts
+++ b/src/app/shared/mappers/collections/collections.mapper.ts
@@ -2,22 +2,24 @@ import {
CollectionSubmissionReviewAction,
CollectionSubmissionReviewActionJsonApi,
} from '@osf/features/moderation/models';
-import { convertToSnakeCase } from '@osf/shared/helpers';
+import { convertToSnakeCase } from '@osf/shared/helpers/convert-to-snake-case.helper';
+import { CollectionSubmissionPayload } from '@osf/shared/models/collections/collection-submission-payload.model';
+import { CollectionSubmissionPayloadJsonApi } from '@osf/shared/models/collections/collection-submission-payload-json-api.model';
import {
CollectionDetails,
- CollectionDetailsResponseJsonApi,
CollectionProvider,
- CollectionProviderResponseJsonApi,
CollectionSubmission,
- CollectionSubmissionJsonApi,
- CollectionSubmissionPayload,
- CollectionSubmissionPayloadJsonApi,
CollectionSubmissionWithGuid,
+} from '@osf/shared/models/collections/collections.models';
+import {
+ CollectionDetailsResponseJsonApi,
+ CollectionProviderResponseJsonApi,
+ CollectionSubmissionJsonApi,
CollectionSubmissionWithGuidJsonApi,
- ContributorModel,
- PaginatedData,
- ResponseJsonApi,
-} from '@osf/shared/models';
+} from '@osf/shared/models/collections/collections-json-api.models';
+import { ResponseJsonApi } from '@osf/shared/models/common/json-api.model';
+import { ContributorModel } from '@osf/shared/models/contributors/contributor.model';
+import { PaginatedData } from '@osf/shared/models/paginated-data.model';
import { UserMapper } from '../user';
diff --git a/src/app/shared/mappers/components/components.mapper.ts b/src/app/shared/mappers/components/components.mapper.ts
index 65bc72edc..14cb0f5a3 100644
--- a/src/app/shared/mappers/components/components.mapper.ts
+++ b/src/app/shared/mappers/components/components.mapper.ts
@@ -1,4 +1,5 @@
-import { ComponentGetResponseJsonApi, ComponentOverview } from '@shared/models';
+import { ComponentGetResponseJsonApi } from '@osf/shared/models/components/component-json-api.model';
+import { ComponentOverview } from '@osf/shared/models/components/components.models';
import { ContributorsMapper } from '../contributors';
diff --git a/src/app/shared/mappers/contributors/contributors.mapper.ts b/src/app/shared/mappers/contributors/contributors.mapper.ts
index bf44ed469..b0546f98e 100644
--- a/src/app/shared/mappers/contributors/contributors.mapper.ts
+++ b/src/app/shared/mappers/contributors/contributors.mapper.ts
@@ -1,14 +1,14 @@
-import { AddContributorType, ContributorPermission } from '@osf/shared/enums';
+import { AddContributorType } from '@osf/shared/enums/contributors/add-contributor-type.enum';
+import { ContributorPermission } from '@osf/shared/enums/contributors/contributor-permission.enum';
+import { ResponseJsonApi } from '@osf/shared/models/common/json-api.model';
+import { ContributorModel, ContributorShortInfoModel } from '@osf/shared/models/contributors/contributor.model';
+import { ContributorAddModel } from '@osf/shared/models/contributors/contributor-add.model';
import {
- ContributorAddModel,
ContributorAddRequestModel,
ContributorDataJsonApi,
- ContributorModel,
- ContributorShortInfoModel,
- PaginatedData,
- ResponseJsonApi,
- UserDataJsonApi,
-} from '@osf/shared/models';
+} from '@osf/shared/models/contributors/contributor-response-json-api.model';
+import { PaginatedData } from '@osf/shared/models/paginated-data.model';
+import { UserDataJsonApi } from '@osf/shared/models/user/user-json-api.model';
export class ContributorsMapper {
static getContributors(response: ContributorDataJsonApi[] | undefined): ContributorModel[] {
diff --git a/src/app/shared/mappers/emails.mapper.ts b/src/app/shared/mappers/emails.mapper.ts
index 78d2c39e5..f87111ea0 100644
--- a/src/app/shared/mappers/emails.mapper.ts
+++ b/src/app/shared/mappers/emails.mapper.ts
@@ -1,4 +1,5 @@
-import { AccountEmailModel, EmailsDataJsonApi } from '../models/emails';
+import { AccountEmailModel } from '../models/emails/account-email.model';
+import { EmailsDataJsonApi } from '../models/emails/account-emails-json-api.model';
export function MapEmails(emails: EmailsDataJsonApi[]): AccountEmailModel[] {
return emails.map((item) => MapEmail(item));
diff --git a/src/app/shared/mappers/files/files.mapper.ts b/src/app/shared/mappers/files/files.mapper.ts
index 95ecf6f8d..f792acf78 100644
--- a/src/app/shared/mappers/files/files.mapper.ts
+++ b/src/app/shared/mappers/files/files.mapper.ts
@@ -1,19 +1,15 @@
-import { FileKind } from '@osf/shared/enums';
+import { FileKind } from '@osf/shared/enums/file-kind.enum';
+import { FileDetailsModel, FileExtraModel, FileLinksModel, FileModel } from '@shared/models/files/file.model';
+import { FileFolderLinks, FileFolderModel } from '@shared/models/files/file-folder.model';
+import { FileFolderDataJsonApi } from '@shared/models/files/file-folder-json-api.model';
import {
FileDataJsonApi,
FileDetailsDataJsonApi,
- FileDetailsModel,
FileExtraJsonApi,
- FileExtraModel,
- FileFolderDataJsonApi,
- FileFolderLinks,
- FileFolderModel,
FileLinksJsonApi,
- FileLinksModel,
- FileModel,
- FileVersionModel,
- FileVersionsResponseJsonApi,
-} from '@osf/shared/models';
+} from '@shared/models/files/file-json-api.model';
+import { FileVersionModel } from '@shared/models/files/file-version.model';
+import { FileVersionsResponseJsonApi } from '@shared/models/files/file-version-json-api.model';
import { BaseNodeMapper } from '../nodes';
diff --git a/src/app/shared/mappers/filters/filter-option.mapper.ts b/src/app/shared/mappers/filters/filter-option.mapper.ts
index 9b78e8c53..21fd54c13 100644
--- a/src/app/shared/mappers/filters/filter-option.mapper.ts
+++ b/src/app/shared/mappers/filters/filter-option.mapper.ts
@@ -1,4 +1,6 @@
-import { FilterOption, FilterOptionItem, SearchResultDataJsonApi } from '@shared/models';
+import { FilterOption } from '@osf/shared/models/search/discaverable-filter.model';
+import { FilterOptionItem } from '@osf/shared/models/search/filter-options-json-api.models';
+import { SearchResultDataJsonApi } from '@osf/shared/models/search/index-card-search-json-api.models';
export function mapFilterOptions(
searchResultItems: SearchResultDataJsonApi[],
diff --git a/src/app/shared/mappers/filters/filters.mapper.ts b/src/app/shared/mappers/filters/filters.mapper.ts
index 05e104a93..dde219558 100644
--- a/src/app/shared/mappers/filters/filters.mapper.ts
+++ b/src/app/shared/mappers/filters/filters.mapper.ts
@@ -1,9 +1,8 @@
+import { DiscoverableFilter, FilterOperatorOption } from '@osf/shared/models/search/discaverable-filter.model';
import {
- DiscoverableFilter,
- FilterOperator,
IndexCardSearchResponseJsonApi,
RelatedPropertyPathDataJsonApi,
-} from '@shared/models';
+} from '@osf/shared/models/search/index-card-search-json-api.models';
export function MapFilters(indexCardSearchResponseJsonApi: IndexCardSearchResponseJsonApi): DiscoverableFilter[] {
const relatedPropertiesIds = indexCardSearchResponseJsonApi.data.relationships.relatedProperties.data.map(
@@ -21,7 +20,7 @@ export function MapFilters(indexCardSearchResponseJsonApi: IndexCardSearchRespon
export function RelatedPropertyPathMapper(relatedPropertyPath: RelatedPropertyPathDataJsonApi): DiscoverableFilter {
const key = relatedPropertyPath.attributes.propertyPathKey;
- const operator = relatedPropertyPath.attributes.suggestedFilterOperator as FilterOperator;
+ const operator = relatedPropertyPath.attributes.suggestedFilterOperator as FilterOperatorOption;
const propertyPath = relatedPropertyPath.attributes.propertyPath?.at(-1);
const label = propertyPath?.displayLabel?.[0]?.['@value'] ?? key;
diff --git a/src/app/shared/mappers/identifiers.mapper.ts b/src/app/shared/mappers/identifiers.mapper.ts
index 04d5cdaca..2ada05fd8 100644
--- a/src/app/shared/mappers/identifiers.mapper.ts
+++ b/src/app/shared/mappers/identifiers.mapper.ts
@@ -1,7 +1,8 @@
-import { Identifier, IdentifiersResponseJsonApi } from '@shared/models';
+import { IdentifierModel } from '../models/identifiers/identifier.model';
+import { IdentifiersResponseJsonApi } from '../models/identifiers/identifier-json-api.model';
export class IdentifiersMapper {
- static fromJsonApi(response: IdentifiersResponseJsonApi | undefined): Identifier[] {
+ static fromJsonApi(response: IdentifiersResponseJsonApi | undefined): IdentifierModel[] {
if (!response || !response.data) {
return [];
}
diff --git a/src/app/shared/mappers/index.ts b/src/app/shared/mappers/index.ts
deleted file mode 100644
index 53015bb65..000000000
--- a/src/app/shared/mappers/index.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-export * from './activity-logs.mapper';
-export * from './addon.mapper';
-export * from './citations.mapper';
-export * from './collections';
-export * from './components';
-export * from './contributors';
-export * from './emails.mapper';
-export * from './files/files.mapper';
-export * from './filters/filter-option.mapper';
-export * from './filters/filters.mapper';
-export * from './identifiers.mapper';
-export * from './institutions';
-export * from './licenses.mapper';
-export * from './nodes';
-export * from './notification-subscription.mapper';
-export * from './registration-provider.mapper';
-export * from './resource-overview.mappers';
-export * from './review-actions.mapper';
-export * from './subjects';
-export * from './user';
-export * from './user-related-counts';
-export * from './view-only-links.mapper';
diff --git a/src/app/shared/mappers/institutions/institutions.mapper.ts b/src/app/shared/mappers/institutions/institutions.mapper.ts
index 53ee7f8e1..56cb294f4 100644
--- a/src/app/shared/mappers/institutions/institutions.mapper.ts
+++ b/src/app/shared/mappers/institutions/institutions.mapper.ts
@@ -1,10 +1,9 @@
import {
- Institution,
InstitutionDataJsonApi,
InstitutionsJsonApiResponse,
InstitutionsWithMetaJsonApiResponse,
- InstitutionsWithTotalCount,
-} from '@shared/models';
+} from '@osf/shared/models/institutions/institution-json-api.model';
+import { Institution, InstitutionsWithTotalCount } from '@osf/shared/models/institutions/institutions.models';
export class InstitutionsMapper {
static fromInstitutionsResponse(response: InstitutionsJsonApiResponse): Institution[] {
diff --git a/src/app/shared/mappers/licenses.mapper.ts b/src/app/shared/mappers/licenses.mapper.ts
index f4726cfb3..253da04dc 100644
--- a/src/app/shared/mappers/licenses.mapper.ts
+++ b/src/app/shared/mappers/licenses.mapper.ts
@@ -1,4 +1,5 @@
-import { LicenseDataJsonApi, LicenseModel, LicensesResponseJsonApi } from '../models';
+import { LicenseModel } from '../models/license/license.model';
+import { LicenseDataJsonApi, LicensesResponseJsonApi } from '../models/license/licenses-json-api.model';
export class LicensesMapper {
static fromLicensesResponse(response: LicensesResponseJsonApi): LicenseModel[] {
diff --git a/src/app/features/my-projects/mappers/my-resources.mapper.ts b/src/app/shared/mappers/my-resources.mapper.ts
similarity index 84%
rename from src/app/features/my-projects/mappers/my-resources.mapper.ts
rename to src/app/shared/mappers/my-resources.mapper.ts
index d70c19be9..b924d9a5c 100644
--- a/src/app/features/my-projects/mappers/my-resources.mapper.ts
+++ b/src/app/shared/mappers/my-resources.mapper.ts
@@ -1,5 +1,6 @@
-import { ContributorsMapper } from '@osf/shared/mappers';
-import { MyResourcesItem, MyResourcesItemGetResponseJsonApi } from '@osf/shared/models';
+import { MyResourcesItem, MyResourcesItemGetResponseJsonApi } from '../models/my-resources/my-resources.models';
+
+import { ContributorsMapper } from './contributors';
export class MyResourcesMapper {
static fromResponse(response: MyResourcesItemGetResponseJsonApi): MyResourcesItem {
diff --git a/src/app/shared/mappers/nodes/base-node.mapper.ts b/src/app/shared/mappers/nodes/base-node.mapper.ts
index 771005e2b..3fc17f94b 100644
--- a/src/app/shared/mappers/nodes/base-node.mapper.ts
+++ b/src/app/shared/mappers/nodes/base-node.mapper.ts
@@ -1,12 +1,10 @@
-import {
- BaseNodeDataJsonApi,
- BaseNodeModel,
- NodeModel,
- NodeShortInfoModel,
- PaginatedData,
- ResponseJsonApi,
-} from '@osf/shared/models';
-import { ContributorsMapper } from '@shared/mappers';
+import { ResponseJsonApi } from '@osf/shared/models/common/json-api.model';
+import { BaseNodeModel, NodeModel } from '@osf/shared/models/nodes/base-node.model';
+import { BaseNodeDataJsonApi } from '@osf/shared/models/nodes/base-node-data-json-api.model';
+import { NodeShortInfoModel } from '@osf/shared/models/nodes/node-with-children.model';
+import { PaginatedData } from '@osf/shared/models/paginated-data.model';
+
+import { ContributorsMapper } from '../contributors';
export class BaseNodeMapper {
static getNodesData(data: BaseNodeDataJsonApi[]): BaseNodeModel[] {
diff --git a/src/app/shared/mappers/notification-subscription.mapper.ts b/src/app/shared/mappers/notification-subscription.mapper.ts
index bd0bcc6c9..6ccb5bb37 100644
--- a/src/app/shared/mappers/notification-subscription.mapper.ts
+++ b/src/app/shared/mappers/notification-subscription.mapper.ts
@@ -1,9 +1,11 @@
-import { SubscriptionEvent, SubscriptionFrequency, SubscriptionType } from '../enums';
+import { SubscriptionEvent } from '../enums/subscriptions/subscription-event.enum';
+import { SubscriptionFrequency } from '../enums/subscriptions/subscription-frequency.enum';
+import { SubscriptionType } from '../enums/subscriptions/subscription-type.enum';
+import { NotificationSubscription } from '../models/notifications/notification-subscription.model';
import {
- NotificationSubscription,
NotificationSubscriptionGetResponseJsonApi,
NotificationSubscriptionUpdateRequestJsonApi,
-} from '../models';
+} from '../models/notifications/notification-subscription-json-api.model';
export class NotificationSubscriptionMapper {
static fromGetResponse(response: NotificationSubscriptionGetResponseJsonApi): NotificationSubscription {
diff --git a/src/app/shared/mappers/projects/projects.mapper.ts b/src/app/shared/mappers/projects/projects.mapper.ts
index 86ee52697..51cbfa73e 100644
--- a/src/app/shared/mappers/projects/projects.mapper.ts
+++ b/src/app/shared/mappers/projects/projects.mapper.ts
@@ -1,6 +1,7 @@
import { CollectionSubmissionMetadataPayloadJsonApi } from '@osf/features/collections/models';
-import { ProjectMetadataUpdatePayload } from '@osf/shared/models';
-import { ProjectJsonApi, ProjectModel, ProjectsResponseJsonApi } from '@osf/shared/models/projects';
+import { ProjectMetadataUpdatePayload } from '@osf/shared/models/project-metadata-update-payload.model';
+import { ProjectModel } from '@osf/shared/models/projects/projects.models';
+import { ProjectJsonApi, ProjectsResponseJsonApi } from '@osf/shared/models/projects/projects-json-api.models';
export class ProjectsMapper {
static fromGetAllProjectsResponse(response: ProjectsResponseJsonApi): ProjectModel[] {
diff --git a/src/app/shared/mappers/regions/regions-mapper.ts b/src/app/shared/mappers/regions/regions-mapper.ts
index 4b2c371c6..a06e609a8 100644
--- a/src/app/shared/mappers/regions/regions-mapper.ts
+++ b/src/app/shared/mappers/regions/regions-mapper.ts
@@ -1,14 +1,15 @@
-import { IdName, RegionDataJsonApi, RegionsResponseJsonApi } from '@osf/shared/models';
+import { IdNameModel } from '@osf/shared/models/common/id-name.model';
+import { RegionDataJsonApi, RegionsResponseJsonApi } from '@osf/shared/models/regions/regions.json-api.model';
export class RegionsMapper {
- static fromRegionsResponseJsonApi(response: RegionsResponseJsonApi): IdName[] {
+ static fromRegionsResponseJsonApi(response: RegionsResponseJsonApi): IdNameModel[] {
return response.data.map((data) => ({
id: data.id,
name: data.attributes.name,
}));
}
- static getRegion(data: RegionDataJsonApi): IdName {
+ static getRegion(data: RegionDataJsonApi): IdNameModel {
return {
id: data.id,
name: data.attributes.name,
diff --git a/src/app/shared/mappers/registration-provider.mapper.ts b/src/app/shared/mappers/registration-provider.mapper.ts
index 884cd4708..36d19175c 100644
--- a/src/app/shared/mappers/registration-provider.mapper.ts
+++ b/src/app/shared/mappers/registration-provider.mapper.ts
@@ -1,9 +1,7 @@
-import {
- ProviderSchema,
- ProvidersResponseJsonApi,
- RegistryProviderDetails,
- RegistryProviderDetailsJsonApi,
-} from '@osf/shared/models';
+import { ProvidersResponseJsonApi } from '../models/provider/providers-json-api.model';
+import { RegistryProviderDetailsJsonApi } from '../models/provider/registration-provider-json-api.model';
+import { RegistryProviderDetails } from '../models/provider/registry-provider.model';
+import { ProviderSchema } from '../models/registration/provider-schema.model';
export class RegistrationProviderMapper {
static fromProvidersResponse(response: ProvidersResponseJsonApi): ProviderSchema[] {
@@ -14,7 +12,7 @@ export class RegistrationProviderMapper {
}
static fromRegistryProvider(response: RegistryProviderDetailsJsonApi): RegistryProviderDetails {
- const brandRaw = response.embeds!.brand.data;
+ const brandRaw = response.embeds?.brand.data;
return {
id: response.id,
diff --git a/src/app/shared/mappers/registration/map-registry-status.mapper.ts b/src/app/shared/mappers/registration/map-registry-status.mapper.ts
index 7761172e4..308fc334f 100644
--- a/src/app/shared/mappers/registration/map-registry-status.mapper.ts
+++ b/src/app/shared/mappers/registration/map-registry-status.mapper.ts
@@ -1,9 +1,11 @@
-import { RegistryOverviewJsonApiAttributes } from '@osf/features/registry/models';
-import { RegistrationReviewStates, RegistryStatus, RevisionReviewStates } from '@osf/shared/enums';
-import { RegistrationAttributesJsonApi } from '@osf/shared/models';
+import { RegistrationReviewStates } from '@osf/shared/enums/registration-review-states.enum';
+import { RegistryStatus } from '@osf/shared/enums/registry-status.enum';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
+import { RegistrationNodeAttributesJsonApi } from '@osf/shared/models/registration/registration-node-json-api.model';
+import { RegistrationAttributesJsonApi } from '@shared/models/registration/registration-json-api.model';
export function MapRegistryStatus(
- registry: RegistryOverviewJsonApiAttributes | RegistrationAttributesJsonApi
+ registry: RegistrationNodeAttributesJsonApi | RegistrationAttributesJsonApi
): RegistryStatus {
if (registry.pending_embargo_approval) {
return RegistryStatus.PendingEmbargoApproval;
diff --git a/src/app/shared/mappers/registration/page-schema.mapper.ts b/src/app/shared/mappers/registration/page-schema.mapper.ts
index e5207c49a..84c57a97f 100644
--- a/src/app/shared/mappers/registration/page-schema.mapper.ts
+++ b/src/app/shared/mappers/registration/page-schema.mapper.ts
@@ -1,5 +1,7 @@
-import { BlockType, FieldType } from '@osf/shared/enums';
-import { PageSchema, Question, SchemaBlocksResponseJsonApi, Section } from '@osf/shared/models';
+import { BlockType } from '@osf/shared/enums/block-type.enum';
+import { FieldType } from '@osf/shared/enums/field-type.enum';
+import { PageSchema, Question, Section } from '@shared/models/registration/page-schema.model';
+import { SchemaBlocksResponseJsonApi } from '@shared/models/registration/schema-blocks-json-api.model';
export class PageSchemaMapper {
static fromSchemaBlocksResponse(response: SchemaBlocksResponseJsonApi): PageSchema[] {
diff --git a/src/app/shared/mappers/registration/registration-node.mapper.ts b/src/app/shared/mappers/registration/registration-node.mapper.ts
index 8f09fb332..fda7ddd86 100644
--- a/src/app/shared/mappers/registration/registration-node.mapper.ts
+++ b/src/app/shared/mappers/registration/registration-node.mapper.ts
@@ -1,12 +1,11 @@
-import { CurrentResourceType } from '@osf/shared/enums';
+import { CurrentResourceType } from '@osf/shared/enums/resource-type.enum';
+import { ProviderShortInfoModel } from '@shared/models/provider/provider.model';
+import { RegistryProviderDetailsJsonApi } from '@shared/models/provider/registration-provider-json-api.model';
+import { RegistrationNodeModel, RegistrationResponses } from '@shared/models/registration/registration-node.model';
import {
- ProviderShortInfoModel,
RegistrationNodeAttributesJsonApi,
- RegistrationNodeModel,
- RegistrationResponses,
RegistrationResponsesJsonApi,
- RegistryProviderDetailsJsonApi,
-} from '@osf/shared/models';
+} from '@shared/models/registration/registration-node-json-api.model';
export class RegistrationNodeMapper {
static getRegistrationNodeAttributes(
@@ -66,8 +65,8 @@ export class RegistrationNodeMapper {
static getRegistrationResponses(response: RegistrationResponsesJsonApi): RegistrationResponses {
return {
- summary: response.summary,
- uploader: response.uploader.map((uploadItem) => ({
+ summary: response?.summary,
+ uploader: response?.uploader?.map((uploadItem) => ({
fileId: uploadItem.file_id,
fileName: uploadItem.file_name,
fileUrls: uploadItem.file_urls,
diff --git a/src/app/shared/mappers/registration/registration.mapper.ts b/src/app/shared/mappers/registration/registration.mapper.ts
index 304f49b22..966b9fafa 100644
--- a/src/app/shared/mappers/registration/registration.mapper.ts
+++ b/src/app/shared/mappers/registration/registration.mapper.ts
@@ -1,13 +1,13 @@
-import { RegistryStatus } from '@osf/shared/enums';
+import { RegistryStatus } from '@osf/shared/enums/registry-status.enum';
+import { DraftRegistrationModel } from '@shared/models/registration/draft-registration.model';
+import { RegistrationModel } from '@shared/models/registration/registration.model';
+import { RegistrationCard } from '@shared/models/registration/registration-card.model';
import {
DraftRegistrationDataJsonApi,
- DraftRegistrationModel,
- RegistrationCard,
RegistrationDataJsonApi,
- RegistrationModel,
- SchemaResponse,
SchemaResponseDataJsonApi,
-} from '@osf/shared/models';
+} from '@shared/models/registration/registration-json-api.model';
+import { SchemaResponse } from '@shared/models/registration/schema-response.model';
import { ContributorsMapper } from '../contributors';
diff --git a/src/app/shared/mappers/request-access/request-access.mapper.ts b/src/app/shared/mappers/request-access/request-access.mapper.ts
index 9acfc6849..475d0b8e9 100644
--- a/src/app/shared/mappers/request-access/request-access.mapper.ts
+++ b/src/app/shared/mappers/request-access/request-access.mapper.ts
@@ -1,5 +1,9 @@
-import { ContributorPermission, RequestAccessTrigger, RequestAccessType } from '@osf/shared/enums';
-import { RequestAccessDataJsonApi, RequestAccessModel, RequestAccessPayload } from '@osf/shared/models';
+import { ContributorPermission } from '@osf/shared/enums/contributors/contributor-permission.enum';
+import { RequestAccessTrigger } from '@osf/shared/enums/request-access-trigger.enum';
+import { RequestAccessType } from '@osf/shared/enums/request-access-type.enum';
+import { RequestAccessModel } from '@shared/models/request-access/request-access.model';
+import { RequestAccessDataJsonApi } from '@shared/models/request-access/request-access-json-api.model';
+import { RequestAccessPayload } from '@shared/models/request-access/request-access-payload.model';
import { UserMapper } from '../user';
diff --git a/src/app/shared/mappers/resource-overview.mappers.ts b/src/app/shared/mappers/resource-overview.mappers.ts
index cb4a69622..994327e13 100644
--- a/src/app/shared/mappers/resource-overview.mappers.ts
+++ b/src/app/shared/mappers/resource-overview.mappers.ts
@@ -1,7 +1,8 @@
import { ProjectOverview } from '@osf/features/project/overview/models';
-import { RegistryOverview } from '@osf/features/registry/models';
-import { ContributorModel, Institution, ResourceOverview, SubjectModel } from '../models';
+import { ContributorModel } from '../models/contributors/contributor.model';
+import { ResourceOverview } from '../models/resource-overview.model';
+import { SubjectModel } from '../models/subject/subject.model';
export function MapProjectOverview(
project: ProjectOverview,
@@ -45,47 +46,3 @@ export function MapProjectOverview(
isAnonymous,
};
}
-
-export function MapRegistryOverview(
- registry: RegistryOverview,
- subjects: SubjectModel[],
- institutions: Institution[],
- isAnonymous = false
-): ResourceOverview {
- return {
- id: registry.id,
- title: registry.title,
- type: registry.type,
- description: registry.description,
- dateModified: registry.dateModified,
- dateCreated: registry.dateCreated,
- dateRegistered: registry.dateRegistered,
- isPublic: registry.isPublic,
- category: registry.category,
- isRegistration: true,
- isPreprint: false,
- isCollection: false,
- isFork: registry.isFork,
- tags: registry.tags || [],
- accessRequestsEnabled: registry.accessRequestsEnabled,
- nodeLicense: registry.nodeLicense,
- license: registry.license || undefined,
- identifiers: registry.identifiers?.filter(Boolean) || undefined,
- analyticsKey: registry.analyticsKey,
- registrationType: registry.registrationType,
- currentUserCanComment: registry.currentUserCanComment,
- currentUserPermissions: registry.currentUserPermissions || [],
- currentUserIsContributor: registry.currentUserIsContributor,
- currentUserIsContributorOrGroupMember: registry.currentUserIsContributorOrGroupMember,
- wikiEnabled: registry.wikiEnabled,
- contributors: registry.contributors?.filter(Boolean) || [],
- region: registry.region || undefined,
- forksCount: registry.forksCount,
- subjects: subjects,
- customCitation: registry.customCitation,
- affiliatedInstitutions: institutions,
- associatedProjectId: registry.associatedProjectId,
- isAnonymous,
- iaUrl: registry.iaUrl,
- };
-}
diff --git a/src/app/shared/mappers/review-actions.mapper.ts b/src/app/shared/mappers/review-actions.mapper.ts
index 99ec01e80..4e04573e1 100644
--- a/src/app/shared/mappers/review-actions.mapper.ts
+++ b/src/app/shared/mappers/review-actions.mapper.ts
@@ -1,4 +1,5 @@
-import { ReviewActionPayload, ReviewActionPayloadJsonApi } from '../models/review-action';
+import { ReviewActionPayload } from '../models/review-action/review-action-payload.model';
+import { ReviewActionPayloadJsonApi } from '../models/review-action/review-action-payload-json-api.model';
export class ReviewActionsMapper {
static toReviewActionPayloadJsonApi(
diff --git a/src/app/shared/mappers/search/search.mapper.ts b/src/app/shared/mappers/search/search.mapper.ts
index f36ebbbe2..1ee0cd9a7 100644
--- a/src/app/shared/mappers/search/search.mapper.ts
+++ b/src/app/shared/mappers/search/search.mapper.ts
@@ -1,10 +1,10 @@
-import { ResourceType } from '@shared/enums';
+import { ResourceType } from '@shared/enums/resource-type.enum';
import {
IndexCardDataJsonApi,
IndexCardSearchResponseJsonApi,
- ResourceModel,
SearchResultDataJsonApi,
-} from '@shared/models';
+} from '@shared/models/search/index-card-search-json-api.models';
+import { ResourceModel } from '@shared/models/search/resource.model';
export function MapResources(indexCardSearchResponseJsonApi: IndexCardSearchResponseJsonApi): ResourceModel[] {
const searchResultIds = indexCardSearchResponseJsonApi.data.relationships.searchResultPage.data.map((obj) => obj.id);
diff --git a/src/app/shared/mappers/subjects/subject-mapper.ts b/src/app/shared/mappers/subjects/subject-mapper.ts
index 2f36bff8e..2a70f5fcb 100644
--- a/src/app/shared/mappers/subjects/subject-mapper.ts
+++ b/src/app/shared/mappers/subjects/subject-mapper.ts
@@ -1,4 +1,5 @@
-import { SubjectDataJsonApi, SubjectModel, SubjectsResponseJsonApi } from '@shared/models';
+import { SubjectModel } from '@osf/shared/models/subject/subject.model';
+import { SubjectDataJsonApi, SubjectsResponseJsonApi } from '@osf/shared/models/subject/subjects-json-api.model';
export class SubjectMapper {
static fromSubjectsResponseJsonApi(response: SubjectsResponseJsonApi): SubjectModel[] {
diff --git a/src/app/shared/mappers/user-related-counts/user-counts.mapper.ts b/src/app/shared/mappers/user-related-counts/user-counts.mapper.ts
index 8d664bcc2..c4ebd518f 100644
--- a/src/app/shared/mappers/user-related-counts/user-counts.mapper.ts
+++ b/src/app/shared/mappers/user-related-counts/user-counts.mapper.ts
@@ -1,4 +1,5 @@
-import { UserRelatedCounts, UserRelatedCountsResponseJsonApi } from '@osf/shared/models';
+import { UserRelatedCounts } from '@osf/shared/models/user-related-counts/user-related-counts.model';
+import { UserRelatedCountsResponseJsonApi } from '@osf/shared/models/user-related-counts/user-related-counts-json-api.model';
export function MapUserCounts(response: UserRelatedCountsResponseJsonApi): UserRelatedCounts {
return {
diff --git a/src/app/shared/mappers/user/user.mapper.ts b/src/app/shared/mappers/user/user.mapper.ts
index 42d395554..50b7b8b71 100644
--- a/src/app/shared/mappers/user/user.mapper.ts
+++ b/src/app/shared/mappers/user/user.mapper.ts
@@ -1,12 +1,11 @@
+import { UserData, UserModel } from '@osf/shared/models/user/user.models';
import {
UserAcceptedTermsOfServiceJsonApi,
UserAttributesJsonApi,
- UserData,
UserDataErrorResponseJsonApi,
UserDataJsonApi,
UserDataResponseJsonApi,
- UserModel,
-} from '@osf/shared/models';
+} from '@osf/shared/models/user/user-json-api.model';
export class UserMapper {
static fromUserDataGetResponse(response: UserDataResponseJsonApi): UserData {
diff --git a/src/app/shared/mappers/view-only-links.mapper.ts b/src/app/shared/mappers/view-only-links.mapper.ts
index 3d56a1c4d..e31b339cc 100644
--- a/src/app/shared/mappers/view-only-links.mapper.ts
+++ b/src/app/shared/mappers/view-only-links.mapper.ts
@@ -1,10 +1,12 @@
import {
PaginatedViewOnlyLinksModel,
- ViewOnlyLinkJsonApi,
ViewOnlyLinkModel,
ViewOnlyLinkNodeModel,
+} from '../models/view-only-links/view-only-link.model';
+import {
+ ViewOnlyLinkJsonApi,
ViewOnlyLinksResponseJsonApi,
-} from '../models';
+} from '../models/view-only-links/view-only-link-response.model';
import { UserMapper } from './user';
diff --git a/src/app/shared/mappers/wiki/wiki.mapper.ts b/src/app/shared/mappers/wiki/wiki.mapper.ts
index e02ed964c..aa79c9911 100644
--- a/src/app/shared/mappers/wiki/wiki.mapper.ts
+++ b/src/app/shared/mappers/wiki/wiki.mapper.ts
@@ -1,16 +1,16 @@
import {
ComponentsWikiGetResponse,
- ComponentWiki,
HomeWiki,
HomeWikiGetResponse,
- Wiki,
WikiGetResponse,
+ WikiModel,
WikiVersion,
WikiVersionJsonApi,
-} from '@osf/shared/models';
+} from '@osf/shared/models/wiki/wiki.model';
+import { ComponentWiki } from '@osf/shared/stores/wiki';
export class WikiMapper {
- static fromCreateWikiResponse(response: WikiGetResponse): Wiki {
+ static fromCreateWikiResponse(response: WikiGetResponse): WikiModel {
return {
id: response.id,
name: response.attributes.name,
@@ -27,7 +27,7 @@ export class WikiMapper {
};
}
- static fromGetWikiResponse(response: WikiGetResponse): Wiki {
+ static fromGetWikiResponse(response: WikiGetResponse): WikiModel {
return {
id: response.id,
name: response.attributes.name,
@@ -51,7 +51,7 @@ export class WikiMapper {
};
}
- static fromCreateWikiVersionResponse(response: WikiGetResponse): Wiki {
+ static fromCreateWikiVersionResponse(response: WikiGetResponse): WikiModel {
return {
id: response.id,
name: response.attributes.name,
diff --git a/src/app/shared/models/activity-logs/activity-logs.model.ts b/src/app/shared/models/activity-logs/activity-logs.model.ts
index 44a65a312..1b729eaf0 100644
--- a/src/app/shared/models/activity-logs/activity-logs.model.ts
+++ b/src/app/shared/models/activity-logs/activity-logs.model.ts
@@ -1,5 +1,5 @@
-import { IdName } from '../common';
-import { LicensesOption } from '../license.model';
+import { IdNameModel } from '../common/id-name.model';
+import { LicensesOption } from '../license/license.model';
export interface ActivityLog {
id: string;
@@ -10,7 +10,7 @@ export interface ActivityLog {
contributors: LogContributor[];
license?: string;
tag?: string;
- institution?: IdName;
+ institution?: IdNameModel;
paramsNode: { id: string; title: string };
paramsProject: null;
pointer: Pointer | null;
diff --git a/src/app/shared/models/activity-logs/index.ts b/src/app/shared/models/activity-logs/index.ts
deleted file mode 100644
index 93274a749..000000000
--- a/src/app/shared/models/activity-logs/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './activity-log-with-display.model';
-export * from './activity-logs.model';
-export * from './activity-logs-json-api.model';
diff --git a/src/app/shared/models/addons/addon-card.model.ts b/src/app/shared/models/addons/addon-card.model.ts
index c5bf0df24..1bc3d0a74 100644
--- a/src/app/shared/models/addons/addon-card.model.ts
+++ b/src/app/shared/models/addons/addon-card.model.ts
@@ -1,4 +1,5 @@
-import { AddonModel, ConfiguredAddonModel } from '@shared/models';
+import { AddonModel } from './addon.model';
+import { ConfiguredAddonModel } from './configured-addon.model';
export interface AddonCardModel {
id: string;
diff --git a/src/app/shared/models/addons/addon-json-api.models.ts b/src/app/shared/models/addons/addon-json-api.models.ts
index 68ed09b73..78c7a685f 100644
--- a/src/app/shared/models/addons/addon-json-api.models.ts
+++ b/src/app/shared/models/addons/addon-json-api.models.ts
@@ -10,6 +10,7 @@ export interface AddonGetResponseJsonApi {
credentials_format: string;
wb_key: string;
icon_url: string;
+ configurable_api_root: boolean;
[key: string]: unknown;
};
relationships: {
diff --git a/src/app/shared/models/addons/addon-utils.models.ts b/src/app/shared/models/addons/addon-utils.models.ts
index ac17caac5..2c0194832 100644
--- a/src/app/shared/models/addons/addon-utils.models.ts
+++ b/src/app/shared/models/addons/addon-utils.models.ts
@@ -1,7 +1,8 @@
import { FormControl } from '@angular/forms';
-import { AddonFormControls, OperationNames } from '@shared/enums';
-import { AuthorizedAccountModel } from '@shared/models';
+import { AddonFormControls } from '@osf/shared/enums/addon-form-controls.enum';
+import { OperationNames } from '@osf/shared/enums/operation-names.enum';
+import { AuthorizedAccountModel } from '@shared/models/addons/authorized-account.model';
export interface AddonForm {
[AddonFormControls.AccessKey]?: FormControl;
diff --git a/src/app/shared/models/addons/addon.model.ts b/src/app/shared/models/addons/addon.model.ts
index 90d17e5df..4f6a7c458 100644
--- a/src/app/shared/models/addons/addon.model.ts
+++ b/src/app/shared/models/addons/addon.model.ts
@@ -7,6 +7,7 @@ export interface AddonModel {
supportedFeatures?: string[];
providerName?: string;
credentialsFormat?: string;
+ configurableApiRoot?: boolean;
authUrl?: string | null;
authorizedCapabilities?: string[];
authorizedOperationNames?: string[];
diff --git a/src/app/shared/models/addons-query-params.model.ts b/src/app/shared/models/addons/addons-query-params.model.ts
similarity index 100%
rename from src/app/shared/models/addons-query-params.model.ts
rename to src/app/shared/models/addons/addons-query-params.model.ts
diff --git a/src/app/shared/models/addons/authorized-account.model.ts b/src/app/shared/models/addons/authorized-account.model.ts
index 749621aab..26d4654d5 100644
--- a/src/app/shared/models/addons/authorized-account.model.ts
+++ b/src/app/shared/models/addons/authorized-account.model.ts
@@ -1,4 +1,4 @@
-import { AddonModel } from '@shared/models';
+import { AddonModel } from './addon.model';
export interface AuthorizedAccountModel extends AddonModel {
authUrl: string | null;
diff --git a/src/app/shared/models/addons/configured-addon.model.ts b/src/app/shared/models/addons/configured-addon.model.ts
index b987d0c74..9c58895fc 100644
--- a/src/app/shared/models/addons/configured-addon.model.ts
+++ b/src/app/shared/models/addons/configured-addon.model.ts
@@ -1,4 +1,4 @@
-import { AddonModel } from '@shared/models';
+import { AddonModel } from './addon.model';
export interface ConfiguredAddonModel extends AddonModel {
connectedCapabilities: string[];
diff --git a/src/app/shared/models/addons/index.ts b/src/app/shared/models/addons/index.ts
deleted file mode 100644
index ab6a6d664..000000000
--- a/src/app/shared/models/addons/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export * from './addon.model';
-export * from './addon-card.model';
-export * from './addon-json-api.models';
-export * from './addon-operations-json-api.models';
-export * from './addon-utils.models';
-export * from './authorized-account.model';
-export * from './configured-addon.model';
-export * from './operation-invocation.model';
-export * from './storage-item.model';
diff --git a/src/app/shared/models/addons/operation-invocation.model.ts b/src/app/shared/models/addons/operation-invocation.model.ts
index c12943986..395ab68b1 100644
--- a/src/app/shared/models/addons/operation-invocation.model.ts
+++ b/src/app/shared/models/addons/operation-invocation.model.ts
@@ -1,4 +1,4 @@
-import { StorageItem } from '@shared/models';
+import { StorageItem } from './storage-item.model';
export interface OperationInvocation {
id: string;
diff --git a/src/app/shared/models/brand.json-api.model.ts b/src/app/shared/models/brand/brand.json-api.model.ts
similarity index 100%
rename from src/app/shared/models/brand.json-api.model.ts
rename to src/app/shared/models/brand/brand.json-api.model.ts
diff --git a/src/app/shared/models/brand.model.ts b/src/app/shared/models/brand/brand.model.ts
similarity index 87%
rename from src/app/shared/models/brand.model.ts
rename to src/app/shared/models/brand/brand.model.ts
index 8e0adb77f..77ccdb3e6 100644
--- a/src/app/shared/models/brand.model.ts
+++ b/src/app/shared/models/brand/brand.model.ts
@@ -1,4 +1,4 @@
-export interface Brand {
+export interface BrandModel {
id: string;
name: string;
heroLogoImageUrl: string;
diff --git a/src/app/shared/models/charts/index.ts b/src/app/shared/models/charts/index.ts
deleted file mode 100644
index 2d34ca989..000000000
--- a/src/app/shared/models/charts/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './dataset-input';
diff --git a/src/app/shared/models/citations/index.ts b/src/app/shared/models/citations/index.ts
deleted file mode 100644
index 2e1e085f4..000000000
--- a/src/app/shared/models/citations/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export * from './citation-style.model';
-export * from './citation-style-json-api.model';
-export * from './custom-citation-payload.model';
-export * from './custom-citation-payload-json-api.model';
-export * from './styled-citation.model';
-export * from './styled-citation-json-api.model';
diff --git a/src/app/shared/models/collections/collections-json-api.models.ts b/src/app/shared/models/collections/collections-json-api.models.ts
index aae2c8536..63fbd2eda 100644
--- a/src/app/shared/models/collections/collections-json-api.models.ts
+++ b/src/app/shared/models/collections/collections-json-api.models.ts
@@ -1,10 +1,8 @@
-import {
- BaseNodeDataJsonApi,
- BrandDataJsonApi,
- CollectionsProviderAttributesJsonApi,
- JsonApiResponse,
- UserDataErrorResponseJsonApi,
-} from '@shared/models';
+import { BrandDataJsonApi } from '../brand/brand.json-api.model';
+import { JsonApiResponse } from '../common/json-api.model';
+import { BaseNodeDataJsonApi } from '../nodes/base-node-data-json-api.model';
+import { CollectionsProviderAttributesJsonApi } from '../provider/collections-provider-json-api.model';
+import { UserDataErrorResponseJsonApi } from '../user/user-json-api.model';
export interface CollectionProviderResponseJsonApi {
id: string;
diff --git a/src/app/shared/models/collections/collections.models.ts b/src/app/shared/models/collections/collections.models.ts
index eba654ae7..887851807 100644
--- a/src/app/shared/models/collections/collections.models.ts
+++ b/src/app/shared/models/collections/collections.models.ts
@@ -1,8 +1,8 @@
import { CollectionSubmissionReviewAction } from '@osf/features/moderation/models';
-import { Brand } from '../brand.model';
-import { ContributorModel } from '../contributors';
-import { BaseProviderModel } from '../provider';
+import { BrandModel } from '../brand/brand.model';
+import { ContributorModel } from '../contributors/contributor.model';
+import { BaseProviderModel } from '../provider/provider.model';
export interface CollectionProvider extends BaseProviderModel {
assets: {
@@ -15,7 +15,7 @@ export interface CollectionProvider extends BaseProviderModel {
id: string;
type: string;
};
- brand: Brand | null;
+ brand: BrandModel | null;
}
export interface CollectionFilters {
diff --git a/src/app/shared/models/collections/index.ts b/src/app/shared/models/collections/index.ts
deleted file mode 100644
index 7f8a3362e..000000000
--- a/src/app/shared/models/collections/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export * from './collection-submission-payload.model';
-export * from './collection-submission-payload-json-api.model';
-export * from './collections.models';
-export * from './collections-filters.model';
-export * from './collections-json-api.models';
diff --git a/src/app/shared/models/common/id-name.model.ts b/src/app/shared/models/common/id-name.model.ts
index cffbdf870..1ca69b971 100644
--- a/src/app/shared/models/common/id-name.model.ts
+++ b/src/app/shared/models/common/id-name.model.ts
@@ -1,4 +1,4 @@
-export interface IdName {
+export interface IdNameModel {
id: string;
name: string;
}
diff --git a/src/app/shared/models/common/index.ts b/src/app/shared/models/common/index.ts
deleted file mode 100644
index 3a7369809..000000000
--- a/src/app/shared/models/common/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './id-name.model';
-export * from './id-type.model';
-export * from './json-api.model';
diff --git a/src/app/shared/models/components/component-json-api.model.ts b/src/app/shared/models/components/component-json-api.model.ts
index 3e865e94d..6930d78e8 100644
--- a/src/app/shared/models/components/component-json-api.model.ts
+++ b/src/app/shared/models/components/component-json-api.model.ts
@@ -1,5 +1,5 @@
-import { ContributorDataJsonApi } from '../contributors';
-import { BaseNodeDataJsonApi } from '../nodes';
+import { ContributorDataJsonApi } from '../contributors/contributor-response-json-api.model';
+import { BaseNodeDataJsonApi } from '../nodes/base-node-data-json-api.model';
export interface ComponentGetResponseJsonApi extends BaseNodeDataJsonApi {
embeds: {
diff --git a/src/app/shared/models/components/components.models.ts b/src/app/shared/models/components/components.models.ts
index 64869b1ac..517a7098c 100644
--- a/src/app/shared/models/components/components.models.ts
+++ b/src/app/shared/models/components/components.models.ts
@@ -1,6 +1,6 @@
-import { UserPermissions } from '@osf/shared/enums';
+import { UserPermissions } from '@osf/shared/enums/user-permissions.enum';
-import { ContributorModel } from '../contributors';
+import { ContributorModel } from '../contributors/contributor.model';
export interface ComponentOverview {
id: string;
diff --git a/src/app/shared/models/components/index.ts b/src/app/shared/models/components/index.ts
deleted file mode 100644
index c64708a72..000000000
--- a/src/app/shared/models/components/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './component-json-api.model';
-export * from './components.models';
diff --git a/src/app/shared/models/contributors/contributor-dialog-add.model.ts b/src/app/shared/models/contributors/contributor-dialog-add.model.ts
index 16997aa41..2b634c431 100644
--- a/src/app/shared/models/contributors/contributor-dialog-add.model.ts
+++ b/src/app/shared/models/contributors/contributor-dialog-add.model.ts
@@ -1,4 +1,4 @@
-import { AddContributorType } from '@osf/shared/enums';
+import { AddContributorType } from '@osf/shared/enums/contributors/add-contributor-type.enum';
import { ContributorAddModel } from './contributor-add.model';
diff --git a/src/app/shared/models/contributors/contributor-response-json-api.model.ts b/src/app/shared/models/contributors/contributor-response-json-api.model.ts
index 8563eca08..295d8608c 100644
--- a/src/app/shared/models/contributors/contributor-response-json-api.model.ts
+++ b/src/app/shared/models/contributors/contributor-response-json-api.model.ts
@@ -1,5 +1,7 @@
-import { ContributorPermission } from '@osf/shared/enums';
-import { ResponseJsonApi, UserDataJsonApi, UserErrorResponseJsonApi } from '@osf/shared/models';
+import { ContributorPermission } from '@osf/shared/enums/contributors/contributor-permission.enum';
+
+import { ResponseJsonApi } from '../common/json-api.model';
+import { UserDataJsonApi, UserErrorResponseJsonApi } from '../user/user-json-api.model';
export type ContributorResponseJsonApi = ResponseJsonApi;
export type ContributorsResponseJsonApi = ResponseJsonApi;
diff --git a/src/app/shared/models/contributors/contributor.model.ts b/src/app/shared/models/contributors/contributor.model.ts
index 8034565d6..74af72eaa 100644
--- a/src/app/shared/models/contributors/contributor.model.ts
+++ b/src/app/shared/models/contributors/contributor.model.ts
@@ -1,5 +1,6 @@
-import { ContributorPermission } from '@osf/shared/enums';
-import { Education, Employment } from '@osf/shared/models';
+import { ContributorPermission } from '@osf/shared/enums/contributors/contributor-permission.enum';
+import { Education } from '@osf/shared/models/user/education.model';
+import { Employment } from '@osf/shared/models/user/employment.model';
export interface ContributorModel {
id: string;
diff --git a/src/app/shared/models/contributors/index.ts b/src/app/shared/models/contributors/index.ts
deleted file mode 100644
index 7baca95c9..000000000
--- a/src/app/shared/models/contributors/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export * from './contributor.model';
-export * from './contributor-add.model';
-export * from './contributor-dialog-add.model';
-export * from './contributor-response-json-api.model';
-export * from './unregistered-contributor-form.model';
diff --git a/src/app/shared/models/current-resource.model.ts b/src/app/shared/models/current-resource.model.ts
index db1ab3faf..0bd36f242 100644
--- a/src/app/shared/models/current-resource.model.ts
+++ b/src/app/shared/models/current-resource.model.ts
@@ -1,4 +1,4 @@
-import { UserPermissions } from '../enums';
+import { UserPermissions } from '../enums/user-permissions.enum';
export interface CurrentResource {
id: string;
diff --git a/src/app/shared/models/emails/account-emails-json-api.model.ts b/src/app/shared/models/emails/account-emails-json-api.model.ts
index 6ac4ba918..9abfca42d 100644
--- a/src/app/shared/models/emails/account-emails-json-api.model.ts
+++ b/src/app/shared/models/emails/account-emails-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ResponseDataJsonApi, ResponseJsonApi } from '@osf/shared/models';
+import { ResponseDataJsonApi, ResponseJsonApi } from '../common/json-api.model';
export type EmailsResponseJsonApi = ResponseJsonApi;
diff --git a/src/app/shared/models/emails/index.ts b/src/app/shared/models/emails/index.ts
deleted file mode 100644
index 7e1b93b2b..000000000
--- a/src/app/shared/models/emails/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './account-email.model';
-export * from './account-emails-json-api.model';
diff --git a/src/app/shared/models/files/file-folder-json-api.model.ts b/src/app/shared/models/files/file-folder-json-api.model.ts
index a6d9544af..ce00e4671 100644
--- a/src/app/shared/models/files/file-folder-json-api.model.ts
+++ b/src/app/shared/models/files/file-folder-json-api.model.ts
@@ -1,6 +1,6 @@
-import { FileKind } from '@osf/shared/enums';
+import { FileKind } from '@osf/shared/enums/file-kind.enum';
-import { ResponseJsonApi } from '../common';
+import { ResponseJsonApi } from '../common/json-api.model';
export type FileFolderResponseJsonApi = ResponseJsonApi;
export type FileFoldersResponseJsonApi = ResponseJsonApi;
diff --git a/src/app/shared/models/files/file-folder.model.ts b/src/app/shared/models/files/file-folder.model.ts
index fd0477cbd..6b14648fd 100644
--- a/src/app/shared/models/files/file-folder.model.ts
+++ b/src/app/shared/models/files/file-folder.model.ts
@@ -1,4 +1,4 @@
-import { FileKind } from '@osf/shared/enums';
+import { FileKind } from '@osf/shared/enums/file-kind.enum';
export interface FileFolderModel {
id: string;
diff --git a/src/app/shared/models/files/file-json-api.model.ts b/src/app/shared/models/files/file-json-api.model.ts
index dc9db310b..e49c428b6 100644
--- a/src/app/shared/models/files/file-json-api.model.ts
+++ b/src/app/shared/models/files/file-json-api.model.ts
@@ -1,7 +1,7 @@
-import { FileKind } from '@osf/shared/enums';
+import { FileKind } from '@osf/shared/enums/file-kind.enum';
-import { ResponseJsonApi } from '../common';
-import { BaseNodeDataJsonApi } from '../nodes';
+import { ResponseJsonApi } from '../common/json-api.model';
+import { BaseNodeDataJsonApi } from '../nodes/base-node-data-json-api.model';
export type FileResponseJsonApi = ResponseJsonApi;
export type FilesResponseJsonApi = ResponseJsonApi;
diff --git a/src/app/shared/models/files/file-menu-action.model.ts b/src/app/shared/models/files/file-menu-action.model.ts
index f151e2f0e..3af0199df 100644
--- a/src/app/shared/models/files/file-menu-action.model.ts
+++ b/src/app/shared/models/files/file-menu-action.model.ts
@@ -1,4 +1,4 @@
-import { FileMenuType } from '@osf/shared/enums';
+import { FileMenuType } from '@osf/shared/enums/file-menu-type.enum';
export interface FileMenuAction {
value: FileMenuType;
diff --git a/src/app/shared/models/files/file-version-json-api.model.ts b/src/app/shared/models/files/file-version-json-api.model.ts
index 74448c706..ba0ded78a 100644
--- a/src/app/shared/models/files/file-version-json-api.model.ts
+++ b/src/app/shared/models/files/file-version-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ApiData, JsonApiResponse } from '@shared/models';
+import { ApiData, JsonApiResponse } from '../common/json-api.model';
export type FileVersionsResponseJsonApi = JsonApiResponse<
ApiData[],
diff --git a/src/app/shared/models/files/file.model.ts b/src/app/shared/models/files/file.model.ts
index 66f138fcf..c60efe6e8 100644
--- a/src/app/shared/models/files/file.model.ts
+++ b/src/app/shared/models/files/file.model.ts
@@ -1,4 +1,4 @@
-import { BaseNodeModel } from '../nodes';
+import { BaseNodeModel } from '../nodes/base-node.model';
import { FileKind } from './../../enums/file-kind.enum';
diff --git a/src/app/shared/models/files/index.ts b/src/app/shared/models/files/index.ts
deleted file mode 100644
index b7b6c2288..000000000
--- a/src/app/shared/models/files/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export * from './file.model';
-export * from './file-folder.model';
-export * from './file-folder-json-api.model';
-export * from './file-json-api.model';
-export * from './file-label.model';
-export * from './file-menu-action.model';
-export * from './file-payload-json-api.model';
-export * from './file-version.model';
-export * from './file-version-json-api.model';
-export * from './resource-files-links.model';
diff --git a/src/app/shared/models/guid-response-json-api.model.ts b/src/app/shared/models/guid-response-json-api.model.ts
index 375488956..708c61e77 100644
--- a/src/app/shared/models/guid-response-json-api.model.ts
+++ b/src/app/shared/models/guid-response-json-api.model.ts
@@ -1,6 +1,6 @@
-import { UserPermissions } from '../enums';
+import { UserPermissions } from '../enums/user-permissions.enum';
-import { JsonApiResponse } from './common';
+import { JsonApiResponse } from './common/json-api.model';
export type GuidedResponseJsonApi = JsonApiResponse;
diff --git a/src/app/shared/models/identifiers/identifier-json-api.model.ts b/src/app/shared/models/identifiers/identifier-json-api.model.ts
index 9f3b6524b..c62a4d9b5 100644
--- a/src/app/shared/models/identifiers/identifier-json-api.model.ts
+++ b/src/app/shared/models/identifiers/identifier-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ApiData, ResponseJsonApi } from '@shared/models';
+import { ApiData, ResponseJsonApi } from '../common/json-api.model';
export type IdentifiersResponseJsonApi = ResponseJsonApi;
export type IdentifiersJsonApiData = ApiData;
diff --git a/src/app/shared/models/identifiers/identifier.model.ts b/src/app/shared/models/identifiers/identifier.model.ts
index c15b35688..3095322ee 100644
--- a/src/app/shared/models/identifiers/identifier.model.ts
+++ b/src/app/shared/models/identifiers/identifier.model.ts
@@ -1,4 +1,4 @@
-export interface Identifier {
+export interface IdentifierModel {
id: string;
type: string;
category: string;
diff --git a/src/app/shared/models/identifiers/index.ts b/src/app/shared/models/identifiers/index.ts
deleted file mode 100644
index 7b4388155..000000000
--- a/src/app/shared/models/identifiers/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './identifier.model';
-export * from './identifier-json-api.model';
diff --git a/src/app/shared/models/index.ts b/src/app/shared/models/index.ts
deleted file mode 100644
index 789b99b07..000000000
--- a/src/app/shared/models/index.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-export * from './activity-logs';
-export * from './addons';
-export * from './addons-query-params.model';
-export * from './brand.json-api.model';
-export * from './brand.model';
-export * from './can-deactivate.interface';
-export * from './charts';
-export * from './citations';
-export * from './collections';
-export * from './common';
-export * from './component-checkbox-item.model';
-export * from './components';
-export * from './confirmation-options.model';
-export * from './contributors';
-export * from './create-component-form.model';
-export * from './current-resource.model';
-export * from './emails';
-export * from './files';
-export * from './google-drive-folder.model';
-export * from './guid-response-json-api.model';
-export * from './identifiers';
-export * from './institutions';
-export * from './language-code.model';
-export * from './license';
-export * from './license.model';
-export * from './licenses-json-api.model';
-export * from './meta-tags';
-export * from './metadata-tabs.model';
-export * from './my-resources';
-export * from './nodes';
-export * from './notifications';
-export * from './paginated-data.model';
-export * from './pagination-links.model';
-export * from './profile-settings-update.model';
-export * from './project-metadata-update-payload.model';
-export * from './projects';
-export * from './provider';
-export * from './query-params.model';
-export * from './regions';
-export * from './registration';
-export * from './request-access';
-export * from './resource-metadata.model';
-export * from './resource-overview.model';
-export * from './search';
-export * from './search-filters.model';
-export * from './select-option.model';
-export * from './severity.type';
-export * from './socials';
-export * from './status-info.model';
-export * from './step-option.model';
-export * from './store';
-export * from './subject';
-export * from './tab-option.model';
-export * from './table-parameters.model';
-export * from './toolbar-resource.model';
-export * from './tooltip-position.model';
-export * from './tutorial-step.model';
-export * from './user';
-export * from './user-related-counts';
-export * from './validation-params.model';
-export * from './view-only-links';
-export * from './wiki';
diff --git a/src/app/shared/models/institutions/index.ts b/src/app/shared/models/institutions/index.ts
deleted file mode 100644
index 1078a676e..000000000
--- a/src/app/shared/models/institutions/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './institution-json-api.model';
-export * from './institutions.models';
diff --git a/src/app/shared/models/institutions/institution-json-api.model.ts b/src/app/shared/models/institutions/institution-json-api.model.ts
index 9cadd88df..16f4b4226 100644
--- a/src/app/shared/models/institutions/institution-json-api.model.ts
+++ b/src/app/shared/models/institutions/institution-json-api.model.ts
@@ -1,4 +1,6 @@
-import { ApiData, InstitutionAssets, JsonApiResponse, ResponseJsonApi } from '@shared/models';
+import { ApiData, JsonApiResponse, ResponseJsonApi } from '../common/json-api.model';
+
+import { InstitutionAssets } from './institutions.models';
export type InstitutionsJsonApiResponse = JsonApiResponse;
export type InstitutionsWithMetaJsonApiResponse = ResponseJsonApi;
diff --git a/src/app/shared/models/license/index.ts b/src/app/shared/models/license/index.ts
deleted file mode 100644
index 10c39d296..000000000
--- a/src/app/shared/models/license/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './license-form.models';
diff --git a/src/app/shared/models/license.model.ts b/src/app/shared/models/license/license.model.ts
similarity index 100%
rename from src/app/shared/models/license.model.ts
rename to src/app/shared/models/license/license.model.ts
diff --git a/src/app/shared/models/licenses-json-api.model.ts b/src/app/shared/models/license/licenses-json-api.model.ts
similarity index 84%
rename from src/app/shared/models/licenses-json-api.model.ts
rename to src/app/shared/models/license/licenses-json-api.model.ts
index 38cdd75c1..62dac41ce 100644
--- a/src/app/shared/models/licenses-json-api.model.ts
+++ b/src/app/shared/models/license/licenses-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from './common';
+import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common/json-api.model';
export interface LicensesResponseJsonApi {
data: LicenseDataJsonApi[];
diff --git a/src/app/shared/models/meta-tags/index.ts b/src/app/shared/models/meta-tags/index.ts
deleted file mode 100644
index 3a2e07d5e..000000000
--- a/src/app/shared/models/meta-tags/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './head-tag-def.model';
-export * from './meta-tag-author.model';
-export * from './meta-tags-data.model';
diff --git a/src/app/shared/models/metadata-tabs.model.ts b/src/app/shared/models/metadata-tabs.model.ts
index 6f48b1db2..36e952364 100644
--- a/src/app/shared/models/metadata-tabs.model.ts
+++ b/src/app/shared/models/metadata-tabs.model.ts
@@ -1,4 +1,4 @@
-import { MetadataResourceEnum } from '../enums';
+import { MetadataResourceEnum } from '../enums/metadata-resource.enum';
export interface MetadataTabsModel {
id: string | 'osf';
diff --git a/src/app/shared/models/my-resources/index.ts b/src/app/shared/models/my-resources/index.ts
deleted file mode 100644
index e007cc622..000000000
--- a/src/app/shared/models/my-resources/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './my-resources.models';
-export * from './my-resources-endpoint.type';
-export * from './my-resources-search-filters.models';
diff --git a/src/app/shared/models/my-resources/my-resources-search-filters.models.ts b/src/app/shared/models/my-resources/my-resources-search-filters.models.ts
index d148d0c25..3e36d41b2 100644
--- a/src/app/shared/models/my-resources/my-resources-search-filters.models.ts
+++ b/src/app/shared/models/my-resources/my-resources-search-filters.models.ts
@@ -1,4 +1,4 @@
-import { SortOrder } from '@shared/enums';
+import { SortOrder } from '@shared/enums/sort-order.enum';
export type SearchField = 'tags' | 'title' | 'description';
diff --git a/src/app/shared/models/my-resources/my-resources.models.ts b/src/app/shared/models/my-resources/my-resources.models.ts
index e5f268377..6503e5fe2 100644
--- a/src/app/shared/models/my-resources/my-resources.models.ts
+++ b/src/app/shared/models/my-resources/my-resources.models.ts
@@ -1,4 +1,6 @@
-import { ContributorDataJsonApi, ContributorModel, ResponseJsonApi } from '@shared/models';
+import { ResponseJsonApi } from '../common/json-api.model';
+import { ContributorModel } from '../contributors/contributor.model';
+import { ContributorDataJsonApi } from '../contributors/contributor-response-json-api.model';
export type MyResourcesItemResponseJsonApi = ResponseJsonApi;
diff --git a/src/app/shared/models/node-links/index.ts b/src/app/shared/models/node-links/index.ts
deleted file mode 100644
index 90243b652..000000000
--- a/src/app/shared/models/node-links/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './node-link.model';
-export * from './node-link-json-api.model';
diff --git a/src/app/shared/models/nodes/base-node-attributes-json-api.model.ts b/src/app/shared/models/nodes/base-node-attributes-json-api.model.ts
index 0c7491853..416cf0b6c 100644
--- a/src/app/shared/models/nodes/base-node-attributes-json-api.model.ts
+++ b/src/app/shared/models/nodes/base-node-attributes-json-api.model.ts
@@ -1,4 +1,4 @@
-import { UserPermissions } from '@osf/shared/enums';
+import { UserPermissions } from '@osf/shared/enums/user-permissions.enum';
export interface BaseNodeAttributesJsonApi {
access_requests_enabled: boolean;
diff --git a/src/app/shared/models/nodes/base-node-data-json-api.model.ts b/src/app/shared/models/nodes/base-node-data-json-api.model.ts
index 89dfe5693..2c245943a 100644
--- a/src/app/shared/models/nodes/base-node-data-json-api.model.ts
+++ b/src/app/shared/models/nodes/base-node-data-json-api.model.ts
@@ -1,6 +1,5 @@
-import { BaseNodeEmbedsJsonApi } from '@shared/models';
-
import { BaseNodeAttributesJsonApi } from './base-node-attributes-json-api.model';
+import { BaseNodeEmbedsJsonApi } from './base-node-embeds-json-api.model';
import { BaseNodeLinksJsonApi } from './base-node-links-json-api.model';
import { BaseNodeRelationships } from './base-node-relationships-json-api.model';
diff --git a/src/app/shared/models/nodes/base-node-embeds-json-api.model.ts b/src/app/shared/models/nodes/base-node-embeds-json-api.model.ts
index ae0c580be..9d669401c 100644
--- a/src/app/shared/models/nodes/base-node-embeds-json-api.model.ts
+++ b/src/app/shared/models/nodes/base-node-embeds-json-api.model.ts
@@ -1,12 +1,10 @@
-import {
- BaseNodeDataJsonApi,
- ContributorDataJsonApi,
- IdentifierAttributes,
- IdentifiersJsonApiData,
- InstitutionDataJsonApi,
- LicenseDataJsonApi,
- RegionDataJsonApi,
-} from '@shared/models';
+import { ContributorDataJsonApi } from '../contributors/contributor-response-json-api.model';
+import { IdentifierAttributes, IdentifiersJsonApiData } from '../identifiers/identifier-json-api.model';
+import { InstitutionDataJsonApi } from '../institutions/institution-json-api.model';
+import { LicenseDataJsonApi } from '../license/licenses-json-api.model';
+import { RegionDataJsonApi } from '../regions/regions.json-api.model';
+
+import { BaseNodeDataJsonApi } from './base-node-data-json-api.model';
export interface BaseNodeEmbedsJsonApi {
affiliated_institutions?: {
diff --git a/src/app/shared/models/nodes/base-node.model.ts b/src/app/shared/models/nodes/base-node.model.ts
index 0ef9ccb0d..eabe83d65 100644
--- a/src/app/shared/models/nodes/base-node.model.ts
+++ b/src/app/shared/models/nodes/base-node.model.ts
@@ -1,6 +1,6 @@
-import { ContributorModel } from '@shared/models';
+import { ContributorModel } from '@shared/models/contributors/contributor.model';
-import { LicensesOption } from '../license.model';
+import { LicensesOption } from '../license/license.model';
export interface BaseNodeModel {
id: string;
diff --git a/src/app/shared/models/nodes/index.ts b/src/app/shared/models/nodes/index.ts
deleted file mode 100644
index 6f4b86606..000000000
--- a/src/app/shared/models/nodes/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export * from './base-node.model';
-export * from './base-node-attributes-json-api.model';
-export * from './base-node-data-json-api.model';
-export * from './base-node-embeds-json-api.model';
-export * from './base-node-links-json-api.model';
-export * from './base-node-relationships-json-api.model';
-export * from './node-with-children.model';
-export * from './nodes-json-api.model';
diff --git a/src/app/shared/models/nodes/node-with-children.model.ts b/src/app/shared/models/nodes/node-with-children.model.ts
index aef8c02bc..273e7c268 100644
--- a/src/app/shared/models/nodes/node-with-children.model.ts
+++ b/src/app/shared/models/nodes/node-with-children.model.ts
@@ -1,4 +1,4 @@
-import { UserPermissions } from '@osf/shared/enums';
+import { UserPermissions } from '@osf/shared/enums/user-permissions.enum';
export interface NodeShortInfoModel {
id: string;
diff --git a/src/app/shared/models/nodes/nodes-json-api.model.ts b/src/app/shared/models/nodes/nodes-json-api.model.ts
index 82b4ae0a6..a991acf70 100644
--- a/src/app/shared/models/nodes/nodes-json-api.model.ts
+++ b/src/app/shared/models/nodes/nodes-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ResponseJsonApi } from '../common';
+import { ResponseJsonApi } from '../common/json-api.model';
import { BaseNodeDataJsonApi } from './base-node-data-json-api.model';
diff --git a/src/app/shared/models/notifications/index.ts b/src/app/shared/models/notifications/index.ts
deleted file mode 100644
index 91dcdba7c..000000000
--- a/src/app/shared/models/notifications/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './notification-subscription.model';
-export * from './notification-subscription-json-api.model';
diff --git a/src/app/shared/models/notifications/notification-subscription-json-api.model.ts b/src/app/shared/models/notifications/notification-subscription-json-api.model.ts
index a3afd5695..61bc1781b 100644
--- a/src/app/shared/models/notifications/notification-subscription-json-api.model.ts
+++ b/src/app/shared/models/notifications/notification-subscription-json-api.model.ts
@@ -1,4 +1,4 @@
-import { SubscriptionFrequency } from '@osf/shared/enums';
+import { SubscriptionFrequency } from '@osf/shared/enums/subscriptions/subscription-frequency.enum';
export interface NotificationSubscriptionGetResponseJsonApi {
id: string;
diff --git a/src/app/shared/models/notifications/notification-subscription.model.ts b/src/app/shared/models/notifications/notification-subscription.model.ts
index 7cbefa654..931bde2f2 100644
--- a/src/app/shared/models/notifications/notification-subscription.model.ts
+++ b/src/app/shared/models/notifications/notification-subscription.model.ts
@@ -1,4 +1,5 @@
-import { SubscriptionEvent, SubscriptionFrequency } from '@osf/shared/enums';
+import { SubscriptionEvent } from '@osf/shared/enums/subscriptions/subscription-event.enum';
+import { SubscriptionFrequency } from '@osf/shared/enums/subscriptions/subscription-frequency.enum';
export interface NotificationSubscription {
id: string;
diff --git a/src/app/shared/models/profile-settings-update.model.ts b/src/app/shared/models/profile-settings-update.model.ts
index df4068c77..a80257609 100644
--- a/src/app/shared/models/profile-settings-update.model.ts
+++ b/src/app/shared/models/profile-settings-update.model.ts
@@ -1,4 +1,7 @@
-import { Education, Employment, SocialModel, UserModel } from './user';
+import { Education } from './user/education.model';
+import { Employment } from './user/employment.model';
+import { SocialModel } from './user/social.model';
+import { UserModel } from './user/user.models';
export type ProfileSettingsUpdate =
| Partial[]
diff --git a/src/app/shared/models/project-metadata-update-payload.model.ts b/src/app/shared/models/project-metadata-update-payload.model.ts
index d74e14fa2..c8ecb81a7 100644
--- a/src/app/shared/models/project-metadata-update-payload.model.ts
+++ b/src/app/shared/models/project-metadata-update-payload.model.ts
@@ -1,4 +1,4 @@
-import { LicenseOptions } from './license.model';
+import { LicenseOptions } from './license/license.model';
export interface ProjectMetadataUpdatePayload {
id: string;
diff --git a/src/app/shared/models/projects/create-project-form.model.ts b/src/app/shared/models/projects/create-project-form.model.ts
index 9eb174c5d..4575b3572 100644
--- a/src/app/shared/models/projects/create-project-form.model.ts
+++ b/src/app/shared/models/projects/create-project-form.model.ts
@@ -1,6 +1,6 @@
import { FormControl } from '@angular/forms';
-import { ProjectFormControls } from '@shared/enums';
+import { ProjectFormControls } from '@osf/shared/enums/create-project-form-controls.enum';
export interface ProjectForm {
[ProjectFormControls.Title]: FormControl;
diff --git a/src/app/shared/models/projects/index.ts b/src/app/shared/models/projects/index.ts
deleted file mode 100644
index ee6b89a9f..000000000
--- a/src/app/shared/models/projects/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './create-project-form.model';
-export * from './projects.models';
-export * from './projects-json-api.models';
diff --git a/src/app/shared/models/projects/projects-json-api.models.ts b/src/app/shared/models/projects/projects-json-api.models.ts
index 7336470ad..f8522ccf4 100644
--- a/src/app/shared/models/projects/projects-json-api.models.ts
+++ b/src/app/shared/models/projects/projects-json-api.models.ts
@@ -1,5 +1,5 @@
-import { JsonApiResponse, MetaJsonApi, PaginationLinksJsonApi } from '../common';
-import { LicenseRecordJsonApi } from '../licenses-json-api.model';
+import { JsonApiResponse, MetaJsonApi, PaginationLinksJsonApi } from '../common/json-api.model';
+import { LicenseRecordJsonApi } from '../license/licenses-json-api.model';
export interface ProjectJsonApi {
id: string;
diff --git a/src/app/shared/models/projects/projects.models.ts b/src/app/shared/models/projects/projects.models.ts
index 68be33269..cbb49d689 100644
--- a/src/app/shared/models/projects/projects.models.ts
+++ b/src/app/shared/models/projects/projects.models.ts
@@ -1,6 +1,6 @@
-import { StringOrNull } from '@osf/shared/helpers';
+import { StringOrNull } from '@osf/shared/helpers/types.helper';
-import { LicenseOptions } from '../license.model';
+import { LicenseOptions } from '../license/license.model';
export interface ProjectModel {
id: string;
diff --git a/src/app/shared/models/provider/base-provider-json-api.model.ts b/src/app/shared/models/provider/base-provider-json-api.model.ts
index 09c066b9c..29ab8c054 100644
--- a/src/app/shared/models/provider/base-provider-json-api.model.ts
+++ b/src/app/shared/models/provider/base-provider-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ReviewPermissions } from '@osf/shared/enums';
+import { ReviewPermissions } from '@osf/shared/enums/review-permissions.enum';
export interface BaseProviderAttributesJsonApi {
advisory_board: string;
diff --git a/src/app/shared/models/provider/index.ts b/src/app/shared/models/provider/index.ts
deleted file mode 100644
index 5968ef0a6..000000000
--- a/src/app/shared/models/provider/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export * from './base-provider-json-api.model';
-export * from './collections-provider-json-api.model';
-export * from './preprints-provider-json-api.model';
-export * from './provider.model';
-export * from './providers-json-api.model';
-export * from './registration-provider-json-api.model';
-export * from './registry-provider.model';
diff --git a/src/app/shared/models/provider/provider.model.ts b/src/app/shared/models/provider/provider.model.ts
index 68b9a860b..4ee7774f6 100644
--- a/src/app/shared/models/provider/provider.model.ts
+++ b/src/app/shared/models/provider/provider.model.ts
@@ -1,4 +1,5 @@
-import { CurrentResourceType, ReviewPermissions } from '@osf/shared/enums';
+import { CurrentResourceType } from '@osf/shared/enums/resource-type.enum';
+import { ReviewPermissions } from '@osf/shared/enums/review-permissions.enum';
export interface ProviderShortInfoModel {
id: string;
diff --git a/src/app/shared/models/provider/providers-json-api.model.ts b/src/app/shared/models/provider/providers-json-api.model.ts
index c31bb99f4..7ed7a2ac5 100644
--- a/src/app/shared/models/provider/providers-json-api.model.ts
+++ b/src/app/shared/models/provider/providers-json-api.model.ts
@@ -1,6 +1,6 @@
-import { ReviewPermissions } from '@osf/shared/enums';
+import { ReviewPermissions } from '@osf/shared/enums/review-permissions.enum';
-import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common';
+import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common/json-api.model';
export interface ProvidersResponseJsonApi {
data: ProviderDataJsonApi[];
diff --git a/src/app/shared/models/provider/registration-provider-json-api.model.ts b/src/app/shared/models/provider/registration-provider-json-api.model.ts
index b78154747..7135381b3 100644
--- a/src/app/shared/models/provider/registration-provider-json-api.model.ts
+++ b/src/app/shared/models/provider/registration-provider-json-api.model.ts
@@ -1,4 +1,4 @@
-import { BrandDataJsonApi } from '../brand.json-api.model';
+import { BrandDataJsonApi } from '../brand/brand.json-api.model';
import { BaseProviderAttributesJsonApi } from './base-provider-json-api.model';
diff --git a/src/app/shared/models/provider/registry-provider.model.ts b/src/app/shared/models/provider/registry-provider.model.ts
index c42f193e3..fabd9d824 100644
--- a/src/app/shared/models/provider/registry-provider.model.ts
+++ b/src/app/shared/models/provider/registry-provider.model.ts
@@ -1,12 +1,13 @@
-import { ReviewPermissions } from '@osf/shared/enums';
-import { Brand } from '@shared/models';
+import { ReviewPermissions } from '@osf/shared/enums/review-permissions.enum';
+
+import { BrandModel } from '../brand/brand.model';
export interface RegistryProviderDetails {
id: string;
name: string;
descriptionHtml: string;
permissions: ReviewPermissions[];
- brand: Brand | null;
+ brand: BrandModel | null;
iri: string;
reviewsWorkflow: string;
}
diff --git a/src/app/shared/models/query-params.model.ts b/src/app/shared/models/query-params.model.ts
index 2c70770d2..3a2567f88 100644
--- a/src/app/shared/models/query-params.model.ts
+++ b/src/app/shared/models/query-params.model.ts
@@ -1,4 +1,4 @@
-import { SortOrder } from '@shared/enums';
+import { SortOrder } from '@shared/enums/sort-order.enum';
export interface QueryParams {
page: number;
diff --git a/src/app/shared/models/regions/index.ts b/src/app/shared/models/regions/index.ts
deleted file mode 100644
index a87050d50..000000000
--- a/src/app/shared/models/regions/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './regions.json-api.model';
diff --git a/src/app/shared/models/regions/regions.json-api.model.ts b/src/app/shared/models/regions/regions.json-api.model.ts
index 290151b26..87645a2ae 100644
--- a/src/app/shared/models/regions/regions.json-api.model.ts
+++ b/src/app/shared/models/regions/regions.json-api.model.ts
@@ -1,4 +1,4 @@
-import { ResponseJsonApi } from '../common';
+import { ResponseJsonApi } from '../common/json-api.model';
export type RegionsResponseJsonApi = ResponseJsonApi;
diff --git a/src/app/shared/models/registration/draft-registration.model.ts b/src/app/shared/models/registration/draft-registration.model.ts
index 1e56b9efd..4d0230e0d 100644
--- a/src/app/shared/models/registration/draft-registration.model.ts
+++ b/src/app/shared/models/registration/draft-registration.model.ts
@@ -1,7 +1,7 @@
-import { UserPermissions } from '@shared/enums';
+import { UserPermissions } from '@shared/enums/user-permissions.enum';
-import { LicenseOptions } from '../license.model';
-import { ProjectModel } from '../projects';
+import { LicenseOptions } from '../license/license.model';
+import { ProjectModel } from '../projects/projects.models';
export interface DraftRegistrationModel {
id: string;
diff --git a/src/app/shared/models/registration/index.ts b/src/app/shared/models/registration/index.ts
deleted file mode 100644
index 26cb515b6..000000000
--- a/src/app/shared/models/registration/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export * from './draft-registration.model';
-export * from './page-schema.model';
-export * from './provider-schema.model';
-export * from './registration.model';
-export * from './registration-card.model';
-export * from './registration-json-api.model';
-export * from './registration-node.model';
-export * from './registration-node-json-api.model';
-export * from './schema-blocks-json-api.model';
-export * from './schema-response.model';
diff --git a/src/app/shared/models/registration/page-schema.model.ts b/src/app/shared/models/registration/page-schema.model.ts
index a235f5a92..0325972f4 100644
--- a/src/app/shared/models/registration/page-schema.model.ts
+++ b/src/app/shared/models/registration/page-schema.model.ts
@@ -1,4 +1,4 @@
-import { FieldType } from '@osf/shared/enums';
+import { FieldType } from '@osf/shared/enums/field-type.enum';
export interface PageSchema {
id: string;
diff --git a/src/app/shared/models/registration/registration-card.model.ts b/src/app/shared/models/registration/registration-card.model.ts
index af67f9011..65c5dd6cd 100644
--- a/src/app/shared/models/registration/registration-card.model.ts
+++ b/src/app/shared/models/registration/registration-card.model.ts
@@ -1,6 +1,9 @@
-import { RegistrationReviewStates, RegistryStatus, RevisionReviewStates, UserPermissions } from '@osf/shared/enums';
+import { RegistrationReviewStates } from '@osf/shared/enums/registration-review-states.enum';
+import { RegistryStatus } from '@osf/shared/enums/registry-status.enum';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
+import { UserPermissions } from '@osf/shared/enums/user-permissions.enum';
-import { ContributorModel } from '../contributors';
+import { ContributorModel } from '../contributors/contributor.model';
export interface RegistrationCard {
id: string;
diff --git a/src/app/shared/models/registration/registration-json-api.model.ts b/src/app/shared/models/registration/registration-json-api.model.ts
index 3b710fffb..1a6d64e12 100644
--- a/src/app/shared/models/registration/registration-json-api.model.ts
+++ b/src/app/shared/models/registration/registration-json-api.model.ts
@@ -1,8 +1,10 @@
-import { RegistrationReviewStates, RevisionReviewStates, UserPermissions } from '@osf/shared/enums';
+import { RegistrationReviewStates } from '@osf/shared/enums/registration-review-states.enum';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
+import { UserPermissions } from '@osf/shared/enums/user-permissions.enum';
-import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common';
-import { ContributorDataJsonApi } from '../contributors';
-import { LicenseRecordJsonApi } from '../licenses-json-api.model';
+import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common/json-api.model';
+import { ContributorDataJsonApi } from '../contributors/contributor-response-json-api.model';
+import { LicenseRecordJsonApi } from '../license/licenses-json-api.model';
export interface DraftRegistrationResponseJsonApi {
data: DraftRegistrationDataJsonApi;
diff --git a/src/app/shared/models/registration/registration-node-json-api.model.ts b/src/app/shared/models/registration/registration-node-json-api.model.ts
index f7f19b08d..f8402b799 100644
--- a/src/app/shared/models/registration/registration-node-json-api.model.ts
+++ b/src/app/shared/models/registration/registration-node-json-api.model.ts
@@ -1,6 +1,7 @@
-import { RegistrationReviewStates, RevisionReviewStates } from '@osf/shared/enums';
+import { RegistrationReviewStates } from '@osf/shared/enums/registration-review-states.enum';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
-import { BaseNodeAttributesJsonApi } from '../nodes';
+import { BaseNodeAttributesJsonApi } from '../nodes/base-node-attributes-json-api.model';
export interface RegistrationNodeAttributesJsonApi extends BaseNodeAttributesJsonApi {
archiving: boolean;
diff --git a/src/app/shared/models/registration/registration-node.model.ts b/src/app/shared/models/registration/registration-node.model.ts
index 08f80bce3..9f7dda0f2 100644
--- a/src/app/shared/models/registration/registration-node.model.ts
+++ b/src/app/shared/models/registration/registration-node.model.ts
@@ -1,6 +1,7 @@
-import { RegistrationReviewStates, RevisionReviewStates } from '@osf/shared/enums';
+import { RegistrationReviewStates } from '@osf/shared/enums/registration-review-states.enum';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
-import { BaseNodeModel } from '../nodes';
+import { BaseNodeModel } from '../nodes/base-node.model';
export interface RegistrationNodeModel extends BaseNodeModel {
archiving: boolean;
diff --git a/src/app/shared/models/registration/registration.model.ts b/src/app/shared/models/registration/registration.model.ts
index 864605bb3..5178078b8 100644
--- a/src/app/shared/models/registration/registration.model.ts
+++ b/src/app/shared/models/registration/registration.model.ts
@@ -1,9 +1,10 @@
-import { RegistryStatus, RevisionReviewStates } from '@osf/shared/enums';
+import { RegistryStatus } from '@osf/shared/enums/registry-status.enum';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
-import { IdTypeModel } from '../common';
-import { ContributorModel } from '../contributors';
-import { LicensesOption } from '../license.model';
-import { SubjectModel } from '../subject';
+import { IdTypeModel } from '../common/id-type.model';
+import { ContributorModel } from '../contributors/contributor.model';
+import { LicensesOption } from '../license/license.model';
+import { SubjectModel } from '../subject/subject.model';
export type RegistrationQuestions = Record;
diff --git a/src/app/shared/models/registration/schema-blocks-json-api.model.ts b/src/app/shared/models/registration/schema-blocks-json-api.model.ts
index ac6241eb1..f9c03177b 100644
--- a/src/app/shared/models/registration/schema-blocks-json-api.model.ts
+++ b/src/app/shared/models/registration/schema-blocks-json-api.model.ts
@@ -1,6 +1,6 @@
-import { BlockType } from '@osf/shared/enums';
+import { BlockType } from '@osf/shared/enums/block-type.enum';
-import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common';
+import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common/json-api.model';
export interface SchemaBlocksResponseJsonApi {
data: SchemaBlockJsonApi[];
diff --git a/src/app/shared/models/registration/schema-response.model.ts b/src/app/shared/models/registration/schema-response.model.ts
index 9aacbe3f4..085c8fddc 100644
--- a/src/app/shared/models/registration/schema-response.model.ts
+++ b/src/app/shared/models/registration/schema-response.model.ts
@@ -1,4 +1,4 @@
-import { RevisionReviewStates } from '@osf/shared/enums';
+import { RevisionReviewStates } from '@osf/shared/enums/revision-review-states.enum';
export interface SchemaResponse {
id: string;
diff --git a/src/app/shared/models/request-access/index.ts b/src/app/shared/models/request-access/index.ts
deleted file mode 100644
index 6cdbb5f96..000000000
--- a/src/app/shared/models/request-access/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './request-access.model';
-export * from './request-access-json-api.model';
-export * from './request-access-payload.model';
diff --git a/src/app/shared/models/request-access/request-access-json-api.model.ts b/src/app/shared/models/request-access/request-access-json-api.model.ts
index 02539ed84..83765b57e 100644
--- a/src/app/shared/models/request-access/request-access-json-api.model.ts
+++ b/src/app/shared/models/request-access/request-access-json-api.model.ts
@@ -1,7 +1,7 @@
-import { ContributorPermission } from '@osf/shared/enums';
+import { ContributorPermission } from '@osf/shared/enums/contributors/contributor-permission.enum';
-import { ResponseJsonApi } from '../common';
-import { UserDataErrorResponseJsonApi } from '../user';
+import { ResponseJsonApi } from '../common/json-api.model';
+import { UserDataErrorResponseJsonApi } from '../user/user-json-api.model';
export type RequestAccessResponseJsonApi = ResponseJsonApi;
diff --git a/src/app/shared/models/request-access/request-access-payload.model.ts b/src/app/shared/models/request-access/request-access-payload.model.ts
index d1617aed2..18c32a379 100644
--- a/src/app/shared/models/request-access/request-access-payload.model.ts
+++ b/src/app/shared/models/request-access/request-access-payload.model.ts
@@ -1,4 +1,4 @@
-import { ContributorPermission } from '@osf/shared/enums';
+import { ContributorPermission } from '@osf/shared/enums/contributors/contributor-permission.enum';
export interface RequestAccessPayload {
permissions: ContributorPermission;
diff --git a/src/app/shared/models/request-access/request-access.model.ts b/src/app/shared/models/request-access/request-access.model.ts
index a7752b795..0b3b5cf39 100644
--- a/src/app/shared/models/request-access/request-access.model.ts
+++ b/src/app/shared/models/request-access/request-access.model.ts
@@ -1,6 +1,6 @@
-import { ContributorPermission } from '@osf/shared/enums';
+import { ContributorPermission } from '@osf/shared/enums/contributors/contributor-permission.enum';
-import { UserModel } from '../user';
+import { UserModel } from '../user/user.models';
export interface RequestAccessModel {
id: string;
diff --git a/src/app/shared/models/resource-metadata.model.ts b/src/app/shared/models/resource-metadata.model.ts
index 411f6a845..b187fdb9a 100644
--- a/src/app/shared/models/resource-metadata.model.ts
+++ b/src/app/shared/models/resource-metadata.model.ts
@@ -1,4 +1,4 @@
-import { Identifier } from './identifiers';
+import { IdentifierModel } from './identifiers/identifier.model';
export interface ResourceMetadata {
title: string;
@@ -7,7 +7,7 @@ export interface ResourceMetadata {
dateModified: Date;
language: string;
resourceTypeGeneral: string;
- identifiers: Identifier[];
+ identifiers: IdentifierModel[];
funders: {
funderName: string;
funderIdentifier: string;
diff --git a/src/app/shared/models/resource-overview.model.ts b/src/app/shared/models/resource-overview.model.ts
index 7d0dfa7ff..3eb141058 100644
--- a/src/app/shared/models/resource-overview.model.ts
+++ b/src/app/shared/models/resource-overview.model.ts
@@ -1,9 +1,9 @@
-import { IdTypeModel } from './common';
-import { ContributorModel } from './contributors';
-import { Identifier } from './identifiers';
-import { Institution } from './institutions';
-import { LicensesOption } from './license.model';
-import { SubjectModel } from './subject';
+import { IdTypeModel } from './common/id-type.model';
+import { ContributorModel } from './contributors/contributor.model';
+import { IdentifierModel } from './identifiers/identifier.model';
+import { Institution } from './institutions/institutions.models';
+import { LicenseModel, LicensesOption } from './license/license.model';
+import { SubjectModel } from './subject/subject.model';
export interface ResourceOverview {
id: string;
@@ -22,18 +22,14 @@ export interface ResourceOverview {
tags: string[];
accessRequestsEnabled: boolean;
nodeLicense?: LicensesOption;
- license?: {
- name: string;
- text: string;
- url: string;
- };
+ license?: LicenseModel;
storage?: {
id: string;
type: string;
storageLimitStatus: string;
storageUsage: string;
};
- identifiers?: Identifier[];
+ identifiers?: IdentifierModel[];
supplements?: {
id: string;
type: string;
diff --git a/src/app/shared/models/review-action/index.ts b/src/app/shared/models/review-action/index.ts
deleted file mode 100644
index 5caee8c27..000000000
--- a/src/app/shared/models/review-action/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './review-action-payload.model';
-export * from './review-action-payload-json-api.model';
diff --git a/src/app/shared/models/review-action/review-action-payload-json-api.model.ts b/src/app/shared/models/review-action/review-action-payload-json-api.model.ts
index 308b3d7f0..4b13022dd 100644
--- a/src/app/shared/models/review-action/review-action-payload-json-api.model.ts
+++ b/src/app/shared/models/review-action/review-action-payload-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ReviewActionTrigger } from '@osf/shared/enums';
+import { ReviewActionTrigger } from '@osf/shared/enums/trigger-action.enum';
export interface ReviewActionPayloadJsonApi {
data: {
diff --git a/src/app/shared/models/review-action/review-action-payload.model.ts b/src/app/shared/models/review-action/review-action-payload.model.ts
index 54360e253..b32b1de71 100644
--- a/src/app/shared/models/review-action/review-action-payload.model.ts
+++ b/src/app/shared/models/review-action/review-action-payload.model.ts
@@ -1,4 +1,4 @@
-import { ReviewActionTrigger } from '@osf/shared/enums';
+import { ReviewActionTrigger } from '@osf/shared/enums/trigger-action.enum';
export interface ReviewActionPayload {
targetId: string;
diff --git a/src/app/shared/models/search-filters.model.ts b/src/app/shared/models/search-filters.model.ts
index 1ce3562c3..1c7ecdb77 100644
--- a/src/app/shared/models/search-filters.model.ts
+++ b/src/app/shared/models/search-filters.model.ts
@@ -1,4 +1,4 @@
-import { SortOrder } from '@shared/enums';
+import { SortOrder } from '../enums/sort-order.enum';
export interface SearchFilters {
searchValue: string;
diff --git a/src/app/shared/models/search/discaverable-filter.model.ts b/src/app/shared/models/search/discaverable-filter.model.ts
index 1f0b5259e..fb313ee49 100644
--- a/src/app/shared/models/search/discaverable-filter.model.ts
+++ b/src/app/shared/models/search/discaverable-filter.model.ts
@@ -1,7 +1,7 @@
export interface DiscoverableFilter {
key: string;
label: string;
- operator: FilterOperator;
+ operator: FilterOperatorOption;
options?: FilterOption[];
description?: string;
helpLink?: string;
@@ -13,7 +13,7 @@ export interface DiscoverableFilter {
isSearchLoading?: boolean;
}
-export enum FilterOperator {
+export enum FilterOperatorOption {
AnyOf = 'any-of',
Date = 'trove:at-date',
IsPresent = 'is-present',
diff --git a/src/app/shared/models/search/filter-options-json-api.models.ts b/src/app/shared/models/search/filter-options-json-api.models.ts
index 256be1d45..d9de2d9dd 100644
--- a/src/app/shared/models/search/filter-options-json-api.models.ts
+++ b/src/app/shared/models/search/filter-options-json-api.models.ts
@@ -1,6 +1,6 @@
-import { SearchResultDataJsonApi } from '@shared/models';
+import { ApiData } from '../common/json-api.model';
-import { ApiData } from '../common';
+import { SearchResultDataJsonApi } from './index-card-search-json-api.models';
export interface FilterOptionsResponseJsonApi {
data: FilterOptionsResponseData;
diff --git a/src/app/shared/models/search/index-card-search-json-api.models.ts b/src/app/shared/models/search/index-card-search-json-api.models.ts
index 340e4359e..331f98d75 100644
--- a/src/app/shared/models/search/index-card-search-json-api.models.ts
+++ b/src/app/shared/models/search/index-card-search-json-api.models.ts
@@ -1,4 +1,4 @@
-import { ApiData, JsonApiResponse } from '@shared/models';
+import { ApiData, JsonApiResponse } from '../common/json-api.model';
export type IndexCardSearchResponseJsonApi = JsonApiResponse<
{
diff --git a/src/app/shared/models/search/index.ts b/src/app/shared/models/search/index.ts
deleted file mode 100644
index 17f45f1de..000000000
--- a/src/app/shared/models/search/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export * from './discaverable-filter.model';
-export * from './filter-options-json-api.models';
-export * from './index-card-search-json-api.models';
-export * from './resource.model';
diff --git a/src/app/shared/models/search/resource.model.ts b/src/app/shared/models/search/resource.model.ts
index 542c095da..d5b9ba320 100644
--- a/src/app/shared/models/search/resource.model.ts
+++ b/src/app/shared/models/search/resource.model.ts
@@ -1,5 +1,5 @@
-import { ResourceType } from '@osf/shared/enums';
-import { StringOrNull } from '@shared/helpers';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { StringOrNull } from '@osf/shared/helpers/types.helper';
import { DiscoverableFilter } from './discaverable-filter.model';
diff --git a/src/app/shared/models/select-option.model.ts b/src/app/shared/models/select-option.model.ts
index 6768f2d38..652d0a778 100644
--- a/src/app/shared/models/select-option.model.ts
+++ b/src/app/shared/models/select-option.model.ts
@@ -1,4 +1,4 @@
-import { Primitive } from '../helpers';
+import { Primitive } from '../helpers/types.helper';
export interface SelectOption {
label: string;
diff --git a/src/app/shared/models/socials/index.ts b/src/app/shared/models/socials/index.ts
deleted file mode 100644
index 39949c806..000000000
--- a/src/app/shared/models/socials/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export * from './social-icon.model';
-export * from './social-platform-config.model';
-export * from './social-share-content.model';
-export * from './social-share-links.model';
-export * from './socials-share-action-item.model';
diff --git a/src/app/shared/models/store/index.ts b/src/app/shared/models/store/index.ts
deleted file mode 100644
index 3b5469b1b..000000000
--- a/src/app/shared/models/store/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export type { AsyncStateModel } from './async-state.model';
-export type { AsyncStateWithTotalCount } from './async-state-with-total-count.model';
diff --git a/src/app/shared/models/subject/index.ts b/src/app/shared/models/subject/index.ts
deleted file mode 100644
index 0088c2e47..000000000
--- a/src/app/shared/models/subject/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './subject.model';
-export * from './subjects-json-api.model';
diff --git a/src/app/shared/models/subject/subjects-json-api.model.ts b/src/app/shared/models/subject/subjects-json-api.model.ts
index c6b3e01e5..4e181fa38 100644
--- a/src/app/shared/models/subject/subjects-json-api.model.ts
+++ b/src/app/shared/models/subject/subjects-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common';
+import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common/json-api.model';
export interface SubjectsResponseJsonApi {
data: SubjectDataJsonApi[];
diff --git a/src/app/shared/models/table-parameters.model.ts b/src/app/shared/models/table-parameters.model.ts
index 97617946d..d806da52b 100644
--- a/src/app/shared/models/table-parameters.model.ts
+++ b/src/app/shared/models/table-parameters.model.ts
@@ -1,4 +1,4 @@
-import { SortOrder } from '../enums';
+import { SortOrder } from '../enums/sort-order.enum';
export interface TableParameters {
rows: number;
diff --git a/src/app/shared/models/toolbar-resource.model.ts b/src/app/shared/models/toolbar-resource.model.ts
index dd3f5b108..0d9e850e0 100644
--- a/src/app/shared/models/toolbar-resource.model.ts
+++ b/src/app/shared/models/toolbar-resource.model.ts
@@ -1,4 +1,4 @@
-import { ResourceType } from '@shared/enums';
+import { ResourceType } from '@shared/enums/resource-type.enum';
export interface ToolbarResource {
id: string;
diff --git a/src/app/shared/models/user-related-counts/index.ts b/src/app/shared/models/user-related-counts/index.ts
deleted file mode 100644
index 8688435f7..000000000
--- a/src/app/shared/models/user-related-counts/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './user-related-counts.model';
-export * from './user-related-counts-json-api.model';
diff --git a/src/app/shared/models/user-related-counts/user-related-counts-json-api.model.ts b/src/app/shared/models/user-related-counts/user-related-counts-json-api.model.ts
index 6d5ed6c67..4aa5586be 100644
--- a/src/app/shared/models/user-related-counts/user-related-counts-json-api.model.ts
+++ b/src/app/shared/models/user-related-counts/user-related-counts-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ApiData, JsonApiResponse } from '../common';
+import { ApiData, JsonApiResponse } from '../common/json-api.model';
export type UserRelatedCountsResponseJsonApi = JsonApiResponse<
ApiData<
diff --git a/src/app/shared/models/user/index.ts b/src/app/shared/models/user/index.ts
deleted file mode 100644
index 2fb58f7e0..000000000
--- a/src/app/shared/models/user/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export * from './date-sortable.model';
-export * from './education.model';
-export * from './employment.model';
-export * from './social.model';
-export * from './social-link-view.model';
-export * from './social-links.model';
-export * from './user.models';
-export * from './user-json-api.model';
diff --git a/src/app/shared/models/user/social-links.model.ts b/src/app/shared/models/user/social-links.model.ts
index f8ffb3ba3..7293ec76a 100644
--- a/src/app/shared/models/user/social-links.model.ts
+++ b/src/app/shared/models/user/social-links.model.ts
@@ -1,4 +1,4 @@
-import { SocialModel } from '@osf/shared/models';
+import { SocialModel } from './social.model';
export type SocialLinksKeys = keyof SocialModel;
diff --git a/src/app/shared/models/user/user-json-api.model.ts b/src/app/shared/models/user/user-json-api.model.ts
index 083d7dce7..fd2fc083f 100644
--- a/src/app/shared/models/user/user-json-api.model.ts
+++ b/src/app/shared/models/user/user-json-api.model.ts
@@ -1,4 +1,4 @@
-import { ResponseDataJsonApi } from '../common';
+import { ResponseDataJsonApi } from '../common/json-api.model';
import { Education } from './education.model';
import { Employment } from './employment.model';
diff --git a/src/app/shared/models/view-only-links/index.ts b/src/app/shared/models/view-only-links/index.ts
deleted file mode 100644
index 8bc5e3616..000000000
--- a/src/app/shared/models/view-only-links/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './view-only-link.model';
-export * from './view-only-link-response.model';
diff --git a/src/app/shared/models/view-only-links/view-only-link-response.model.ts b/src/app/shared/models/view-only-links/view-only-link-response.model.ts
index 6e29a67fc..06bbfb1a9 100644
--- a/src/app/shared/models/view-only-links/view-only-link-response.model.ts
+++ b/src/app/shared/models/view-only-links/view-only-link-response.model.ts
@@ -1,6 +1,6 @@
-import { MetaJsonApi } from '../common';
-import { BaseNodeDataJsonApi } from '../nodes';
-import { UserDataErrorResponseJsonApi } from '../user';
+import { MetaJsonApi } from '../common/json-api.model';
+import { BaseNodeDataJsonApi } from '../nodes/base-node-data-json-api.model';
+import { UserDataErrorResponseJsonApi } from '../user/user-json-api.model';
export interface ViewOnlyLinksResponseJsonApi {
data: ViewOnlyLinkJsonApi[];
diff --git a/src/app/shared/models/wiki/index.ts b/src/app/shared/models/wiki/index.ts
deleted file mode 100644
index 2d69f6ed8..000000000
--- a/src/app/shared/models/wiki/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './wiki.model';
-export * from './wiki-menu.model';
-export * from './wiki-type.model';
diff --git a/src/app/shared/models/wiki/wiki.model.ts b/src/app/shared/models/wiki/wiki.model.ts
index 2d9d16320..6223fde49 100644
--- a/src/app/shared/models/wiki/wiki.model.ts
+++ b/src/app/shared/models/wiki/wiki.model.ts
@@ -1,4 +1,4 @@
-import { JsonApiResponse, JsonApiResponseWithMeta, MetaAnonymousJsonApi } from '../common';
+import { JsonApiResponse, JsonApiResponseWithMeta, MetaAnonymousJsonApi } from '../common/json-api.model';
export enum WikiModes {
View = 'view',
@@ -6,14 +6,14 @@ export enum WikiModes {
Compare = 'compare',
}
-export interface Wiki {
+export interface WikiModel {
id: string;
name: string;
kind: string;
}
export interface WikisWithMeta {
- wikis: Wiki[];
+ wikis: WikiModel[];
meta: MetaAnonymousJsonApi;
}
@@ -26,7 +26,7 @@ export interface WikiVersion {
export interface ComponentWiki {
id: string;
title: string;
- list: Wiki[];
+ list: WikiModel[];
}
export interface HomeWiki {
diff --git a/src/app/shared/pipes/citation-format.pipe.ts b/src/app/shared/pipes/citation-format.pipe.ts
index 5f385fdaf..bee6f5c2f 100644
--- a/src/app/shared/pipes/citation-format.pipe.ts
+++ b/src/app/shared/pipes/citation-format.pipe.ts
@@ -1,6 +1,6 @@
import { Pipe, PipeTransform } from '@angular/core';
-import { UserModel } from '@osf/shared/models';
+import { UserModel } from '@osf/shared/models/user/user.models';
import { GENERATIONAL_SUFFIXES, ORDINAL_SUFFIXES } from '../constants/citation-suffix.const';
diff --git a/src/app/shared/pipes/index.ts b/src/app/shared/pipes/index.ts
deleted file mode 100644
index e2cd6c283..000000000
--- a/src/app/shared/pipes/index.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export { CitationFormatPipe } from './citation-format.pipe';
-export { DateAgoPipe } from './date-ago.pipe';
-export { DecodeHtmlPipe } from './decode-html.pipe';
-export { FileSizePipe } from './file-size.pipe';
-export { FixSpecialCharPipe } from './fix-special-char.pipe';
-export { InterpolatePipe } from './interpolate.pipe';
-export { MonthYearPipe } from './month-year.pipe';
-export { SafeHtmlPipe } from './safe-html.pipe';
-export { SafeUrlPipe } from './safe-url.pipe';
-export { SortByDatePipe } from './sort-by-date.pipe';
-export { WrapFnPipe } from './wrap-fn.pipe';
diff --git a/src/app/shared/pipes/sort-by-date.pipe.ts b/src/app/shared/pipes/sort-by-date.pipe.ts
index 653ffa268..d8a749454 100644
--- a/src/app/shared/pipes/sort-by-date.pipe.ts
+++ b/src/app/shared/pipes/sort-by-date.pipe.ts
@@ -1,6 +1,6 @@
import { Pipe, PipeTransform } from '@angular/core';
-import { DateSortable } from '../models';
+import { DateSortable } from '../models/user/date-sortable.model';
@Pipe({
name: 'sortByDate',
diff --git a/src/app/shared/services/activity-logs/activity-log-display.service.ts b/src/app/shared/services/activity-logs/activity-log-display.service.ts
index 808188d54..c1ebff194 100644
--- a/src/app/shared/services/activity-logs/activity-log-display.service.ts
+++ b/src/app/shared/services/activity-logs/activity-log-display.service.ts
@@ -3,7 +3,7 @@ import { TranslateService } from '@ngx-translate/core';
import { inject, Injectable } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
-import { ActivityLog } from '@shared/models';
+import { ActivityLog } from '@osf/shared/models/activity-logs/activity-logs.model';
import { ActivityLogFormatterService } from './activity-log-formatter.service';
diff --git a/src/app/shared/services/activity-logs/activity-log-formatter.service.ts b/src/app/shared/services/activity-logs/activity-log-formatter.service.ts
index 65d486d8a..7e3d026dc 100644
--- a/src/app/shared/services/activity-logs/activity-log-formatter.service.ts
+++ b/src/app/shared/services/activity-logs/activity-log-formatter.service.ts
@@ -2,7 +2,7 @@ import { TranslateService } from '@ngx-translate/core';
import { inject, Injectable } from '@angular/core';
-import { ActivityLog } from '@shared/models';
+import { ActivityLog } from '@osf/shared/models/activity-logs/activity-logs.model';
import { ActivityLogUrlBuilderService } from './activity-log-url-builder.service';
diff --git a/src/app/shared/services/activity-logs/activity-log-url-builder.service.ts b/src/app/shared/services/activity-logs/activity-log-url-builder.service.ts
index 90436c7c2..761d70e53 100644
--- a/src/app/shared/services/activity-logs/activity-log-url-builder.service.ts
+++ b/src/app/shared/services/activity-logs/activity-log-url-builder.service.ts
@@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
-import { ActivityLog } from '@shared/models';
+import { ActivityLog } from '@osf/shared/models/activity-logs/activity-logs.model';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/activity-logs/activity-logs.service.spec.ts b/src/app/shared/services/activity-logs/activity-logs.service.spec.ts
index c2b6908a2..4b32f5ba7 100644
--- a/src/app/shared/services/activity-logs/activity-logs.service.spec.ts
+++ b/src/app/shared/services/activity-logs/activity-logs.service.spec.ts
@@ -1,8 +1,7 @@
import { HttpTestingController } from '@angular/common/http/testing';
import { inject, TestBed } from '@angular/core/testing';
-import { ActivityLogDisplayService } from '@shared/services';
-
+import { ActivityLogDisplayService } from './activity-log-display.service';
import { ActivityLogsService } from './activity-logs.service';
import {
diff --git a/src/app/shared/services/activity-logs/activity-logs.service.ts b/src/app/shared/services/activity-logs/activity-logs.service.ts
index cc9ea64ad..98f26c473 100644
--- a/src/app/shared/services/activity-logs/activity-logs.service.ts
+++ b/src/app/shared/services/activity-logs/activity-logs.service.ts
@@ -4,15 +4,12 @@ import { map } from 'rxjs/operators';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { ActivityLogsMapper } from '@osf/shared/mappers';
-import {
- ActivityLog,
- ActivityLogJsonApi,
- ActivityLogWithDisplay,
- JsonApiResponseWithMeta,
- MetaAnonymousJsonApi,
- PaginatedData,
-} from '@osf/shared/models';
+import { ActivityLogsMapper } from '@osf/shared/mappers/activity-logs.mapper';
+import { ActivityLogWithDisplay } from '@osf/shared/models/activity-logs/activity-log-with-display.model';
+import { ActivityLog } from '@osf/shared/models/activity-logs/activity-logs.model';
+import { ActivityLogJsonApi } from '@osf/shared/models/activity-logs/activity-logs-json-api.model';
+import { JsonApiResponseWithMeta, MetaAnonymousJsonApi } from '@osf/shared/models/common/json-api.model';
+import { PaginatedData } from '@osf/shared/models/paginated-data.model';
import { JsonApiService } from '../json-api.service';
diff --git a/src/app/shared/services/activity-logs/index.ts b/src/app/shared/services/activity-logs/index.ts
deleted file mode 100644
index af659c147..000000000
--- a/src/app/shared/services/activity-logs/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export { ActivityLogDisplayService } from './activity-log-display.service';
-export { ActivityLogFormatterService } from './activity-log-formatter.service';
-export { ActivityLogUrlBuilderService } from './activity-log-url-builder.service';
-export { ActivityLogsService } from './activity-logs.service';
diff --git a/src/app/shared/services/addons-query-params.service.ts b/src/app/shared/services/addons-query-params.service.ts
index d9a35cf8a..8f390daae 100644
--- a/src/app/shared/services/addons-query-params.service.ts
+++ b/src/app/shared/services/addons-query-params.service.ts
@@ -1,9 +1,11 @@
import { inject, Injectable } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
-import { AddonCategory, AddonTabValue, AddonType } from '@shared/enums';
-import { addonCategoryToQueryParam, queryParamToAddonCategory } from '@shared/helpers';
-import { AddonsQueryParams } from '@shared/models';
+import { AddonTabValue } from '../enums/addon-tab.enum';
+import { AddonType } from '../enums/addon-type.enum';
+import { AddonCategory } from '../enums/addons-category.enum';
+import { addonCategoryToQueryParam, queryParamToAddonCategory } from '../helpers/addons-query-params.helper';
+import { AddonsQueryParams } from '../models/addons/addons-query-params.model';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/addons/addon-form.service.ts b/src/app/shared/services/addons/addon-form.service.ts
index 9f164b626..ce0fde96a 100644
--- a/src/app/shared/services/addons/addon-form.service.ts
+++ b/src/app/shared/services/addons/addon-form.service.ts
@@ -1,16 +1,18 @@
import { inject, Injectable } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
-import { isAuthorizedAddon } from '@osf/shared/helpers';
-import { AddonFormControls, AddonType, CredentialsFormat } from '@shared/enums';
+import { AddonFormControls } from '@osf/shared/enums/addon-form-controls.enum';
+import { AddonType } from '@osf/shared/enums/addon-type.enum';
+import { CredentialsFormat } from '@osf/shared/enums/addons-credentials-format.enum';
+import { isAuthorizedAddon } from '@osf/shared/helpers/addon-type.helper';
+import { AddonModel } from '@shared/models/addons/addon.model';
import {
- AddonForm,
- AddonModel,
- AuthorizedAccountModel,
AuthorizedAddonRequestJsonApi,
- ConfiguredAddonModel,
ConfiguredAddonRequestJsonApi,
-} from '@shared/models';
+} from '@shared/models/addons/addon-json-api.models';
+import { AddonForm } from '@shared/models/addons/addon-utils.models';
+import { AuthorizedAccountModel } from '@shared/models/addons/authorized-account.model';
+import { ConfiguredAddonModel } from '@shared/models/addons/configured-addon.model';
@Injectable({
providedIn: 'root',
@@ -26,6 +28,9 @@ export class AddonFormService {
const formControls: Partial = {
[AddonFormControls.AccountName]: this.formBuilder.control(addon.displayName || '', Validators.required),
};
+ if (addon.configurableApiRoot) {
+ formControls[AddonFormControls.HostUrl] = this.formBuilder.control('', Validators.required);
+ }
switch (addon.credentialsFormat) {
case CredentialsFormat.ACCESS_SECRET_KEYS:
@@ -33,16 +38,13 @@ export class AddonFormService {
formControls[AddonFormControls.SecretKey] = this.formBuilder.control('', Validators.required);
break;
case CredentialsFormat.DATAVERSE_API_TOKEN:
- formControls[AddonFormControls.HostUrl] = this.formBuilder.control('', Validators.required);
formControls[AddonFormControls.ApiToken] = this.formBuilder.control('', Validators.required);
break;
case CredentialsFormat.USERNAME_PASSWORD:
- formControls[AddonFormControls.HostUrl] = this.formBuilder.control('', Validators.required);
formControls[AddonFormControls.Username] = this.formBuilder.control('', Validators.required);
formControls[AddonFormControls.Password] = this.formBuilder.control('', Validators.required);
break;
case CredentialsFormat.REPO_TOKEN:
- formControls[AddonFormControls.HostUrl] = this.formBuilder.control('', Validators.required);
formControls[AddonFormControls.PersonalAccessToken] = this.formBuilder.control('', Validators.required);
break;
}
diff --git a/src/app/shared/services/addons/addon-oauth.service.ts b/src/app/shared/services/addons/addon-oauth.service.ts
index 5d9275254..d95fa3f48 100644
--- a/src/app/shared/services/addons/addon-oauth.service.ts
+++ b/src/app/shared/services/addons/addon-oauth.service.ts
@@ -3,8 +3,9 @@ import { createDispatchMap, select } from '@ngxs/store';
import { DestroyRef, inject, Injectable, signal } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
-import { AuthorizedAccountModel, OAuthCallbacks } from '@shared/models';
-import { AddonsSelectors, DeleteAuthorizedAddon, GetAuthorizedStorageOauthToken } from '@shared/stores/addons';
+import { OAuthCallbacks } from '@osf/shared/models/addons/addon-utils.models';
+import { AuthorizedAccountModel } from '@osf/shared/models/addons/authorized-account.model';
+import { AddonsSelectors, DeleteAuthorizedAddon, GetAuthorizedStorageOauthToken } from '@osf/shared/stores/addons';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/addons/addon-operation-invocation.service.ts b/src/app/shared/services/addons/addon-operation-invocation.service.ts
index d44f9c317..193f3cb57 100644
--- a/src/app/shared/services/addons/addon-operation-invocation.service.ts
+++ b/src/app/shared/services/addons/addon-operation-invocation.service.ts
@@ -1,8 +1,11 @@
import { Injectable } from '@angular/core';
-import { OperationNames, StorageItemType } from '@osf/shared/enums';
-import { isCitationAddon } from '@osf/shared/helpers';
-import { AuthorizedAccountModel, ConfiguredAddonModel, OperationInvocationRequestJsonApi } from '@shared/models';
+import { OperationNames } from '@osf/shared/enums/operation-names.enum';
+import { StorageItemType } from '@osf/shared/enums/storage-item-type.enum';
+import { isCitationAddon } from '@osf/shared/helpers/addon-type.helper';
+import { OperationInvocationRequestJsonApi } from '@shared/models/addons/addon-operations-json-api.models';
+import { AuthorizedAccountModel } from '@shared/models/addons/authorized-account.model';
+import { ConfiguredAddonModel } from '@shared/models/addons/configured-addon.model';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/addons/addons.service.spec.ts b/src/app/shared/services/addons/addons.service.spec.ts
index fc00d7d50..45355d7ba 100644
--- a/src/app/shared/services/addons/addons.service.spec.ts
+++ b/src/app/shared/services/addons/addons.service.spec.ts
@@ -42,6 +42,7 @@ describe('Service: Addons', () => {
supportedFeatures: ['DOWNLOAD_AS_ZIP', 'FORKING', 'LOGS', 'PERMISSIONS', 'REGISTERING'],
type: 'external-storage-services',
wbKey: 'figshare',
+ configurableApiRoot: false,
})
);
diff --git a/src/app/shared/services/addons/addons.service.ts b/src/app/shared/services/addons/addons.service.ts
index 1827c9ea4..d2e5c6ef7 100644
--- a/src/app/shared/services/addons/addons.service.ts
+++ b/src/app/shared/services/addons/addons.service.ts
@@ -8,26 +8,28 @@ import { inject, Injectable } from '@angular/core';
import { BYPASS_ERROR_INTERCEPTOR } from '@core/interceptors/error-interceptor.tokens';
import { ENVIRONMENT } from '@core/provider/environment.provider';
import { UserSelectors } from '@core/store/user';
-import { AddonMapper } from '@osf/shared/mappers';
+import { AddonMapper } from '@osf/shared/mappers/addon.mapper';
+import { AddonModel } from '@osf/shared/models/addons/addon.model';
import {
AddonGetResponseJsonApi,
- AddonModel,
- AuthorizedAccountModel,
AuthorizedAddonGetResponseJsonApi,
AuthorizedAddonRequestJsonApi,
AuthorizedAddonResponseJsonApi,
ConfiguredAddonGetResponseJsonApi,
- ConfiguredAddonModel,
ConfiguredAddonRequestJsonApi,
ConfiguredAddonResponseJsonApi,
IncludedAddonData,
- JsonApiResponse,
- OperationInvocation,
- OperationInvocationRequestJsonApi,
- OperationInvocationResponseJsonApi,
ResourceReferenceJsonApi,
UserReferenceJsonApi,
-} from '@osf/shared/models';
+} from '@osf/shared/models/addons/addon-json-api.models';
+import {
+ OperationInvocationRequestJsonApi,
+ OperationInvocationResponseJsonApi,
+} from '@osf/shared/models/addons/addon-operations-json-api.models';
+import { AuthorizedAccountModel } from '@osf/shared/models/addons/authorized-account.model';
+import { ConfiguredAddonModel } from '@osf/shared/models/addons/configured-addon.model';
+import { OperationInvocation } from '@osf/shared/models/addons/operation-invocation.model';
+import { JsonApiResponse } from '@osf/shared/models/common/json-api.model';
import { JsonApiService } from '../json-api.service';
diff --git a/src/app/shared/services/addons/index.ts b/src/app/shared/services/addons/index.ts
deleted file mode 100644
index 65ad799f6..000000000
--- a/src/app/shared/services/addons/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export { AddonFormService } from './addon-form.service';
-export { AddonOAuthService } from './addon-oauth.service';
-export { AddonOperationInvocationService } from './addon-operation-invocation.service';
-export { AddonsService } from './addons.service';
diff --git a/src/app/shared/services/analytics.service.ts b/src/app/shared/services/analytics.service.ts
index b7500870e..50364a5f1 100644
--- a/src/app/shared/services/analytics.service.ts
+++ b/src/app/shared/services/analytics.service.ts
@@ -3,7 +3,8 @@ import { Observable } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { JsonApiService } from '@osf/shared/services';
+
+import { JsonApiService } from './json-api.service';
@Injectable({ providedIn: 'root' })
export class AnalyticsService {
diff --git a/src/app/shared/services/banners.service.ts b/src/app/shared/services/banners.service.ts
index 4a48f613c..5589094b4 100644
--- a/src/app/shared/services/banners.service.ts
+++ b/src/app/shared/services/banners.service.ts
@@ -6,8 +6,8 @@ import { ENVIRONMENT } from '@core/provider/environment.provider';
import { BannerModel } from '../../core/components/osf-banners/models/banner.model';
import { BannerMapper } from '../mappers/banner.mapper';
-import { JsonApiResponse } from '../models';
import { BannerJsonApi } from '../models/banner.json-api.model';
+import { JsonApiResponse } from '../models/common/json-api.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/bookmarks.service.ts b/src/app/shared/services/bookmarks.service.ts
index 4e5de6275..8fa7885a0 100644
--- a/src/app/shared/services/bookmarks.service.ts
+++ b/src/app/shared/services/bookmarks.service.ts
@@ -1,11 +1,20 @@
-import { map, Observable } from 'rxjs';
+import { forkJoin, map, Observable } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { ResourceType } from '../enums';
-import { SparseCollectionsResponseJsonApi } from '../models';
+import { ResourceType } from '../enums/resource-type.enum';
+import { SortOrder } from '../enums/sort-order.enum';
+import { MyResourcesMapper } from '../mappers/my-resources.mapper';
+import { SparseCollectionsResponseJsonApi } from '../models/collections/collections-json-api.models';
+import {
+ MyResourcesItem,
+ MyResourcesItemGetResponseJsonApi,
+ MyResourcesResponseJsonApi,
+} from '../models/my-resources/my-resources.models';
+import { MyResourcesSearchFilters } from '../models/my-resources/my-resources-search-filters.models';
+import { PaginatedData } from '../models/paginated-data.model';
import { JsonApiService } from './json-api.service';
@@ -30,6 +39,11 @@ export class BookmarksService {
[ResourceType.Registration, 'registrations'],
]);
+ private sortFieldMap: Record = {
+ title: 'title',
+ dateModified: 'date_modified',
+ };
+
getBookmarksCollectionId(): Observable {
const params: Record = {
'fields[collections]': 'title,bookmarks',
@@ -45,6 +59,35 @@ export class BookmarksService {
);
}
+ getAllBookmarks(collectionId: string, filters?: MyResourcesSearchFilters) {
+ const params = this.buildCommonParams(filters);
+
+ return forkJoin({
+ projects: this.getResourceBookmarks(collectionId, ResourceType.Project, params),
+ registrations: this.getResourceBookmarks(collectionId, ResourceType.Registration, params),
+ }).pipe(
+ map(({ projects, registrations }) => {
+ const items = [...projects.data, ...registrations.data];
+ const data = this.sortBookmarks(items, filters?.sortColumn, filters?.sortOrder);
+ const totalCount = projects.meta.total + registrations.meta.total;
+
+ return { data, totalCount, pageSize: projects.meta.per_page } as PaginatedData;
+ })
+ );
+ }
+
+ getResourceBookmarks(collectionId: string, resourceType: ResourceType, params: Record = {}) {
+ const url = `${this.apiUrl}/collections/${collectionId}/${this.urlMap.get(resourceType)}/`;
+
+ return this.jsonApiService.get(url, params).pipe(
+ map((response: MyResourcesResponseJsonApi) => ({
+ data: response.data.map((item: MyResourcesItemGetResponseJsonApi) => MyResourcesMapper.fromResponse(item)),
+ links: response.links,
+ meta: response.meta,
+ }))
+ );
+ }
+
addResourceToBookmarks(bookmarksId: string, resourceId: string, resourceType: ResourceType): Observable {
const url = `${this.apiUrl}/collections/${bookmarksId}/relationships/${this.urlMap.get(resourceType)}/`;
const payload = { data: [{ type: this.resourceMap.get(resourceType), id: resourceId }] };
@@ -58,4 +101,38 @@ export class BookmarksService {
return this.jsonApiService.delete(url, payload);
}
+
+ private buildCommonParams(filters?: MyResourcesSearchFilters): Record {
+ const params: Record = {
+ 'embed[]': ['bibliographic_contributors'],
+ pageNumber: 1,
+ pageSize: 100,
+ };
+
+ if (filters?.searchValue && filters.searchFields?.length) {
+ params[`filter[${filters.searchFields.join(',')}]`] = filters.searchValue;
+ }
+
+ if (filters?.sortColumn && this.sortFieldMap[filters.sortColumn]) {
+ const apiField = this.sortFieldMap[filters.sortColumn];
+ const sortPrefix = filters.sortOrder === SortOrder.Desc ? '-' : '';
+ params['sort'] = `${sortPrefix}${apiField}`;
+ } else {
+ params['sort'] = '-date_modified';
+ }
+
+ return params;
+ }
+
+ private sortBookmarks(items: MyResourcesItem[], sortColumn = 'dateModified', direction = SortOrder.Desc) {
+ return items.sort((a, b) => {
+ if (sortColumn === 'title') {
+ return direction * (a.title ?? '').localeCompare(b.title ?? '', undefined, { sensitivity: 'base' });
+ }
+
+ const aTime = a.dateModified ? new Date(a.dateModified).getTime() : 0;
+ const bTime = b.dateModified ? new Date(b.dateModified).getTime() : 0;
+ return direction * (aTime - bTime);
+ });
+ }
}
diff --git a/src/app/shared/services/brand.service.ts b/src/app/shared/services/brand.service.ts
index 054dab0c9..72740585d 100644
--- a/src/app/shared/services/brand.service.ts
+++ b/src/app/shared/services/brand.service.ts
@@ -1,7 +1,7 @@
-import { Brand } from '@shared/models';
+import { BrandModel } from '../models/brand/brand.model';
export class BrandService {
- static applyBranding(brand: Brand): void {
+ static applyBranding(brand: BrandModel): void {
const root = document.documentElement;
root.style.setProperty('--branding-primary-color', brand.primaryColor);
diff --git a/src/app/shared/services/citations.service.ts b/src/app/shared/services/citations.service.ts
index d9a4ac815..b979fd4de 100644
--- a/src/app/shared/services/citations.service.ts
+++ b/src/app/shared/services/citations.service.ts
@@ -5,16 +5,14 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { ResourceType } from '../enums';
-import { CitationsMapper } from '../mappers';
-import {
- CitationStyle,
- CitationStyleJsonApi,
- CustomCitationPayload,
- JsonApiResponse,
- StyledCitation,
- StyledCitationJsonApi,
-} from '../models';
+import { ResourceType } from '../enums/resource-type.enum';
+import { CitationsMapper } from '../mappers/citations.mapper';
+import { CitationStyle } from '../models/citations/citation-style.model';
+import { CitationStyleJsonApi } from '../models/citations/citation-style-json-api.model';
+import { CustomCitationPayload } from '../models/citations/custom-citation-payload.model';
+import { StyledCitation } from '../models/citations/styled-citation.model';
+import { StyledCitationJsonApi } from '../models/citations/styled-citation-json-api.model';
+import { JsonApiResponse } from '../models/common/json-api.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/collections.service.ts b/src/app/shared/services/collections.service.ts
index 61923a48a..7c45394dc 100644
--- a/src/app/shared/services/collections.service.ts
+++ b/src/app/shared/services/collections.service.ts
@@ -12,28 +12,32 @@ import {
CollectionSubmissionReviewActionJsonApi,
} from '@osf/features/moderation/models';
-import { CollectionsMapper, ContributorsMapper, ReviewActionsMapper } from '../mappers';
+import { CollectionsMapper } from '../mappers/collections';
+import { ContributorsMapper } from '../mappers/contributors';
+import { ReviewActionsMapper } from '../mappers/review-actions.mapper';
import {
CollectionDetails,
- CollectionDetailsGetResponseJsonApi,
- CollectionDetailsResponseJsonApi,
CollectionProvider,
- CollectionProviderResponseJsonApi,
CollectionSubmission,
CollectionSubmissionActionType,
- CollectionSubmissionJsonApi,
- CollectionSubmissionsSearchPayloadJsonApi,
CollectionSubmissionTargetType,
CollectionSubmissionWithGuid,
+} from '../models/collections/collections.models';
+import {
+ CollectionDetailsGetResponseJsonApi,
+ CollectionDetailsResponseJsonApi,
+ CollectionProviderResponseJsonApi,
+ CollectionSubmissionJsonApi,
+ CollectionSubmissionsSearchPayloadJsonApi,
CollectionSubmissionWithGuidJsonApi,
- ContributorModel,
- ContributorsResponseJsonApi,
- JsonApiResponse,
- PaginatedData,
- ResponseJsonApi,
-} from '../models';
-import { ReviewActionPayload, ReviewActionPayloadJsonApi } from '../models/review-action';
-import { SetTotalSubmissions } from '../stores/collections';
+} from '../models/collections/collections-json-api.models';
+import { JsonApiResponse, ResponseJsonApi } from '../models/common/json-api.model';
+import { ContributorModel } from '../models/contributors/contributor.model';
+import { ContributorsResponseJsonApi } from '../models/contributors/contributor-response-json-api.model';
+import { PaginatedData } from '../models/paginated-data.model';
+import { ReviewActionPayload } from '../models/review-action/review-action-payload.model';
+import { ReviewActionPayloadJsonApi } from '../models/review-action/review-action-payload-json-api.model';
+import { SetTotalSubmissions } from '../stores/collections/collections.actions';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/contributors.service.ts b/src/app/shared/services/contributors.service.ts
index 7735c7f85..97c0fdcfb 100644
--- a/src/app/shared/services/contributors.service.ts
+++ b/src/app/shared/services/contributors.service.ts
@@ -4,18 +4,19 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { AddContributorType, ResourceType } from '../enums';
-import { ContributorsMapper } from '../mappers';
+import { AddContributorType } from '../enums/contributors/add-contributor-type.enum';
+import { ResourceType } from '../enums/resource-type.enum';
+import { ContributorsMapper } from '../mappers/contributors';
+import { ResponseJsonApi } from '../models/common/json-api.model';
+import { ContributorModel } from '../models/contributors/contributor.model';
+import { ContributorAddModel } from '../models/contributors/contributor-add.model';
import {
- ContributorAddModel,
ContributorDataJsonApi,
- ContributorModel,
ContributorResponseJsonApi,
ContributorsResponseJsonApi,
- PaginatedData,
- ResponseJsonApi,
- UserDataJsonApi,
-} from '../models';
+} from '../models/contributors/contributor-response-json-api.model';
+import { PaginatedData } from '../models/paginated-data.model';
+import { UserDataJsonApi } from '../models/user/user-json-api.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/csl-style-manager.service.ts b/src/app/shared/services/csl-style-manager.service.ts
index 794d530ab..633f4a843 100644
--- a/src/app/shared/services/csl-style-manager.service.ts
+++ b/src/app/shared/services/csl-style-manager.service.ts
@@ -2,7 +2,7 @@ import { catchError, from, Observable, of, switchMap, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { BUILT_IN_STYLES } from '@shared/constants';
+import { BUILT_IN_STYLES } from '../constants/built-in-citation-styles.const';
import { CitationsService } from './citations.service';
diff --git a/src/app/shared/services/custom-confirmation.service.ts b/src/app/shared/services/custom-confirmation.service.ts
index 8fbe16693..c02165f47 100644
--- a/src/app/shared/services/custom-confirmation.service.ts
+++ b/src/app/shared/services/custom-confirmation.service.ts
@@ -4,7 +4,11 @@ import { ConfirmationService } from 'primeng/api';
import { inject, Injectable } from '@angular/core';
-import { AcceptConfirmationOptions, ContinueConfirmationOptions, DeleteConfirmationOptions } from '../models';
+import {
+ AcceptConfirmationOptions,
+ ContinueConfirmationOptions,
+ DeleteConfirmationOptions,
+} from '../models/confirmation-options.model';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/datacite/datacite.service.spec.ts b/src/app/shared/services/datacite/datacite.service.spec.ts
index 6f13a7da6..229f0db72 100644
--- a/src/app/shared/services/datacite/datacite.service.spec.ts
+++ b/src/app/shared/services/datacite/datacite.service.spec.ts
@@ -6,13 +6,13 @@ import { TestBed } from '@angular/core/testing';
import { ENVIRONMENT } from '@core/provider/environment.provider';
import { SENTRY_TOKEN } from '@core/provider/sentry.provider';
-import { Identifier } from '@shared/models';
-import { DataciteEvent } from '@shared/models/datacite/datacite-event.enum';
+import { DataciteEvent } from '@osf/shared/enums/datacite/datacite-event.enum';
+import { IdentifierModel } from '@shared/models/identifiers/identifier.model';
import { DataciteService } from './datacite.service';
function buildObservable(doi: string) {
- return new Observable<{ identifiers?: Identifier[] } | null>((subscriber) => {
+ return new Observable<{ identifiers?: IdentifierModel[] } | null>((subscriber) => {
subscriber.next({});
subscriber.next({ identifiers: [] });
subscriber.next({
diff --git a/src/app/shared/services/datacite/datacite.service.ts b/src/app/shared/services/datacite/datacite.service.ts
index 565e4674d..935333b5c 100644
--- a/src/app/shared/services/datacite/datacite.service.ts
+++ b/src/app/shared/services/datacite/datacite.service.ts
@@ -5,8 +5,9 @@ import { inject, Injectable } from '@angular/core';
import { BYPASS_ERROR_INTERCEPTOR } from '@core/interceptors/error-interceptor.tokens';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { Identifier, IdentifiersResponseJsonApi } from '@osf/shared/models';
-import { DataciteEvent } from '@osf/shared/models/datacite/datacite-event.enum';
+import { DataciteEvent } from '@osf/shared/enums/datacite/datacite-event.enum';
+import { IdentifierModel } from '@osf/shared/models/identifiers/identifier.model';
+import { IdentifiersResponseJsonApi } from '@osf/shared/models/identifiers/identifier-json-api.model';
@Injectable({
providedIn: 'root',
@@ -27,11 +28,11 @@ export class DataciteService {
return this.environment.dataciteTrackerRepoId;
}
- logIdentifiableView(trackable: Observable<{ identifiers?: Identifier[] } | null>) {
+ logIdentifiableView(trackable: Observable<{ identifiers?: IdentifierModel[] } | null>) {
return this.watchIdentifiable(trackable, DataciteEvent.VIEW);
}
- logIdentifiableDownload(trackable: Observable<{ identifiers?: Identifier[] } | null>) {
+ logIdentifiableDownload(trackable: Observable<{ identifiers?: IdentifierModel[] } | null>) {
return this.watchIdentifiable(trackable, DataciteEvent.DOWNLOAD);
}
@@ -44,7 +45,7 @@ export class DataciteService {
}
private watchIdentifiable(
- trackable: Observable<{ identifiers?: Identifier[] } | null>,
+ trackable: Observable<{ identifiers?: IdentifierModel[] } | null>,
event: DataciteEvent
): Observable {
return trackable.pipe(
@@ -60,7 +61,7 @@ export class DataciteService {
const url = `${this.apiDomainUrl}/v2/${targetType}/${targetId}/identifiers`;
return this.http.get(url).pipe(
map((item) => ({
- identifiers: item.data.map((identifierData) => ({
+ identifiers: item.data.map((identifierData) => ({
id: identifierData.id,
type: identifierData.type,
category: identifierData.attributes.category,
diff --git a/src/app/shared/services/duplicates.service.ts b/src/app/shared/services/duplicates.service.ts
index df29dc98e..b4c779424 100644
--- a/src/app/shared/services/duplicates.service.ts
+++ b/src/app/shared/services/duplicates.service.ts
@@ -5,8 +5,11 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { BaseNodeMapper } from '../mappers';
-import { BaseNodeDataJsonApi, NodeModel, PaginatedData, ResponseJsonApi } from '../models';
+import { BaseNodeMapper } from '../mappers/nodes';
+import { ResponseJsonApi } from '../models/common/json-api.model';
+import { NodeModel } from '../models/nodes/base-node.model';
+import { BaseNodeDataJsonApi } from '../models/nodes/base-node-data-json-api.model';
+import { PaginatedData } from '../models/paginated-data.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/files.service.ts b/src/app/shared/services/files.service.ts
index 5d16ed623..988adbcc1 100644
--- a/src/app/shared/services/files.service.ts
+++ b/src/app/shared/services/files.service.ts
@@ -16,41 +16,39 @@ import {
OsfFileRevision,
PatchFileMetadata,
} from '@osf/features/files/models';
+
+import { FileKind } from '../enums/file-kind.enum';
+import { AddonMapper } from '../mappers/addon.mapper';
+import { ContributorsMapper } from '../mappers/contributors';
+import { FilesMapper } from '../mappers/files/files.mapper';
+import { AddonModel } from '../models/addons/addon.model';
+import { AddonGetResponseJsonApi, ConfiguredAddonGetResponseJsonApi } from '../models/addons/addon-json-api.models';
+import { ConfiguredAddonModel } from '../models/addons/configured-addon.model';
+import { ApiData, JsonApiResponse, MetaJsonApi } from '../models/common/json-api.model';
+import { ContributorModel } from '../models/contributors/contributor.model';
+import { ContributorsResponseJsonApi } from '../models/contributors/contributor-response-json-api.model';
+import { FileDetailsModel, FileModel } from '../models/files/file.model';
+import { FileFolderModel } from '../models/files/file-folder.model';
import {
- AddonGetResponseJsonApi,
- AddonModel,
- ApiData,
- ConfiguredAddonGetResponseJsonApi,
- ConfiguredAddonModel,
- ContributorModel,
- ContributorsResponseJsonApi,
- FileDetailsModel,
- FileDetailsResponseJsonApi,
FileFolderDataJsonApi,
- FileFolderModel,
FileFolderResponseJsonApi,
FileFoldersResponseJsonApi,
- FileModel,
+} from '../models/files/file-folder-json-api.model';
+import {
+ FileDetailsResponseJsonApi,
FileResponseJsonApi,
FilesResponseJsonApi,
- FileVersionModel,
- FileVersionsResponseJsonApi,
- JsonApiResponse,
- MetaJsonApi,
-} from '@shared/models';
-
-import { FileKind } from '../enums';
-import { AddonMapper, ContributorsMapper, FilesMapper } from '../mappers';
+} from '../models/files/file-json-api.model';
+import { FileVersionModel } from '../models/files/file-version.model';
+import { FileVersionsResponseJsonApi } from '../models/files/file-version-json-api.model';
import { JsonApiService } from './json-api.service';
-import { ToastService } from './toast.service';
@Injectable({
providedIn: 'root',
})
export class FilesService {
readonly jsonApiService = inject(JsonApiService);
- readonly toastService = inject(ToastService);
private readonly environment = inject(ENVIRONMENT);
get apiUrl() {
diff --git a/src/app/shared/services/global-search.service.ts b/src/app/shared/services/global-search.service.ts
index 3271bf229..dce5596df 100644
--- a/src/app/shared/services/global-search.service.ts
+++ b/src/app/shared/services/global-search.service.ts
@@ -3,17 +3,17 @@ import { map, Observable } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { MapResources } from '@shared/mappers/search';
+
+import { mapFilterOptions } from '../mappers/filters/filter-option.mapper';
+import { MapFilters } from '../mappers/filters/filters.mapper';
+import { MapResources } from '../mappers/search';
+import { FilterOption } from '../models/search/discaverable-filter.model';
+import { FilterOptionItem, FilterOptionsResponseJsonApi } from '../models/search/filter-options-json-api.models';
import {
- FilterOption,
- FilterOptionItem,
- FilterOptionsResponseJsonApi,
IndexCardSearchResponseJsonApi,
- ResourcesData,
SearchResultDataJsonApi,
-} from '@shared/models';
-
-import { mapFilterOptions, MapFilters } from '../mappers';
+} from '../models/search/index-card-search-json-api.models';
+import { ResourcesData } from '../models/search/resource.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/index.ts b/src/app/shared/services/index.ts
deleted file mode 100644
index fd60bfa4a..000000000
--- a/src/app/shared/services/index.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-export * from './activity-logs';
-export * from './addons';
-export { AnalyticsService } from './analytics.service';
-export { BookmarksService } from './bookmarks.service';
-export { BrandService } from './brand.service';
-export { CitationsService } from './citations.service';
-export { CollectionsService } from './collections.service';
-export { ContributorsService } from './contributors.service';
-export { CslStyleManagerService } from './csl-style-manager.service';
-export { CustomConfirmationService } from './custom-confirmation.service';
-export { CustomDialogService } from './custom-dialog.service';
-export { DuplicatesService } from './duplicates.service';
-export { FilesService } from './files.service';
-export { GlobalSearchService } from './global-search.service';
-export { GoogleFilePickerDownloadService } from './google-file-picker.download.service';
-export { InstitutionsService } from './institutions.service';
-export { JsonApiService } from './json-api.service';
-export { LicensesService } from './licenses.service';
-export { LoaderService } from './loader.service';
-export { MenuManagerService } from './menu-manager.service';
-export { MetaTagsService } from './meta-tags.service';
-export { MetadataRecordsService } from './metadata-records.service';
-export { MyResourcesService } from './my-resources.service';
-export { NodeLinksService } from './node-links.service';
-export { ProjectRedirectDialogService } from './project-redirect-dialog.service';
-export { RegionsService } from './regions.service';
-export { RegistrationProviderService } from './registration-provider.service';
-export { RequestAccessService } from './request-access.service';
-export { ResourceGuidService } from './resource.service';
-export { ResourceCardService } from './resource-card.service';
-export { SocialShareService } from './social-share.service';
-export { SubjectsService } from './subjects.service';
-export { ToastService } from './toast.service';
-export { ViewOnlyLinksService } from './view-only-links.service';
-export { WikiService } from './wiki.service';
diff --git a/src/app/shared/services/institutions.service.ts b/src/app/shared/services/institutions.service.ts
index 6669a9d37..9858f02f2 100644
--- a/src/app/shared/services/institutions.service.ts
+++ b/src/app/shared/services/institutions.service.ts
@@ -4,15 +4,15 @@ import { map } from 'rxjs/operators';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { ResourceType } from '@shared/enums';
-import { InstitutionsMapper } from '@shared/mappers';
+
+import { ResourceType } from '../enums/resource-type.enum';
+import { InstitutionsMapper } from '../mappers/institutions';
import {
- Institution,
InstitutionJsonApiResponse,
InstitutionsJsonApiResponse,
InstitutionsWithMetaJsonApiResponse,
- InstitutionsWithTotalCount,
-} from '@shared/models';
+} from '../models/institutions/institution-json-api.model';
+import { Institution, InstitutionsWithTotalCount } from '../models/institutions/institutions.models';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/json-api.service.ts b/src/app/shared/services/json-api.service.ts
index 22f5650eb..cb5735df8 100644
--- a/src/app/shared/services/json-api.service.ts
+++ b/src/app/shared/services/json-api.service.ts
@@ -3,7 +3,7 @@ import { map, Observable } from 'rxjs';
import { HttpClient, HttpContext, HttpEvent, HttpParams } from '@angular/common/http';
import { inject, Injectable } from '@angular/core';
-import { JsonApiResponse } from '@osf/shared/models';
+import { JsonApiResponse } from '@osf/shared/models/common/json-api.model';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/licenses.service.ts b/src/app/shared/services/licenses.service.ts
index 5d8bbc91b..505b546cc 100644
--- a/src/app/shared/services/licenses.service.ts
+++ b/src/app/shared/services/licenses.service.ts
@@ -4,8 +4,10 @@ import { HttpClient } from '@angular/common/http';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { LicensesMapper } from '@shared/mappers';
-import { LicenseModel, LicensesResponseJsonApi } from '@shared/models';
+
+import { LicensesMapper } from '../mappers/licenses.mapper';
+import { LicenseModel } from '../models/license/license.model';
+import { LicensesResponseJsonApi } from '../models/license/licenses-json-api.model';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/linked-projects.service.ts b/src/app/shared/services/linked-projects.service.ts
index d7ecf265e..0c1ae59c1 100644
--- a/src/app/shared/services/linked-projects.service.ts
+++ b/src/app/shared/services/linked-projects.service.ts
@@ -5,8 +5,11 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { BaseNodeMapper } from '../mappers';
-import { BaseNodeDataJsonApi, NodeModel, PaginatedData, ResponseJsonApi } from '../models';
+import { BaseNodeMapper } from '../mappers/nodes';
+import { ResponseJsonApi } from '../models/common/json-api.model';
+import { NodeModel } from '../models/nodes/base-node.model';
+import { BaseNodeDataJsonApi } from '../models/nodes/base-node-data-json-api.model';
+import { PaginatedData } from '../models/paginated-data.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/meta-tags.service.ts b/src/app/shared/services/meta-tags.service.ts
index 02443477d..8cea2c55d 100644
--- a/src/app/shared/services/meta-tags.service.ts
+++ b/src/app/shared/services/meta-tags.service.ts
@@ -1,13 +1,17 @@
import { catchError, map, Observable, of, switchMap, tap } from 'rxjs';
import { DOCUMENT } from '@angular/common';
-import { DestroyRef, Inject, inject, Injectable } from '@angular/core';
+import { DestroyRef, effect, Inject, inject, Injectable, signal } from '@angular/core';
import { Meta, MetaDefinition, Title } from '@angular/platform-browser';
import { ENVIRONMENT } from '@core/provider/environment.provider';
+import { PrerenderReadyService } from '@core/services/prerender-ready.service';
+import { replaceBadEncodedChars } from '@osf/shared/helpers/format-bad-encoding.helper';
-import { MetadataRecordFormat } from '../enums';
-import { Content, DataContent, HeadTagDef, MetaTagAuthor, MetaTagsData } from '../models/meta-tags';
+import { MetadataRecordFormat } from '../enums/metadata-record-format.enum';
+import { HeadTagDef } from '../models/meta-tags/head-tag-def.model';
+import { MetaTagAuthor } from '../models/meta-tags/meta-tag-author.model';
+import { Content, DataContent, MetaTagsData } from '../models/meta-tags/meta-tags-data.model';
import { MetadataRecordsService } from './metadata-records.service';
@@ -17,6 +21,7 @@ import { MetadataRecordsService } from './metadata-records.service';
export class MetaTagsService {
private readonly metadataRecords: MetadataRecordsService = inject(MetadataRecordsService);
private readonly environment = inject(ENVIRONMENT);
+ private readonly prerenderReady = inject(PrerenderReadyService);
get webUrl() {
return this.environment.webUrl;
@@ -50,11 +55,19 @@ export class MetaTagsService {
private metaTagStack: { metaTagsData: MetaTagsData; componentDestroyRef: DestroyRef }[] = [];
+ areMetaTagsApplied = signal(false);
+
constructor(
private meta: Meta,
private title: Title,
@Inject(DOCUMENT) private document: Document
- ) {}
+ ) {
+ effect(() => {
+ if (this.areMetaTagsApplied()) {
+ this.prerenderReady.setReady();
+ }
+ });
+ }
updateMetaTags(metaTagsData: MetaTagsData, componentDestroyRef: DestroyRef): void {
this.metaTagStack = [...this.metaTagStackWithout(componentDestroyRef), { metaTagsData, componentDestroyRef }];
@@ -69,6 +82,8 @@ export class MetaTagsService {
const elementsToRemove = this.document.querySelectorAll(`.${this.metaTagClass}`);
if (elementsToRemove.length === 0) {
+ this.areMetaTagsApplied.set(false);
+ this.prerenderReady.setNotReady();
return;
}
@@ -79,6 +94,8 @@ export class MetaTagsService {
});
this.title.setTitle(String(this.defaultMetaTags.siteName));
+ this.areMetaTagsApplied.set(false);
+ this.prerenderReady.setNotReady();
}
private metaTagStackWithout(destroyRefToRemove: DestroyRef) {
@@ -95,6 +112,8 @@ export class MetaTagsService {
}
private applyMetaTagsData(metaTagsData: MetaTagsData) {
+ this.areMetaTagsApplied.set(false);
+ this.prerenderReady.setNotReady();
const combinedData = { ...this.defaultMetaTags, ...metaTagsData };
const headTags = this.getHeadTags(combinedData);
of(metaTagsData.osfGuid)
@@ -111,8 +130,11 @@ export class MetaTagsService {
)
: of(null)
),
- tap(() => this.applyHeadTags(headTags)),
- tap(() => this.dispatchZoteroEvent())
+ tap(() => {
+ this.applyHeadTags(headTags);
+ this.areMetaTagsApplied.set(true);
+ this.dispatchZoteroEvent();
+ })
)
.subscribe();
}
@@ -253,7 +275,8 @@ export class MetaTagsService {
const titleTag = headTags.find((tag) => tag.attrs.name === 'citation_title');
if (titleTag?.attrs.content) {
- this.title.setTitle(`${String(this.defaultMetaTags.siteName)} | ${String(titleTag.attrs.content)}`);
+ const title = `${String(this.defaultMetaTags.siteName)} | ${String(titleTag.attrs.content)}`;
+ this.title.setTitle(replaceBadEncodedChars(title));
}
}
}
diff --git a/src/app/shared/services/metadata-records.service.ts b/src/app/shared/services/metadata-records.service.ts
index 631804167..64e31ef2c 100644
--- a/src/app/shared/services/metadata-records.service.ts
+++ b/src/app/shared/services/metadata-records.service.ts
@@ -5,7 +5,7 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { MetadataRecordFormat } from '../enums';
+import { MetadataRecordFormat } from '../enums/metadata-record-format.enum';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/my-resources.service.ts b/src/app/shared/services/my-resources.service.ts
index 60c9d6723..b36e20f37 100644
--- a/src/app/shared/services/my-resources.service.ts
+++ b/src/app/shared/services/my-resources.service.ts
@@ -1,22 +1,23 @@
-import { EMPTY, Observable } from 'rxjs';
+import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { MyResourcesMapper } from '@osf/features/my-projects/mappers';
-import { ResourceSearchMode, ResourceType, SortOrder } from '../enums';
+import { ResourceSearchMode } from '../enums/resource-search-mode.enum';
+import { SortOrder } from '../enums/sort-order.enum';
+import { MyResourcesMapper } from '../mappers/my-resources.mapper';
+import { JsonApiResponse } from '../models/common/json-api.model';
import {
- CreateProjectPayloadJsoApi,
- EndpointType,
- JsonApiResponse,
MyResourcesItem,
MyResourcesItemGetResponseJsonApi,
MyResourcesItemResponseJsonApi,
MyResourcesResponseJsonApi,
- MyResourcesSearchFilters,
-} from '../models';
+} from '../models/my-resources/my-resources.models';
+import { EndpointType } from '../models/my-resources/my-resources-endpoint.type';
+import { MyResourcesSearchFilters } from '../models/my-resources/my-resources-search-filters.models';
+import { CreateProjectPayloadJsoApi } from '../models/nodes/nodes-json-api.model';
import { JsonApiService } from './json-api.service';
@@ -27,7 +28,6 @@ export class MyResourcesService {
private sortFieldMap: Record = {
title: 'title',
dateModified: 'date_modified',
- dateCreated: 'date_created',
};
private readonly jsonApiService = inject(JsonApiService);
@@ -92,12 +92,8 @@ export class MyResourcesService {
params['filter[root][ne]'] = rootProjectId;
}
- let url;
- if (searchMode === ResourceSearchMode.All) {
- url = `${this.apiUrl}/${endpoint}`;
- } else {
- url = endpoint.startsWith('collections/') ? `${this.apiUrl}/${endpoint}` : `${this.apiUrl}/users/me/${endpoint}`;
- }
+ const url =
+ searchMode === ResourceSearchMode.All ? `${this.apiUrl}/${endpoint}` : `${this.apiUrl}/users/me/${endpoint}`;
if (searchMode === ResourceSearchMode.Component) {
params['filter[parent][ne]'] = null;
@@ -152,37 +148,6 @@ export class MyResourcesService {
return this.getResources('preprints/', filters, pageNumber, pageSize, 'preprints');
}
- getMyBookmarks(
- collectionId: string,
- resourceType: ResourceType,
- filters?: MyResourcesSearchFilters,
- pageNumber?: number,
- pageSize?: number
- ): Observable {
- switch (resourceType) {
- case ResourceType.Project:
- return this.getResources(`collections/${collectionId}/linked_nodes/`, filters, pageNumber, pageSize, 'nodes');
- case ResourceType.Registration:
- return this.getResources(
- `collections/${collectionId}/linked_registrations/`,
- filters,
- pageNumber,
- pageSize,
- 'registrations'
- );
- case ResourceType.Preprint:
- return this.getResources(
- `collections/${collectionId}/linked_preprints/`,
- filters,
- pageNumber,
- pageSize,
- 'preprints'
- );
- default:
- return EMPTY;
- }
- }
-
createProject(
title: string,
description: string,
diff --git a/src/app/shared/services/node-links.service.ts b/src/app/shared/services/node-links.service.ts
index cc8070ac0..e2a9c7056 100644
--- a/src/app/shared/services/node-links.service.ts
+++ b/src/app/shared/services/node-links.service.ts
@@ -5,9 +5,12 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { ComponentsMapper } from '../mappers';
-import { ComponentGetResponseJsonApi, ComponentOverview, JsonApiResponse, MyResourcesItem } from '../models';
-import { NodeLinkJsonApi } from '../models/node-links';
+import { ComponentsMapper } from '../mappers/components';
+import { JsonApiResponse } from '../models/common/json-api.model';
+import { ComponentGetResponseJsonApi } from '../models/components/component-json-api.model';
+import { ComponentOverview } from '../models/components/components.models';
+import { MyResourcesItem } from '../models/my-resources/my-resources.models';
+import { NodeLinkJsonApi } from '../models/node-links/node-link-json-api.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/projects.service.ts b/src/app/shared/services/projects.service.ts
index e857b7267..2bf9da1be 100644
--- a/src/app/shared/services/projects.service.ts
+++ b/src/app/shared/services/projects.service.ts
@@ -5,7 +5,9 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
import { ProjectsMapper } from '../mappers/projects';
-import { ProjectJsonApi, ProjectMetadataUpdatePayload, ProjectModel, ProjectsResponseJsonApi } from '../models';
+import { ProjectMetadataUpdatePayload } from '../models/project-metadata-update-payload.model';
+import { ProjectModel } from '../models/projects/projects.models';
+import { ProjectJsonApi, ProjectsResponseJsonApi } from '../models/projects/projects-json-api.models';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/regions.service.ts b/src/app/shared/services/regions.service.ts
index 634bb2de9..0ab2b0ced 100644
--- a/src/app/shared/services/regions.service.ts
+++ b/src/app/shared/services/regions.service.ts
@@ -6,7 +6,8 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
import { RegionsMapper } from '../mappers/regions';
-import { IdName, RegionsResponseJsonApi } from '../models';
+import { IdNameModel } from '../models/common/id-name.model';
+import { RegionsResponseJsonApi } from '../models/regions/regions.json-api.model';
@Injectable({
providedIn: 'root',
@@ -19,7 +20,7 @@ export class RegionsService {
return `${this.environment.apiDomainUrl}/v2`;
}
- getAllRegions(): Observable {
+ getAllRegions(): Observable {
return this.http
.get(`${this.apiUrl}/regions/`)
.pipe(map((regions) => RegionsMapper.fromRegionsResponseJsonApi(regions)));
diff --git a/src/app/shared/services/registration-provider.service.ts b/src/app/shared/services/registration-provider.service.ts
index 6278adacf..d7ee487b9 100644
--- a/src/app/shared/services/registration-provider.service.ts
+++ b/src/app/shared/services/registration-provider.service.ts
@@ -4,14 +4,12 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { RegistrationProviderMapper } from '../mappers';
-import {
- JsonApiResponse,
- ProviderSchema,
- ProvidersResponseJsonApi,
- RegistryProviderDetails,
- RegistryProviderDetailsJsonApi,
-} from '../models';
+import { RegistrationProviderMapper } from '../mappers/registration-provider.mapper';
+import { JsonApiResponse } from '../models/common/json-api.model';
+import { ProvidersResponseJsonApi } from '../models/provider/providers-json-api.model';
+import { RegistryProviderDetailsJsonApi } from '../models/provider/registration-provider-json-api.model';
+import { RegistryProviderDetails } from '../models/provider/registry-provider.model';
+import { ProviderSchema } from '../models/registration/provider-schema.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/request-access.service.ts b/src/app/shared/services/request-access.service.ts
index 57a516a1c..1417188dc 100644
--- a/src/app/shared/services/request-access.service.ts
+++ b/src/app/shared/services/request-access.service.ts
@@ -4,9 +4,12 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { RequestAccessTrigger, ResourceType } from '../enums';
+import { RequestAccessTrigger } from '../enums/request-access-trigger.enum';
+import { ResourceType } from '../enums/resource-type.enum';
import { RequestAccessMapper } from '../mappers/request-access';
-import { RequestAccessModel, RequestAccessPayload, RequestAccessResponseJsonApi } from '../models';
+import { RequestAccessModel } from '../models/request-access/request-access.model';
+import { RequestAccessResponseJsonApi } from '../models/request-access/request-access-json-api.model';
+import { RequestAccessPayload } from '../models/request-access/request-access-payload.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/resource-card.service.ts b/src/app/shared/services/resource-card.service.ts
index fe111dfc7..0451e98b2 100644
--- a/src/app/shared/services/resource-card.service.ts
+++ b/src/app/shared/services/resource-card.service.ts
@@ -3,8 +3,10 @@ import { map, Observable } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { MapUserCounts } from '@shared/mappers';
-import { UserRelatedCounts, UserRelatedCountsResponseJsonApi } from '@shared/models';
+import { UserRelatedCounts } from '@shared/models/user-related-counts/user-related-counts.model';
+import { UserRelatedCountsResponseJsonApi } from '@shared/models/user-related-counts/user-related-counts-json-api.model';
+
+import { MapUserCounts } from '../mappers/user-related-counts';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/resource.service.ts b/src/app/shared/services/resource.service.ts
index 839f2194f..ceb161c5a 100644
--- a/src/app/shared/services/resource.service.ts
+++ b/src/app/shared/services/resource.service.ts
@@ -3,18 +3,15 @@ import { finalize, map, Observable } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { BaseNodeMapper } from '@osf/shared/mappers';
-import {
- BaseNodeDataJsonApi,
- BaseNodeModel,
- CurrentResource,
- GuidedResponseJsonApi,
- NodeShortInfoModel,
- ResponseDataJsonApi,
- ResponseJsonApi,
-} from '@osf/shared/models';
-import { CurrentResourceType, ResourceType } from '../enums';
+import { CurrentResourceType, ResourceType } from '../enums/resource-type.enum';
+import { BaseNodeMapper } from '../mappers/nodes';
+import { ResponseDataJsonApi, ResponseJsonApi } from '../models/common/json-api.model';
+import { CurrentResource } from '../models/current-resource.model';
+import { GuidedResponseJsonApi } from '../models/guid-response-json-api.model';
+import { BaseNodeModel } from '../models/nodes/base-node.model';
+import { BaseNodeDataJsonApi } from '../models/nodes/base-node-data-json-api.model';
+import { NodeShortInfoModel } from '../models/nodes/node-with-children.model';
import { JsonApiService } from './json-api.service';
import { LoaderService } from './loader.service';
diff --git a/src/app/shared/services/social-share.service.ts b/src/app/shared/services/social-share.service.ts
index 262684cb0..7b821619a 100644
--- a/src/app/shared/services/social-share.service.ts
+++ b/src/app/shared/services/social-share.service.ts
@@ -2,8 +2,11 @@ import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { SOCIAL_PLATFORMS, SOCIAL_SHARE_URLS } from '../constants';
-import { SocialShareContentModel, SocialShareLinksModel, SocialsShareActionItem } from '../models';
+import { SOCIAL_PLATFORMS } from '../constants/social-platforms.const';
+import { SOCIAL_SHARE_URLS } from '../constants/social-share.config';
+import { SocialShareContentModel } from '../models/socials/social-share-content.model';
+import { SocialShareLinksModel } from '../models/socials/social-share-links.model';
+import { SocialsShareActionItem } from '../models/socials/socials-share-action-item.model';
@Injectable({
providedIn: 'root',
diff --git a/src/app/shared/services/subjects.service.ts b/src/app/shared/services/subjects.service.ts
index c534043a0..eee028a8e 100644
--- a/src/app/shared/services/subjects.service.ts
+++ b/src/app/shared/services/subjects.service.ts
@@ -4,10 +4,11 @@ import { map } from 'rxjs/operators';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { SubjectMapper } from '@shared/mappers';
-import { SubjectModel, SubjectsResponseJsonApi } from '@shared/models';
+import { SubjectModel } from '@shared/models/subject/subject.model';
+import { SubjectsResponseJsonApi } from '@shared/models/subject/subjects-json-api.model';
-import { ResourceType } from '../enums';
+import { ResourceType } from '../enums/resource-type.enum';
+import { SubjectMapper } from '../mappers/subjects';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/view-only-links.service.ts b/src/app/shared/services/view-only-links.service.ts
index 5b70f84fb..32da38445 100644
--- a/src/app/shared/services/view-only-links.service.ts
+++ b/src/app/shared/services/view-only-links.service.ts
@@ -3,15 +3,15 @@ import { map, Observable } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { JsonApiResponse } from '@shared/models';
+import { JsonApiResponse } from '@shared/models/common/json-api.model';
-import { ResourceType } from '../enums';
-import { ViewOnlyLinksMapper } from '../mappers';
+import { ResourceType } from '../enums/resource-type.enum';
+import { ViewOnlyLinksMapper } from '../mappers/view-only-links.mapper';
+import { PaginatedViewOnlyLinksModel } from '../models/view-only-links/view-only-link.model';
import {
- PaginatedViewOnlyLinksModel,
ViewOnlyLinkJsonApi,
ViewOnlyLinksResponseJsonApi,
-} from '../models/view-only-links';
+} from '../models/view-only-links/view-only-link-response.model';
import { JsonApiService } from './json-api.service';
diff --git a/src/app/shared/services/wiki.service.ts b/src/app/shared/services/wiki.service.ts
index 8d9a22cb3..f2d02a306 100644
--- a/src/app/shared/services/wiki.service.ts
+++ b/src/app/shared/services/wiki.service.ts
@@ -5,20 +5,21 @@ import { HttpClient } from '@angular/common/http';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { JsonApiResponse, WikisWithMeta } from '@shared/models';
-
-import { ResourceType } from '../enums';
-import { WikiMapper } from '../mappers/wiki';
+import { JsonApiResponse } from '@shared/models/common/json-api.model';
import {
ComponentsWikiJsonApiResponse,
ComponentWiki,
HomeWikiJsonApiResponse,
- Wiki,
WikiGetResponse,
WikiJsonApiResponseWithMeta,
+ WikiModel,
+ WikisWithMeta,
WikiVersion,
WikiVersionJsonApiResponse,
-} from '../models';
+} from '@shared/models/wiki/wiki.model';
+
+import { ResourceType } from '../enums/resource-type.enum';
+import { WikiMapper } from '../mappers/wiki';
import { JsonApiService } from './json-api.service';
@@ -49,7 +50,7 @@ export class WikiService {
return `${this.apiUrl}/${resourcePath}/${resourceId}/wikis/`;
}
- createWiki(projectId: string, name: string): Observable {
+ createWiki(projectId: string, name: string): Observable {
const body = {
data: {
type: 'wikis',
diff --git a/src/app/shared/stores/activity-logs/activity-logs.model.ts b/src/app/shared/stores/activity-logs/activity-logs.model.ts
index 9eaaa41ac..8f0f9f6e9 100644
--- a/src/app/shared/stores/activity-logs/activity-logs.model.ts
+++ b/src/app/shared/stores/activity-logs/activity-logs.model.ts
@@ -1,4 +1,5 @@
-import { ActivityLogWithDisplay, AsyncStateWithTotalCount } from '@osf/shared/models';
+import { ActivityLogWithDisplay } from '@osf/shared/models/activity-logs/activity-log-with-display.model';
+import { AsyncStateWithTotalCount } from '@osf/shared/models/store/async-state-with-total-count.model';
export interface ActivityLogsStateModel {
activityLogs: AsyncStateWithTotalCount;
diff --git a/src/app/shared/stores/activity-logs/activity-logs.selectors.ts b/src/app/shared/stores/activity-logs/activity-logs.selectors.ts
index c13cbb774..f6c9de8e4 100644
--- a/src/app/shared/stores/activity-logs/activity-logs.selectors.ts
+++ b/src/app/shared/stores/activity-logs/activity-logs.selectors.ts
@@ -1,6 +1,7 @@
import { Selector } from '@ngxs/store';
-import { ActivityLog, ActivityLogWithDisplay } from '@osf/shared/models';
+import { ActivityLogWithDisplay } from '@osf/shared/models/activity-logs/activity-log-with-display.model';
+import { ActivityLog } from '@osf/shared/models/activity-logs/activity-logs.model';
import { ActivityLogsStateModel } from './activity-logs.model';
import { ActivityLogsState } from './activity-logs.state';
diff --git a/src/app/shared/stores/activity-logs/activity-logs.state.spec.ts b/src/app/shared/stores/activity-logs/activity-logs.state.spec.ts
index 95ff16568..96dced6e2 100644
--- a/src/app/shared/stores/activity-logs/activity-logs.state.spec.ts
+++ b/src/app/shared/stores/activity-logs/activity-logs.state.spec.ts
@@ -4,7 +4,7 @@ import { provideHttpClient } from '@angular/common/http';
import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing';
import { inject, TestBed } from '@angular/core/testing';
-import { ActivityLogDisplayService } from '@shared/services';
+import { ActivityLogDisplayService } from '@osf/shared/services/activity-logs/activity-log-display.service';
import { ClearActivityLogsStore, GetActivityLogs, GetRegistrationActivityLogs } from './activity-logs.actions';
import { ActivityLogsState } from './activity-logs.state';
diff --git a/src/app/shared/stores/activity-logs/activity-logs.state.ts b/src/app/shared/stores/activity-logs/activity-logs.state.ts
index e69be7da8..e73bb69d2 100644
--- a/src/app/shared/stores/activity-logs/activity-logs.state.ts
+++ b/src/app/shared/stores/activity-logs/activity-logs.state.ts
@@ -5,7 +5,7 @@ import { tap } from 'rxjs/operators';
import { inject, Injectable } from '@angular/core';
-import { ActivityLogsService } from '@shared/services';
+import { ActivityLogsService } from '@osf/shared/services/activity-logs/activity-logs.service';
import { ClearActivityLogsStore, GetActivityLogs, GetRegistrationActivityLogs } from './activity-logs.actions';
import { ACTIVITY_LOGS_STATE_DEFAULT, ActivityLogsStateModel } from './activity-logs.model';
diff --git a/src/app/shared/stores/addons/addons.actions.ts b/src/app/shared/stores/addons/addons.actions.ts
index 24568c0d5..bb37a0fd6 100644
--- a/src/app/shared/stores/addons/addons.actions.ts
+++ b/src/app/shared/stores/addons/addons.actions.ts
@@ -1,8 +1,8 @@
import {
AuthorizedAddonRequestJsonApi,
ConfiguredAddonRequestJsonApi,
- OperationInvocationRequestJsonApi,
-} from '@shared/models';
+} from '@osf/shared/models/addons/addon-json-api.models';
+import { OperationInvocationRequestJsonApi } from '@osf/shared/models/addons/addon-operations-json-api.models';
export class GetStorageAddons {
static readonly type = '[Addons] Get Storage Addons';
diff --git a/src/app/shared/stores/addons/addons.models.ts b/src/app/shared/stores/addons/addons.models.ts
index 74e128b69..4e795944f 100644
--- a/src/app/shared/stores/addons/addons.models.ts
+++ b/src/app/shared/stores/addons/addons.models.ts
@@ -1,13 +1,13 @@
+import { AddonModel } from '@osf/shared/models/addons/addon.model';
import {
- AddonModel,
- AsyncStateModel,
- AuthorizedAccountModel,
- ConfiguredAddonModel,
ConfiguredAddonResponseJsonApi,
- OperationInvocation,
ResourceReferenceJsonApi,
UserReferenceJsonApi,
-} from '@osf/shared/models';
+} from '@osf/shared/models/addons/addon-json-api.models';
+import { AuthorizedAccountModel } from '@osf/shared/models/addons/authorized-account.model';
+import { ConfiguredAddonModel } from '@osf/shared/models/addons/configured-addon.model';
+import { OperationInvocation } from '@osf/shared/models/addons/operation-invocation.model';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
export interface AddonsStateModel {
storageAddons: AsyncStateModel;
diff --git a/src/app/shared/stores/addons/addons.selectors.ts b/src/app/shared/stores/addons/addons.selectors.ts
index 153c9ee06..bd8158094 100644
--- a/src/app/shared/stores/addons/addons.selectors.ts
+++ b/src/app/shared/stores/addons/addons.selectors.ts
@@ -1,15 +1,15 @@
import { createSelector, Selector } from '@ngxs/store';
+import { AddonModel } from '@osf/shared/models/addons/addon.model';
import {
- AddonModel,
- AuthorizedAccountModel,
- ConfiguredAddonModel,
ConfiguredAddonResponseJsonApi,
- OperationInvocation,
ResourceReferenceJsonApi,
- StorageItem,
UserReferenceJsonApi,
-} from '@shared/models';
+} from '@osf/shared/models/addons/addon-json-api.models';
+import { AuthorizedAccountModel } from '@osf/shared/models/addons/authorized-account.model';
+import { ConfiguredAddonModel } from '@osf/shared/models/addons/configured-addon.model';
+import { OperationInvocation } from '@osf/shared/models/addons/operation-invocation.model';
+import { StorageItem } from '@osf/shared/models/addons/storage-item.model';
import { AddonsStateModel } from './addons.models';
import { AddonsState } from './addons.state';
diff --git a/src/app/shared/stores/addons/addons.state.spec.ts b/src/app/shared/stores/addons/addons.state.spec.ts
index b4bbf9b0c..ebfbf99a8 100644
--- a/src/app/shared/stores/addons/addons.state.spec.ts
+++ b/src/app/shared/stores/addons/addons.state.spec.ts
@@ -59,6 +59,7 @@ describe('State: Addons', () => {
supportedFeatures: ['DOWNLOAD_AS_ZIP', 'FORKING', 'LOGS', 'PERMISSIONS', 'REGISTERING'],
type: 'external-storage-services',
wbKey: 'figshare',
+ configurableApiRoot: false,
})
);
@@ -76,6 +77,7 @@ describe('State: Addons', () => {
supportedFeatures: ['DOWNLOAD_AS_ZIP', 'FORKING', 'LOGS', 'PERMISSIONS', 'REGISTERING'],
type: 'external-storage-services',
wbKey: 'figshare',
+ configurableApiRoot: false,
})
);
expect(loading()).toBeFalsy();
diff --git a/src/app/shared/stores/addons/addons.state.ts b/src/app/shared/stores/addons/addons.state.ts
index 1b3afb253..9f28071f5 100644
--- a/src/app/shared/stores/addons/addons.state.ts
+++ b/src/app/shared/stores/addons/addons.state.ts
@@ -4,10 +4,10 @@ import { catchError, switchMap, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { AddonType } from '@osf/shared/enums';
-import { handleSectionError } from '@osf/shared/helpers';
-import { AuthorizedAccountModel } from '@osf/shared/models';
-import { AddonsService } from '@osf/shared/services';
+import { AddonType } from '@osf/shared/enums/addon-type.enum';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
+import { AddonsService } from '@osf/shared/services/addons/addons.service';
+import { AuthorizedAccountModel } from '@shared/models/addons/authorized-account.model';
import {
ClearAuthorizedAddons,
diff --git a/src/app/shared/stores/banners/banners.model.ts b/src/app/shared/stores/banners/banners.model.ts
index f62e67152..78afe8db6 100644
--- a/src/app/shared/stores/banners/banners.model.ts
+++ b/src/app/shared/stores/banners/banners.model.ts
@@ -1,5 +1,5 @@
import { BannerModel } from '@core/components/osf-banners/models/banner.model';
-import { AsyncStateModel } from '@shared/models/store';
+import { AsyncStateModel } from '@shared/models/store/async-state.model';
/**
* NGXS State model for managing banner-related data.
diff --git a/src/app/shared/stores/banners/banners.state.ts b/src/app/shared/stores/banners/banners.state.ts
index 4ffb5b23d..e733e7287 100644
--- a/src/app/shared/stores/banners/banners.state.ts
+++ b/src/app/shared/stores/banners/banners.state.ts
@@ -5,7 +5,7 @@ import { catchError, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { BannerModel } from '@core/components/osf-banners/models/banner.model';
-import { handleSectionError } from '@osf/shared/helpers';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
import { BannersService } from '@osf/shared/services/banners.service';
import { GetCurrentScheduledBanner } from './banners.actions';
diff --git a/src/app/shared/stores/bookmarks/bookmarks.actions.ts b/src/app/shared/stores/bookmarks/bookmarks.actions.ts
index 129015edb..12759a916 100644
--- a/src/app/shared/stores/bookmarks/bookmarks.actions.ts
+++ b/src/app/shared/stores/bookmarks/bookmarks.actions.ts
@@ -1,14 +1,34 @@
-import { ResourceType } from '@shared/enums';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { MyResourcesSearchFilters } from '@shared/models/my-resources/my-resources-search-filters.models';
export class GetBookmarksCollectionId {
static readonly type = '[Bookmarks] Get Bookmarks Collection Id';
}
+export class GetAllMyBookmarks {
+ static readonly type = '[Bookmarks] Get Bookmarks';
+
+ constructor(
+ public bookmarkCollectionId: string,
+ public filters?: MyResourcesSearchFilters
+ ) {}
+}
+
+export class GetResourceBookmark {
+ static readonly type = '[Bookmarks] Get Resource Bookmark';
+
+ constructor(
+ public bookmarkCollectionId: string,
+ public resourceId: string,
+ public resourceType: ResourceType
+ ) {}
+}
+
export class AddResourceToBookmarks {
static readonly type = '[Bookmarks] Add Resource To Bookmarks';
constructor(
- public bookmarksId: string,
+ public bookmarkCollectionId: string,
public resourceId: string,
public resourceType: ResourceType
) {}
@@ -18,7 +38,7 @@ export class RemoveResourceFromBookmarks {
static readonly type = '[Bookmarks] Remove Resource From Bookmarks';
constructor(
- public bookmarksId: string,
+ public bookmarkCollectionId: string,
public resourceId: string,
public resourceType: ResourceType
) {}
diff --git a/src/app/shared/stores/bookmarks/bookmarks.model.ts b/src/app/shared/stores/bookmarks/bookmarks.model.ts
index dca9eb9b6..919d2b347 100644
--- a/src/app/shared/stores/bookmarks/bookmarks.model.ts
+++ b/src/app/shared/stores/bookmarks/bookmarks.model.ts
@@ -1,14 +1,24 @@
-import { AsyncStateModel } from '@shared/models/store';
+import { MyResourcesItem } from '@osf/shared/models/my-resources/my-resources.models';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
+import { AsyncStateWithTotalCount } from '@osf/shared/models/store/async-state-with-total-count.model';
export interface BookmarksStateModel {
- bookmarksId: AsyncStateModel;
+ bookmarkCollectionId: AsyncStateModel;
+ items: AsyncStateWithTotalCount;
}
export const BOOKMARKS_DEFAULTS: BookmarksStateModel = {
- bookmarksId: {
+ bookmarkCollectionId: {
data: '',
isLoading: false,
isSubmitting: false,
error: null,
},
+ items: {
+ data: [],
+ isLoading: false,
+ isSubmitting: false,
+ error: null,
+ totalCount: 0,
+ },
};
diff --git a/src/app/shared/stores/bookmarks/bookmarks.selectors.ts b/src/app/shared/stores/bookmarks/bookmarks.selectors.ts
index bb3781f10..6736207d0 100644
--- a/src/app/shared/stores/bookmarks/bookmarks.selectors.ts
+++ b/src/app/shared/stores/bookmarks/bookmarks.selectors.ts
@@ -6,16 +6,31 @@ import { BookmarksState } from './bookmarks.state';
export class BookmarksSelectors {
@Selector([BookmarksState])
static getBookmarksCollectionId(state: BookmarksStateModel) {
- return state.bookmarksId.data;
+ return state.bookmarkCollectionId.data;
}
@Selector([BookmarksState])
static getBookmarksCollectionIdLoading(state: BookmarksStateModel) {
- return state.bookmarksId.isLoading;
+ return state.bookmarkCollectionId.isLoading;
}
@Selector([BookmarksState])
static getBookmarksCollectionIdSubmitting(state: BookmarksStateModel) {
- return state.bookmarksId.isSubmitting;
+ return state.bookmarkCollectionId.isSubmitting;
+ }
+
+ @Selector([BookmarksState])
+ static getBookmarks(state: BookmarksStateModel) {
+ return state.items.data;
+ }
+
+ @Selector([BookmarksState])
+ static areBookmarksLoading(state: BookmarksStateModel) {
+ return state.items.isLoading;
+ }
+
+ @Selector([BookmarksState])
+ static getBookmarksTotalCount(state: BookmarksStateModel) {
+ return state.items.totalCount;
}
}
diff --git a/src/app/shared/stores/bookmarks/bookmarks.state.ts b/src/app/shared/stores/bookmarks/bookmarks.state.ts
index 90cb96a30..58815a9e3 100644
--- a/src/app/shared/stores/bookmarks/bookmarks.state.ts
+++ b/src/app/shared/stores/bookmarks/bookmarks.state.ts
@@ -4,10 +4,16 @@ import { catchError, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { handleSectionError } from '@shared/helpers';
-import { BookmarksService } from '@shared/services';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
+import { BookmarksService } from '@osf/shared/services/bookmarks.service';
-import { AddResourceToBookmarks, GetBookmarksCollectionId, RemoveResourceFromBookmarks } from './bookmarks.actions';
+import {
+ AddResourceToBookmarks,
+ GetAllMyBookmarks,
+ GetBookmarksCollectionId,
+ GetResourceBookmark,
+ RemoveResourceFromBookmarks,
+} from './bookmarks.actions';
import { BOOKMARKS_DEFAULTS, BookmarksStateModel } from './bookmarks.model';
@State({
@@ -16,14 +22,14 @@ import { BOOKMARKS_DEFAULTS, BookmarksStateModel } from './bookmarks.model';
})
@Injectable()
export class BookmarksState {
- bookmarksService = inject(BookmarksService);
+ private readonly bookmarksService = inject(BookmarksService);
@Action(GetBookmarksCollectionId)
getBookmarksCollectionId(ctx: StateContext) {
const state = ctx.getState();
ctx.patchState({
- bookmarksId: {
- ...state.bookmarksId,
+ bookmarkCollectionId: {
+ ...state.bookmarkCollectionId,
isLoading: true,
},
});
@@ -31,15 +37,67 @@ export class BookmarksState {
return this.bookmarksService.getBookmarksCollectionId().pipe(
tap((res) => {
ctx.patchState({
- bookmarksId: {
+ bookmarkCollectionId: {
data: res,
isLoading: false,
- isSubmitting: false,
error: null,
},
});
}),
- catchError((error) => handleSectionError(ctx, 'bookmarksId', error))
+ catchError((error) => handleSectionError(ctx, 'bookmarkCollectionId', error))
+ );
+ }
+
+ @Action(GetAllMyBookmarks)
+ getAllMyBookmarks(ctx: StateContext, action: GetAllMyBookmarks) {
+ const state = ctx.getState();
+
+ ctx.patchState({
+ items: {
+ ...state.items,
+ isLoading: true,
+ error: null,
+ },
+ });
+
+ return this.bookmarksService.getAllBookmarks(action.bookmarkCollectionId, action.filters).pipe(
+ tap((results) => {
+ ctx.patchState({
+ items: {
+ data: results.data,
+ isLoading: false,
+ error: null,
+ totalCount: results.totalCount,
+ },
+ });
+ }),
+ catchError((error) => handleSectionError(ctx, 'items', error))
+ );
+ }
+
+ @Action(GetResourceBookmark)
+ getBookmarkResource(ctx: StateContext, action: GetResourceBookmark) {
+ ctx.patchState({
+ items: {
+ data: [],
+ isLoading: true,
+ error: null,
+ totalCount: 0,
+ },
+ });
+
+ return this.bookmarksService.getResourceBookmarks(action.bookmarkCollectionId, action.resourceType).pipe(
+ tap((res) => {
+ ctx.patchState({
+ items: {
+ data: res.data,
+ isLoading: false,
+ error: null,
+ totalCount: res.meta.total,
+ },
+ });
+ }),
+ catchError((error) => handleSectionError(ctx, 'items', error))
);
}
@@ -47,24 +105,24 @@ export class BookmarksState {
addResourceToBookmarks(ctx: StateContext, action: AddResourceToBookmarks) {
const state = ctx.getState();
ctx.patchState({
- bookmarksId: {
- ...state.bookmarksId,
+ bookmarkCollectionId: {
+ ...state.bookmarkCollectionId,
isSubmitting: true,
},
});
return this.bookmarksService
- .addResourceToBookmarks(action.bookmarksId, action.resourceId, action.resourceType)
+ .addResourceToBookmarks(action.bookmarkCollectionId, action.resourceId, action.resourceType)
.pipe(
tap(() => {
ctx.patchState({
- bookmarksId: {
- ...state.bookmarksId,
+ bookmarkCollectionId: {
+ ...state.bookmarkCollectionId,
isSubmitting: false,
},
});
}),
- catchError((error) => handleSectionError(ctx, 'bookmarksId', error))
+ catchError((error) => handleSectionError(ctx, 'bookmarkCollectionId', error))
);
}
@@ -72,24 +130,24 @@ export class BookmarksState {
removeResourceFromBookmarks(ctx: StateContext, action: RemoveResourceFromBookmarks) {
const state = ctx.getState();
ctx.patchState({
- bookmarksId: {
- ...state.bookmarksId,
+ bookmarkCollectionId: {
+ ...state.bookmarkCollectionId,
isSubmitting: true,
},
});
return this.bookmarksService
- .removeResourceFromBookmarks(action.bookmarksId, action.resourceId, action.resourceType)
+ .removeResourceFromBookmarks(action.bookmarkCollectionId, action.resourceId, action.resourceType)
.pipe(
tap(() => {
ctx.patchState({
- bookmarksId: {
- ...state.bookmarksId,
+ bookmarkCollectionId: {
+ ...state.bookmarkCollectionId,
isSubmitting: false,
},
});
}),
- catchError((error) => handleSectionError(ctx, 'bookmarksId', error))
+ catchError((error) => handleSectionError(ctx, 'bookmarkCollectionId', error))
);
}
}
diff --git a/src/app/shared/stores/citations/citations.actions.ts b/src/app/shared/stores/citations/citations.actions.ts
index e8a65b1d0..bf7d87ad4 100644
--- a/src/app/shared/stores/citations/citations.actions.ts
+++ b/src/app/shared/stores/citations/citations.actions.ts
@@ -1,5 +1,5 @@
-import { ResourceType } from '@shared/enums';
-import { CustomCitationPayload } from '@shared/models';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { CustomCitationPayload } from '@shared/models/citations/custom-citation-payload.model';
export class GetDefaultCitations {
static readonly type = '[Citations] Get Default Citations';
diff --git a/src/app/shared/stores/citations/citations.model.ts b/src/app/shared/stores/citations/citations.model.ts
index f7603c56d..d0670395b 100644
--- a/src/app/shared/stores/citations/citations.model.ts
+++ b/src/app/shared/stores/citations/citations.model.ts
@@ -1,4 +1,6 @@
-import { AsyncStateModel, CitationStyle, StyledCitation } from '@osf/shared/models';
+import { CitationStyle } from '@osf/shared/models/citations/citation-style.model';
+import { StyledCitation } from '@osf/shared/models/citations/styled-citation.model';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
export interface CitationsStateModel {
defaultCitations: AsyncStateModel;
diff --git a/src/app/shared/stores/citations/citations.state.ts b/src/app/shared/stores/citations/citations.state.ts
index a4feb6eba..73defb513 100644
--- a/src/app/shared/stores/citations/citations.state.ts
+++ b/src/app/shared/stores/citations/citations.state.ts
@@ -4,8 +4,8 @@ import { catchError, forkJoin, Observable, of, switchMap, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { CitationTypes } from '@osf/shared/enums';
-import { handleSectionError } from '@osf/shared/helpers';
+import { CitationTypes } from '@osf/shared/enums/citation-types.enum';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
import { CitationsService } from '@osf/shared/services/citations.service';
import {
diff --git a/src/app/shared/stores/collections/collections.actions.ts b/src/app/shared/stores/collections/collections.actions.ts
index 61ce331fb..cf43e1f98 100644
--- a/src/app/shared/stores/collections/collections.actions.ts
+++ b/src/app/shared/stores/collections/collections.actions.ts
@@ -1,4 +1,4 @@
-import { CollectionsFilters } from '@osf/shared/models';
+import { CollectionsFilters } from '@osf/shared/models/collections/collections-filters.model';
export class GetCollectionProvider {
static readonly type = '[Collections] Get Collection Provider';
diff --git a/src/app/shared/stores/collections/collections.model.ts b/src/app/shared/stores/collections/collections.model.ts
index 49dee4ffe..8e17d8581 100644
--- a/src/app/shared/stores/collections/collections.model.ts
+++ b/src/app/shared/stores/collections/collections.model.ts
@@ -1,11 +1,11 @@
import {
CollectionDetails,
CollectionProvider,
- CollectionsFilters,
CollectionSubmission,
CollectionSubmissionWithGuid,
-} from '@shared/models';
-import { AsyncStateModel } from '@shared/models/store';
+} from '@osf/shared/models/collections/collections.models';
+import { CollectionsFilters } from '@osf/shared/models/collections/collections-filters.model';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
export interface CollectionsStateModel {
currentFilters: CollectionsFilters;
diff --git a/src/app/shared/stores/collections/collections.selectors.ts b/src/app/shared/stores/collections/collections.selectors.ts
index f2ba6bb69..ca076ada9 100644
--- a/src/app/shared/stores/collections/collections.selectors.ts
+++ b/src/app/shared/stores/collections/collections.selectors.ts
@@ -1,6 +1,6 @@
import { Selector } from '@ngxs/store';
-import { CollectionsFilters } from '@shared/models';
+import { CollectionsFilters } from '@osf/shared/models/collections/collections-filters.model';
import { CollectionsStateModel } from './collections.model';
import { CollectionsState } from './collections.state';
diff --git a/src/app/shared/stores/collections/collections.state.ts b/src/app/shared/stores/collections/collections.state.ts
index d1faca597..3e63137b6 100644
--- a/src/app/shared/stores/collections/collections.state.ts
+++ b/src/app/shared/stores/collections/collections.state.ts
@@ -5,9 +5,9 @@ import { catchError, forkJoin, of, switchMap, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { SetCurrentProvider } from '@core/store/provider';
-import { CurrentResourceType } from '@osf/shared/enums';
-import { handleSectionError } from '@osf/shared/helpers';
-import { CollectionsService } from '@osf/shared/services';
+import { CurrentResourceType } from '@osf/shared/enums/resource-type.enum';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
+import { CollectionsService } from '@osf/shared/services/collections.service';
import {
ClearCollections,
diff --git a/src/app/shared/stores/contributors/contributors.actions.ts b/src/app/shared/stores/contributors/contributors.actions.ts
index e2654c6c9..2bb634cfc 100644
--- a/src/app/shared/stores/contributors/contributors.actions.ts
+++ b/src/app/shared/stores/contributors/contributors.actions.ts
@@ -1,6 +1,8 @@
-import { DEFAULT_TABLE_PARAMS } from '@osf/shared/constants';
-import { ResourceType } from '@osf/shared/enums';
-import { ContributorAddModel, ContributorModel, RequestAccessPayload } from '@osf/shared/models';
+import { DEFAULT_TABLE_PARAMS } from '@osf/shared/constants/default-table-params.constants';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { ContributorModel } from '@shared/models/contributors/contributor.model';
+import { ContributorAddModel } from '@shared/models/contributors/contributor-add.model';
+import { RequestAccessPayload } from '@shared/models/request-access/request-access-payload.model';
export class GetAllContributors {
static readonly type = '[Contributors] Get All Contributors';
diff --git a/src/app/shared/stores/contributors/contributors.model.ts b/src/app/shared/stores/contributors/contributors.model.ts
index 89d34a7fd..28efa9ed3 100644
--- a/src/app/shared/stores/contributors/contributors.model.ts
+++ b/src/app/shared/stores/contributors/contributors.model.ts
@@ -1,6 +1,9 @@
-import { DEFAULT_TABLE_PARAMS } from '@osf/shared/constants';
-import { ContributorAddModel, ContributorModel, RequestAccessModel } from '@osf/shared/models';
-import { AsyncStateModel, AsyncStateWithTotalCount } from '@osf/shared/models/store';
+import { DEFAULT_TABLE_PARAMS } from '@osf/shared/constants/default-table-params.constants';
+import { ContributorModel } from '@shared/models/contributors/contributor.model';
+import { ContributorAddModel } from '@shared/models/contributors/contributor-add.model';
+import { RequestAccessModel } from '@shared/models/request-access/request-access.model';
+import { AsyncStateModel } from '@shared/models/store/async-state.model';
+import { AsyncStateWithTotalCount } from '@shared/models/store/async-state-with-total-count.model';
export interface ContributorsList extends AsyncStateWithTotalCount {
page: number;
diff --git a/src/app/shared/stores/contributors/contributors.state.ts b/src/app/shared/stores/contributors/contributors.state.ts
index cd894866a..0e738afec 100644
--- a/src/app/shared/stores/contributors/contributors.state.ts
+++ b/src/app/shared/stores/contributors/contributors.state.ts
@@ -4,8 +4,9 @@ import { catchError, of, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { handleSectionError } from '@osf/shared/helpers';
-import { ContributorsService, RequestAccessService } from '@osf/shared/services';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
+import { ContributorsService } from '@osf/shared/services/contributors.service';
+import { RequestAccessService } from '@osf/shared/services/request-access.service';
import {
AcceptRequestAccess,
diff --git a/src/app/shared/stores/current-resource/current-resource.actions.ts b/src/app/shared/stores/current-resource/current-resource.actions.ts
index 3b480c252..f911603e7 100644
--- a/src/app/shared/stores/current-resource/current-resource.actions.ts
+++ b/src/app/shared/stores/current-resource/current-resource.actions.ts
@@ -1,4 +1,4 @@
-import { ResourceType } from '@osf/shared/enums';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
export class GetResource {
static readonly type = '[ResourceType] Get Resource';
diff --git a/src/app/shared/stores/current-resource/current-resource.model.ts b/src/app/shared/stores/current-resource/current-resource.model.ts
index 49fa2de55..4f5967861 100644
--- a/src/app/shared/stores/current-resource/current-resource.model.ts
+++ b/src/app/shared/stores/current-resource/current-resource.model.ts
@@ -1,5 +1,7 @@
-import { BaseNodeModel, CurrentResource, NodeShortInfoModel } from '@osf/shared/models';
-import { AsyncStateModel } from '@shared/models/store';
+import { CurrentResource } from '@osf/shared/models/current-resource.model';
+import { BaseNodeModel } from '@osf/shared/models/nodes/base-node.model';
+import { NodeShortInfoModel } from '@osf/shared/models/nodes/node-with-children.model';
+import { AsyncStateModel } from '@shared/models/store/async-state.model';
export interface CurrentResourceStateModel {
currentResource: AsyncStateModel;
diff --git a/src/app/shared/stores/current-resource/current-resource.selectors.ts b/src/app/shared/stores/current-resource/current-resource.selectors.ts
index 4b4acce0d..c4d7d3b17 100644
--- a/src/app/shared/stores/current-resource/current-resource.selectors.ts
+++ b/src/app/shared/stores/current-resource/current-resource.selectors.ts
@@ -1,7 +1,9 @@
import { Selector } from '@ngxs/store';
-import { BaseNodeModel, CurrentResource, NodeShortInfoModel } from '@osf/shared/models';
-import { UserPermissions } from '@shared/enums';
+import { UserPermissions } from '@shared/enums/user-permissions.enum';
+import { CurrentResource } from '@shared/models/current-resource.model';
+import { BaseNodeModel } from '@shared/models/nodes/base-node.model';
+import { NodeShortInfoModel } from '@shared/models/nodes/node-with-children.model';
import { CurrentResourceStateModel } from './current-resource.model';
import { CurrentResourceState } from './current-resource.state';
diff --git a/src/app/shared/stores/current-resource/current-resource.state.ts b/src/app/shared/stores/current-resource/current-resource.state.ts
index 78fcc8401..199c355d8 100644
--- a/src/app/shared/stores/current-resource/current-resource.state.ts
+++ b/src/app/shared/stores/current-resource/current-resource.state.ts
@@ -4,8 +4,8 @@ import { catchError, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { handleSectionError } from '@osf/shared/helpers';
-import { ResourceGuidService } from '@osf/shared/services';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
+import { ResourceGuidService } from '@osf/shared/services/resource.service';
import { GetResource, GetResourceDetails, GetResourceWithChildren } from './current-resource.actions';
import { CURRENT_RESOURCE_DEFAULTS, CurrentResourceStateModel } from './current-resource.model';
diff --git a/src/app/shared/stores/duplicates/duplicates.model.ts b/src/app/shared/stores/duplicates/duplicates.model.ts
index bb8867bb2..6ecd20975 100644
--- a/src/app/shared/stores/duplicates/duplicates.model.ts
+++ b/src/app/shared/stores/duplicates/duplicates.model.ts
@@ -1,4 +1,5 @@
-import { AsyncStateWithTotalCount, NodeModel } from '@osf/shared/models';
+import { NodeModel } from '@osf/shared/models/nodes/base-node.model';
+import { AsyncStateWithTotalCount } from '@osf/shared/models/store/async-state-with-total-count.model';
export interface DuplicatesStateModel {
duplicates: AsyncStateWithTotalCount;
diff --git a/src/app/shared/stores/duplicates/duplicates.state.ts b/src/app/shared/stores/duplicates/duplicates.state.ts
index e34f64f09..18fd52d91 100644
--- a/src/app/shared/stores/duplicates/duplicates.state.ts
+++ b/src/app/shared/stores/duplicates/duplicates.state.ts
@@ -4,7 +4,7 @@ import { catchError, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { handleSectionError } from '@shared/helpers';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
import { DuplicatesService } from '@shared/services/duplicates.service';
import { ClearDuplicates, GetAllDuplicates } from './duplicates.actions';
diff --git a/src/app/shared/stores/global-search/global-search.actions.ts b/src/app/shared/stores/global-search/global-search.actions.ts
index 49879d6b0..00dfa8d38 100644
--- a/src/app/shared/stores/global-search/global-search.actions.ts
+++ b/src/app/shared/stores/global-search/global-search.actions.ts
@@ -1,6 +1,6 @@
-import { ResourceType } from '@shared/enums';
-import { StringOrNull } from '@shared/helpers';
-import { FilterOption } from '@shared/models';
+import { StringOrNull } from '@osf/shared/helpers/types.helper';
+import { ResourceType } from '@shared/enums/resource-type.enum';
+import { FilterOption } from '@shared/models/search/discaverable-filter.model';
export class FetchResources {
static readonly type = '[GlobalSearch] Fetch Resources';
diff --git a/src/app/shared/stores/global-search/global-search.model.ts b/src/app/shared/stores/global-search/global-search.model.ts
index 09ba1c69a..2174a080c 100644
--- a/src/app/shared/stores/global-search/global-search.model.ts
+++ b/src/app/shared/stores/global-search/global-search.model.ts
@@ -1,6 +1,8 @@
-import { ResourceType } from '@osf/shared/enums';
-import { StringOrNull } from '@osf/shared/helpers';
-import { AsyncStateModel, DiscoverableFilter, FilterOption, ResourceModel } from '@osf/shared/models';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { StringOrNull } from '@osf/shared/helpers/types.helper';
+import { DiscoverableFilter, FilterOption } from '@osf/shared/models/search/discaverable-filter.model';
+import { ResourceModel } from '@osf/shared/models/search/resource.model';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
export interface GlobalSearchStateModel {
resources: AsyncStateModel;
diff --git a/src/app/shared/stores/global-search/global-search.selectors.ts b/src/app/shared/stores/global-search/global-search.selectors.ts
index d76104f68..01b5add12 100644
--- a/src/app/shared/stores/global-search/global-search.selectors.ts
+++ b/src/app/shared/stores/global-search/global-search.selectors.ts
@@ -1,8 +1,9 @@
import { Selector } from '@ngxs/store';
-import { ResourceType } from '@osf/shared/enums';
-import { StringOrNull } from '@osf/shared/helpers';
-import { DiscoverableFilter, FilterOption, ResourceModel } from '@osf/shared/models';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { StringOrNull } from '@osf/shared/helpers/types.helper';
+import { DiscoverableFilter, FilterOption } from '@osf/shared/models/search/discaverable-filter.model';
+import { ResourceModel } from '@osf/shared/models/search/resource.model';
import { GlobalSearchStateModel } from './global-search.model';
import { GlobalSearchState } from './global-search.state';
diff --git a/src/app/shared/stores/global-search/global-search.state.ts b/src/app/shared/stores/global-search/global-search.state.ts
index a4db01970..3839eb796 100644
--- a/src/app/shared/stores/global-search/global-search.state.ts
+++ b/src/app/shared/stores/global-search/global-search.state.ts
@@ -5,9 +5,10 @@ import { catchError, EMPTY, forkJoin, Observable, of, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
import { ENVIRONMENT } from '@core/provider/environment.provider';
-import { getResourceTypeStringFromEnum } from '@shared/helpers';
-import { FilterOperator, ResourcesData } from '@shared/models';
-import { GlobalSearchService } from '@shared/services';
+import { getResourceTypeStringFromEnum } from '@osf/shared/helpers/get-resource-types.helper';
+import { GlobalSearchService } from '@osf/shared/services/global-search.service';
+import { FilterOperatorOption } from '@shared/models/search/discaverable-filter.model';
+import { ResourcesData } from '@shared/models/search/resource.model';
import {
ClearFilterSearchResults,
@@ -303,7 +304,7 @@ export class GlobalSearchState {
const firstOptionValue = options[0]?.value;
const isOptionValueBoolean = firstOptionValue === 'true' || firstOptionValue === 'false';
- if (filter?.operator === FilterOperator.IsPresent || isOptionValueBoolean) {
+ if (filter?.operator === FilterOperatorOption.IsPresent || isOptionValueBoolean) {
if (firstOptionValue) {
filtersParams[`cardSearchFilter[${key}][is-present]`] = firstOptionValue;
}
diff --git a/src/app/shared/stores/institutions-search/institutions-search.model.ts b/src/app/shared/stores/institutions-search/institutions-search.model.ts
index 7d4208344..c319194e2 100644
--- a/src/app/shared/stores/institutions-search/institutions-search.model.ts
+++ b/src/app/shared/stores/institutions-search/institutions-search.model.ts
@@ -1,4 +1,5 @@
-import { AsyncStateModel, Institution } from '@shared/models';
+import { Institution } from '@osf/shared/models/institutions/institutions.models';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
export interface InstitutionsSearchModel {
institution: AsyncStateModel;
diff --git a/src/app/shared/stores/institutions-search/institutions-search.state.ts b/src/app/shared/stores/institutions-search/institutions-search.state.ts
index 143ecfec5..0600b0231 100644
--- a/src/app/shared/stores/institutions-search/institutions-search.state.ts
+++ b/src/app/shared/stores/institutions-search/institutions-search.state.ts
@@ -5,9 +5,9 @@ import { catchError, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { handleSectionError } from '@osf/shared/helpers';
-import { Institution } from '@osf/shared/models';
-import { InstitutionsService } from '@osf/shared/services';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
+import { Institution } from '@osf/shared/models/institutions/institutions.models';
+import { InstitutionsService } from '@osf/shared/services/institutions.service';
import { FetchInstitutionById } from './institutions-search.actions';
import { INSTITUTIONS_SEARCH_STATE_DEFAULTS, InstitutionsSearchModel } from './institutions-search.model';
diff --git a/src/app/shared/stores/institutions/institutions.actions.ts b/src/app/shared/stores/institutions/institutions.actions.ts
index 2d05bfd44..7645e7d6b 100644
--- a/src/app/shared/stores/institutions/institutions.actions.ts
+++ b/src/app/shared/stores/institutions/institutions.actions.ts
@@ -1,5 +1,5 @@
-import { ResourceType } from '@shared/enums';
-import { Institution } from '@shared/models';
+import { ResourceType } from '@osf/shared/enums/resource-type.enum';
+import { Institution } from '@shared/models/institutions/institutions.models';
export class FetchUserInstitutions {
static readonly type = '[Institutions] Fetch User Institutions';
diff --git a/src/app/shared/stores/institutions/institutions.model.ts b/src/app/shared/stores/institutions/institutions.model.ts
index 5eb7bf2aa..984d18a5e 100644
--- a/src/app/shared/stores/institutions/institutions.model.ts
+++ b/src/app/shared/stores/institutions/institutions.model.ts
@@ -1,4 +1,6 @@
-import { AsyncStateModel, AsyncStateWithTotalCount, Institution } from '@osf/shared/models';
+import { Institution } from '@osf/shared/models/institutions/institutions.models';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
+import { AsyncStateWithTotalCount } from '@osf/shared/models/store/async-state-with-total-count.model';
export interface InstitutionsStateModel {
userInstitutions: AsyncStateModel;
diff --git a/src/app/shared/stores/institutions/institutions.state.ts b/src/app/shared/stores/institutions/institutions.state.ts
index b88b8c7f4..631f9ec56 100644
--- a/src/app/shared/stores/institutions/institutions.state.ts
+++ b/src/app/shared/stores/institutions/institutions.state.ts
@@ -5,8 +5,8 @@ import { catchError, Observable, tap, throwError } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { InstitutionsService } from '@osf/shared/services';
-import { handleSectionError } from '@shared/helpers';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
+import { InstitutionsService } from '@osf/shared/services/institutions.service';
import {
FetchInstitutions,
diff --git a/src/app/shared/stores/licenses/licenses.model.ts b/src/app/shared/stores/licenses/licenses.model.ts
index 932ebb747..26f0c7629 100644
--- a/src/app/shared/stores/licenses/licenses.model.ts
+++ b/src/app/shared/stores/licenses/licenses.model.ts
@@ -1,4 +1,5 @@
-import { AsyncStateModel, LicenseModel } from '@osf/shared/models';
+import { LicenseModel } from '@osf/shared/models/license/license.model';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
export interface LicensesStateModel {
licenses: AsyncStateModel;
diff --git a/src/app/shared/stores/licenses/licenses.selectors.ts b/src/app/shared/stores/licenses/licenses.selectors.ts
index 2d5739743..3fa6ae827 100644
--- a/src/app/shared/stores/licenses/licenses.selectors.ts
+++ b/src/app/shared/stores/licenses/licenses.selectors.ts
@@ -1,6 +1,6 @@
import { Selector } from '@ngxs/store';
-import { LicenseModel } from '@osf/shared/models';
+import { LicenseModel } from '@osf/shared/models/license/license.model';
import { LicensesStateModel } from './licenses.model';
import { LicensesState } from './licenses.state';
diff --git a/src/app/shared/stores/licenses/licenses.state.ts b/src/app/shared/stores/licenses/licenses.state.ts
index bc078dd80..2a55889fd 100644
--- a/src/app/shared/stores/licenses/licenses.state.ts
+++ b/src/app/shared/stores/licenses/licenses.state.ts
@@ -5,7 +5,7 @@ import { catchError, tap } from 'rxjs/operators';
import { inject, Injectable } from '@angular/core';
-import { LicensesService } from '@osf/shared/services';
+import { LicensesService } from '@osf/shared/services/licenses.service';
import { LoadAllLicenses } from './licenses.actions';
import { LICENSES_STATE_DEFAULTS, LicensesStateModel } from './licenses.model';
diff --git a/src/app/shared/stores/linked-projects/linked-projects.model.ts b/src/app/shared/stores/linked-projects/linked-projects.model.ts
index a4f1e28d0..c131ea710 100644
--- a/src/app/shared/stores/linked-projects/linked-projects.model.ts
+++ b/src/app/shared/stores/linked-projects/linked-projects.model.ts
@@ -1,4 +1,5 @@
-import { AsyncStateWithTotalCount, NodeModel } from '@osf/shared/models';
+import { NodeModel } from '@osf/shared/models/nodes/base-node.model';
+import { AsyncStateWithTotalCount } from '@osf/shared/models/store/async-state-with-total-count.model';
export interface LinkedProjectsStateModel {
linkedProjects: AsyncStateWithTotalCount;
diff --git a/src/app/shared/stores/linked-projects/linked-projects.state.ts b/src/app/shared/stores/linked-projects/linked-projects.state.ts
index 42dcd4c88..ae31adcf4 100644
--- a/src/app/shared/stores/linked-projects/linked-projects.state.ts
+++ b/src/app/shared/stores/linked-projects/linked-projects.state.ts
@@ -4,7 +4,7 @@ import { catchError, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { handleSectionError } from '@shared/helpers';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
import { LinkedProjectsService } from '@shared/services/linked-projects.service';
import { ClearLinkedProjects, GetAllLinkedProjects } from './linked-projects.actions';
diff --git a/src/app/shared/stores/my-resources/my-resources.actions.ts b/src/app/shared/stores/my-resources/my-resources.actions.ts
index bd3e2947f..b56720213 100644
--- a/src/app/shared/stores/my-resources/my-resources.actions.ts
+++ b/src/app/shared/stores/my-resources/my-resources.actions.ts
@@ -1,6 +1,5 @@
-import { ResourceSearchMode, ResourceType } from '@shared/enums';
-
-import { MyResourcesSearchFilters } from 'src/app/shared/models/my-resources';
+import { ResourceSearchMode } from '@osf/shared/enums/resource-search-mode.enum';
+import { MyResourcesSearchFilters } from '@osf/shared/models/my-resources/my-resources-search-filters.models';
export class GetMyProjects {
static readonly type = '[My Resources] Get Projects';
@@ -36,18 +35,6 @@ export class GetMyPreprints {
) {}
}
-export class GetMyBookmarks {
- static readonly type = '[My Resources] Get Bookmarks';
-
- constructor(
- public bookmarksId: string,
- public pageNumber: number,
- public pageSize: number,
- public filters: MyResourcesSearchFilters,
- public resourceType: ResourceType
- ) {}
-}
-
export class ClearMyResources {
static readonly type = '[My Resources] Clear My Resources';
}
diff --git a/src/app/shared/stores/my-resources/my-resources.model.ts b/src/app/shared/stores/my-resources/my-resources.model.ts
index b3cc9f276..47d41db9f 100644
--- a/src/app/shared/stores/my-resources/my-resources.model.ts
+++ b/src/app/shared/stores/my-resources/my-resources.model.ts
@@ -1,16 +1,10 @@
-import { AsyncStateModel } from '@shared/models';
-
-import { MyResourcesItem } from 'src/app/shared/models/my-resources';
+import { MyResourcesItem } from '@osf/shared/models/my-resources/my-resources.models';
+import { AsyncStateWithTotalCount } from '@osf/shared/models/store/async-state-with-total-count.model';
export interface MyResourcesStateModel {
- projects: AsyncStateModel;
- registrations: AsyncStateModel;
- preprints: AsyncStateModel;
- bookmarks: AsyncStateModel;
- totalProjects: number;
- totalRegistrations: number;
- totalPreprints: number;
- totalBookmarks: number;
+ projects: AsyncStateWithTotalCount;
+ registrations: AsyncStateWithTotalCount;
+ preprints: AsyncStateWithTotalCount;
}
export const MY_RESOURCES_STATE_DEFAULTS: MyResourcesStateModel = {
@@ -18,24 +12,18 @@ export const MY_RESOURCES_STATE_DEFAULTS: MyResourcesStateModel = {
data: [],
isLoading: false,
error: null,
+ totalCount: 0,
},
registrations: {
data: [],
isLoading: false,
error: null,
+ totalCount: 0,
},
preprints: {
data: [],
isLoading: false,
error: null,
+ totalCount: 0,
},
- bookmarks: {
- data: [],
- isLoading: false,
- error: null,
- },
- totalProjects: 0,
- totalRegistrations: 0,
- totalPreprints: 0,
- totalBookmarks: 0,
};
diff --git a/src/app/shared/stores/my-resources/my-resources.selectors.ts b/src/app/shared/stores/my-resources/my-resources.selectors.ts
index 2890ffd1c..344e64d3a 100644
--- a/src/app/shared/stores/my-resources/my-resources.selectors.ts
+++ b/src/app/shared/stores/my-resources/my-resources.selectors.ts
@@ -1,6 +1,6 @@
import { Selector } from '@ngxs/store';
-import { MyResourcesItem } from '@osf/shared/models';
+import { MyResourcesItem } from '@osf/shared/models/my-resources/my-resources.models';
import { MyResourcesStateModel } from './my-resources.model';
import { MyResourcesState } from './my-resources.state';
@@ -36,33 +36,18 @@ export class MyResourcesSelectors {
return state.preprints.data;
}
- @Selector([MyResourcesState])
- static getBookmarks(state: MyResourcesStateModel): MyResourcesItem[] {
- return state.bookmarks.data;
- }
-
@Selector([MyResourcesState])
static getTotalProjects(state: MyResourcesStateModel): number {
- return state.totalProjects;
+ return state.projects.totalCount;
}
@Selector([MyResourcesState])
static getTotalRegistrations(state: MyResourcesStateModel): number {
- return state.totalRegistrations;
+ return state.registrations.totalCount;
}
@Selector([MyResourcesState])
static getTotalPreprints(state: MyResourcesStateModel): number {
- return state.totalPreprints;
- }
-
- @Selector([MyResourcesState])
- static getTotalBookmarks(state: MyResourcesStateModel): number {
- return state.totalBookmarks;
- }
-
- @Selector([MyResourcesState])
- static getBookmarksLoading(state: MyResourcesStateModel): boolean {
- return state.bookmarks.isLoading;
+ return state.preprints.totalCount;
}
}
diff --git a/src/app/shared/stores/my-resources/my-resources.state.ts b/src/app/shared/stores/my-resources/my-resources.state.ts
index a6cbd80e0..8425f9c09 100644
--- a/src/app/shared/stores/my-resources/my-resources.state.ts
+++ b/src/app/shared/stores/my-resources/my-resources.state.ts
@@ -1,17 +1,15 @@
import { Action, State, StateContext } from '@ngxs/store';
-import { catchError, forkJoin, tap } from 'rxjs';
+import { catchError, tap } from 'rxjs';
import { inject, Injectable } from '@angular/core';
-import { ResourceType } from '@osf/shared/enums';
-import { handleSectionError } from '@osf/shared/helpers';
-import { MyResourcesService } from '@osf/shared/services';
+import { handleSectionError } from '@osf/shared/helpers/state-error.handler';
+import { MyResourcesService } from '@osf/shared/services/my-resources.service';
import {
ClearMyResources,
CreateProject,
- GetMyBookmarks,
GetMyPreprints,
GetMyProjects,
GetMyRegistrations,
@@ -45,8 +43,8 @@ export class MyResourcesState {
data: res.data,
isLoading: false,
error: null,
+ totalCount: res.meta.total,
},
- totalProjects: res.meta.total,
});
}),
catchError((error) => handleSectionError(ctx, 'projects', error))
@@ -78,8 +76,8 @@ export class MyResourcesState {
data: res.data,
isLoading: false,
error: null,
+ totalCount: res.meta.total,
},
- totalRegistrations: res.meta.total,
});
}),
catchError((error) => handleSectionError(ctx, 'registrations', error))
@@ -103,76 +101,14 @@ export class MyResourcesState {
data: res.data,
isLoading: false,
error: null,
+ totalCount: res.meta.total,
},
- totalPreprints: res.meta.total,
});
}),
catchError((error) => handleSectionError(ctx, 'preprints', error))
);
}
- @Action(GetMyBookmarks)
- getBookmarks(ctx: StateContext, action: GetMyBookmarks) {
- const state = ctx.getState();
- ctx.patchState({
- bookmarks: {
- ...state.bookmarks,
- isLoading: true,
- error: null,
- },
- });
-
- if (action.resourceType !== ResourceType.Null) {
- return this.myResourcesService
- .getMyBookmarks(action.bookmarksId, action.resourceType, action.filters, action.pageNumber, action.pageSize)
- .pipe(
- tap((res) => {
- ctx.patchState({
- bookmarks: {
- data: res.data,
- isLoading: false,
- error: null,
- },
- totalBookmarks: res.meta.total,
- });
- }),
- catchError((error) => handleSectionError(ctx, 'bookmarks', error))
- );
- } else {
- return forkJoin({
- projects: this.myResourcesService.getMyBookmarks(
- action.bookmarksId,
- ResourceType.Project,
- action.filters,
- action.pageNumber,
- action.pageSize
- ),
- registrations: this.myResourcesService.getMyBookmarks(
- action.bookmarksId,
- ResourceType.Registration,
- action.filters,
- action.pageNumber,
- action.pageSize
- ),
- }).pipe(
- tap((results) => {
- const allData = [...results.projects.data, ...results.registrations.data];
- const totalCount = results.projects.meta.total + results.registrations.meta.total;
-
- ctx.patchState({
- bookmarks: {
- data: allData,
- isLoading: false,
- error: null,
- },
- totalBookmarks: totalCount,
- });
- }),
- catchError((error) => handleSectionError(ctx, 'bookmarks', error))
- );
- }
- }
-
@Action(ClearMyResources)
clearMyResources(ctx: StateContext) {
ctx.patchState(MY_RESOURCES_STATE_DEFAULTS);
@@ -198,8 +134,8 @@ export class MyResourcesState {
isLoading: false,
isSubmitting: false,
error: null,
+ totalCount: state.projects.totalCount + 1,
},
- totalProjects: state.totalProjects + 1,
});
}),
catchError((error) => handleSectionError(ctx, 'projects', error))
diff --git a/src/app/shared/stores/node-links/node-links.actions.ts b/src/app/shared/stores/node-links/node-links.actions.ts
index da48a8ba7..1c4fdc53a 100644
--- a/src/app/shared/stores/node-links/node-links.actions.ts
+++ b/src/app/shared/stores/node-links/node-links.actions.ts
@@ -1,4 +1,5 @@
-import { ComponentOverview, MyResourcesItem } from '@osf/shared/models';
+import { ComponentOverview } from '@osf/shared/models/components/components.models';
+import { MyResourcesItem } from '@osf/shared/models/my-resources/my-resources.models';
export class CreateNodeLink {
static readonly type = '[Node Links] Create Node Link';
diff --git a/src/app/shared/stores/node-links/node-links.model.ts b/src/app/shared/stores/node-links/node-links.model.ts
index 91208eb02..eec2c3bc7 100644
--- a/src/app/shared/stores/node-links/node-links.model.ts
+++ b/src/app/shared/stores/node-links/node-links.model.ts
@@ -1,4 +1,5 @@
-import { AsyncStateModel, ComponentOverview } from '@osf/shared/models';
+import { ComponentOverview } from '@osf/shared/models/components/components.models';
+import { AsyncStateModel } from '@osf/shared/models/store/async-state.model';
export interface NodeLinksStateModel {
linkedResources: AsyncStateModel |