From ca5e47c797385a825133cfc2cb16c1cdbf798af9 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Mon, 9 Feb 2026 18:01:58 +0200 Subject: [PATCH 1/6] get provider default license if it is not set for project on /collections/flubber/add view --- .../project-metadata-step.component.ts | 15 ++++++++--- .../services/add-to-collection.service.ts | 7 ++++++ .../add-to-collection.actions.ts | 6 +++++ .../add-to-collection.model.ts | 7 ++++++ .../add-to-collection.selectors.ts | 5 ++++ .../add-to-collection.state.ts | 25 +++++++++++++++++++ src/app/shared/mappers/licenses.mapper.ts | 15 +++++++++-- .../models/collections/collections.model.ts | 4 +++ .../models/license/licenses-json-api.model.ts | 8 ++++++ 9 files changed, 87 insertions(+), 5 deletions(-) diff --git a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts index 2fd2b0b4c..2338a8fd1 100644 --- a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts +++ b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts @@ -33,7 +33,11 @@ import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AddToCollectionSteps, ProjectMetadataFormControls } from '@osf/features/collections/enums'; import { ProjectMetadataForm } from '@osf/features/collections/models/project-metadata-form.model'; import { ProjectMetadataFormService } from '@osf/features/collections/services'; -import { AddToCollectionSelectors, GetCollectionLicenses } from '@osf/features/collections/store/add-to-collection'; +import { + AddToCollectionSelectors, + GetCollectionLicenses, + GetProviderDefaultLicense, +} from '@osf/features/collections/store/add-to-collection'; import { TagsInputComponent } from '@osf/shared/components/tags-input/tags-input.component'; import { TextInputComponent } from '@osf/shared/components/text-input/text-input.component'; import { TruncatedTextComponent } from '@osf/shared/components/truncated-text/truncated-text.component'; @@ -87,6 +91,7 @@ export class ProjectMetadataStepComponent { readonly selectedProject = select(ProjectsSelectors.getSelectedProject); readonly collectionLicenses = select(AddToCollectionSelectors.getCollectionLicenses); + readonly providerDefaultLicense = select(AddToCollectionSelectors.getProviderDefaultLicense); readonly isSelectedProjectUpdateSubmitting = select(ProjectsSelectors.getSelectedProjectUpdateSubmitting); stepperActiveValue = input.required(); @@ -102,6 +107,7 @@ export class ProjectMetadataStepComponent { getAllContributors: GetAllContributors, getCollectionLicenses: GetCollectionLicenses, clearProjects: ClearProjects, + getProviderDefaultLicense: GetProviderDefaultLicense, }); readonly projectMetadataForm: FormGroup = this.formService.createForm(); @@ -113,7 +119,9 @@ export class ProjectMetadataStepComponent { readonly projectLicense = computed(() => { const project = this.selectedProject(); - return project ? (this.collectionLicenses().find((license) => license.id === project.licenseId) ?? null) : null; + const defaultLicense = this.providerDefaultLicense()?.id; + const licenseId = project?.licenseId || defaultLicense; + return project ? (this.collectionLicenses().find((license) => license.id === licenseId) ?? null) : null; }); private readonly isFormUnchanged = computed(() => { @@ -234,8 +242,9 @@ export class ProjectMetadataStepComponent { this.selectedLicense.set(license); this.formService.updateLicenseValidators(this.projectMetadataForm, license); }); + } else { + this.actions.getProviderDefaultLicense(this.providerId()); } - this.populateFormFromProject(); }); diff --git a/src/app/features/collections/services/add-to-collection.service.ts b/src/app/features/collections/services/add-to-collection.service.ts index 94d36d32e..52298b39b 100644 --- a/src/app/features/collections/services/add-to-collection.service.ts +++ b/src/app/features/collections/services/add-to-collection.service.ts @@ -9,6 +9,7 @@ import { ReviewActionsMapper } from '@osf/shared/mappers/review-actions.mapper'; import { ReviewActionPayload } from '@osf/shared/models/review-action/review-action-payload.model'; import { JsonApiService } from '@osf/shared/services/json-api.service'; import { CollectionSubmissionPayload } from '@shared/models/collections/collection-submission-payload.model'; +import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; import { LicenseModel } from '@shared/models/license/license.model'; import { LicensesResponseJsonApi } from '@shared/models/license/licenses-json-api.model'; @@ -34,6 +35,12 @@ export class AddToCollectionService { .pipe(map((licenses) => LicensesMapper.fromLicensesResponse(licenses))); } + fetchProviderDefaultLicense(providerId: string): Observable { + return this.jsonApiService + .get(`${this.apiUrl}/providers/collections/${providerId}/`) + .pipe(map((response) => LicensesMapper.fromProviderDefaultLicenseResponse(response))); + } + createCollectionSubmission(payload: CollectionSubmissionPayload): Observable { const collectionId = payload.collectionId; const metadata = CollectionsMapper.toCollectionSubmissionRequest(payload); diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.actions.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.actions.ts index 8d0531014..d8b1684cb 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.actions.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.actions.ts @@ -8,6 +8,12 @@ export class GetCollectionLicenses { constructor(public providerId: string) {} } +export class GetProviderDefaultLicense { + static readonly type = '[Add To Collection] Get Provider Default License'; + + constructor(public providerId: string) {} +} + export class GetCurrentCollectionSubmission { static readonly type = '[Add To Collection] Get Current Collection Submission'; diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts index ba47d319d..6a7bde283 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts @@ -1,10 +1,12 @@ import { CollectionProjectSubmission } from '@osf/shared/models/collections/collections.model'; import { LicenseModel } from '@shared/models/license/license.model'; import { AsyncStateModel } from '@shared/models/store/async-state.model'; +import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; export interface AddToCollectionStateModel { collectionLicenses: AsyncStateModel; currentProjectSubmission: AsyncStateModel; + providerDefaultLicense: AsyncStateModel; } export const ADD_TO_COLLECTION_DEFAULTS: AddToCollectionStateModel = { @@ -18,4 +20,9 @@ export const ADD_TO_COLLECTION_DEFAULTS: AddToCollectionStateModel = { isLoading: false, error: null, }, + providerDefaultLicense: { + data: null, + isLoading: false, + error: null, + }, }; diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.selectors.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.selectors.ts index 44bdb0e7b..983983983 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.selectors.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.selectors.ts @@ -9,6 +9,11 @@ export class AddToCollectionSelectors { return state.collectionLicenses.data; } + @Selector([AddToCollectionState]) + static getProviderDefaultLicense(state: AddToCollectionStateModel) { + return state.providerDefaultLicense.data; + } + @Selector([AddToCollectionState]) static getCollectionLicensesLoading(state: AddToCollectionStateModel) { return state.collectionLicenses.isLoading; diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.state.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.state.ts index 04a1848c0..2a6a423d5 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.state.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.state.ts @@ -14,6 +14,7 @@ import { CreateCollectionSubmission, GetCollectionLicenses, GetCurrentCollectionSubmission, + GetProviderDefaultLicense, RemoveCollectionSubmission, UpdateCollectionSubmission, } from './add-to-collection.actions'; @@ -52,6 +53,30 @@ export class AddToCollectionState { ); } + @Action(GetProviderDefaultLicense) + getProviderDefaultLicense(ctx: StateContext, action: GetProviderDefaultLicense) { + const state = ctx.getState(); + ctx.patchState({ + providerDefaultLicense: { + ...state.providerDefaultLicense, + isLoading: true, + }, + }); + + return this.addToCollectionService.fetchProviderDefaultLicense(action.providerId).pipe( + tap((defaultLicense) => { + ctx.patchState({ + providerDefaultLicense: { + data: defaultLicense, + isLoading: false, + error: null, + }, + }); + }), + catchError((error) => handleSectionError(ctx, 'collectionLicenses', error)) + ); + } + @Action(GetCurrentCollectionSubmission) getCurrentCollectionSubmission(ctx: StateContext, action: GetCurrentCollectionSubmission) { const state = ctx.getState(); diff --git a/src/app/shared/mappers/licenses.mapper.ts b/src/app/shared/mappers/licenses.mapper.ts index 253da04dc..c8c7864eb 100644 --- a/src/app/shared/mappers/licenses.mapper.ts +++ b/src/app/shared/mappers/licenses.mapper.ts @@ -1,6 +1,11 @@ -import { LicenseModel } from '../models/license/license.model'; -import { LicenseDataJsonApi, LicensesResponseJsonApi } from '../models/license/licenses-json-api.model'; +import { ResponseDataJsonApi } from '@shared/models/common/json-api.model'; +import { LicenseModel } from '../models/license/license.model'; +import { + LicenseDataJsonApi, + LicensesResponseJsonApi, + ProviderDefaultLicenseDataJsonApi, +} from '../models/license/licenses-json-api.model'; export class LicensesMapper { static fromLicensesResponse(response: LicensesResponseJsonApi): LicenseModel[] { if (!response.data) { @@ -23,4 +28,10 @@ export class LicensesMapper { text: data?.attributes?.text, }; } + + static fromProviderDefaultLicenseResponse(response: any) { + return { + id: response?.data?.attributes?.default_license_id, + }; + } } diff --git a/src/app/shared/models/collections/collections.model.ts b/src/app/shared/models/collections/collections.model.ts index 5b27a3bff..6034c02b7 100644 --- a/src/app/shared/models/collections/collections.model.ts +++ b/src/app/shared/models/collections/collections.model.ts @@ -101,6 +101,10 @@ export interface CollectionProjectSubmission { project: ProjectModel; } +export interface ProviderDefaultLicense { + id: string; +} + export type CollectionSubmissionActionType = 'collection_submission_actions'; export type CollectionSubmissionTargetType = 'collection-submissions'; diff --git a/src/app/shared/models/license/licenses-json-api.model.ts b/src/app/shared/models/license/licenses-json-api.model.ts index 62dac41ce..2b7547e55 100644 --- a/src/app/shared/models/license/licenses-json-api.model.ts +++ b/src/app/shared/models/license/licenses-json-api.model.ts @@ -1,3 +1,5 @@ +import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; + import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common/json-api.model'; export interface LicensesResponseJsonApi { @@ -10,8 +12,14 @@ export interface LicenseResponseJsonApi { data: LicenseDataJsonApi; } +export interface ProviderDefaultLicenseAttributesJsonApi { + data?: ProviderDefaultLicense; +} + export type LicenseDataJsonApi = ApiData; +export type ProviderDefaultLicenseDataJsonApi = ApiData; + export interface LicenseAttributesJsonApi { name: string; required_fields: string[]; From 7cade942a767996d7bf6e656159d953b13176d08 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Mon, 9 Feb 2026 20:10:45 +0200 Subject: [PATCH 2/6] update code (use explicit response) --- .../collections/services/add-to-collection.service.ts | 7 +++++-- .../store/add-to-collection/add-to-collection.model.ts | 2 +- .../add-project-form/add-project-form.component.spec.ts | 2 +- src/app/shared/mappers/licenses.mapper.ts | 9 ++++----- src/app/shared/models/license/licenses-json-api.model.ts | 8 +++++--- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/app/features/collections/services/add-to-collection.service.ts b/src/app/features/collections/services/add-to-collection.service.ts index 52298b39b..8d2344876 100644 --- a/src/app/features/collections/services/add-to-collection.service.ts +++ b/src/app/features/collections/services/add-to-collection.service.ts @@ -11,7 +11,10 @@ import { JsonApiService } from '@osf/shared/services/json-api.service'; import { CollectionSubmissionPayload } from '@shared/models/collections/collection-submission-payload.model'; import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; import { LicenseModel } from '@shared/models/license/license.model'; -import { LicensesResponseJsonApi } from '@shared/models/license/licenses-json-api.model'; +import { + LicensesResponseJsonApi, + ProviderDefaultLicenseResponseJsonApi, +} from '@shared/models/license/licenses-json-api.model'; import { RemoveCollectionSubmissionPayload } from '../models/remove-collection-submission-payload.model'; @@ -37,7 +40,7 @@ export class AddToCollectionService { fetchProviderDefaultLicense(providerId: string): Observable { return this.jsonApiService - .get(`${this.apiUrl}/providers/collections/${providerId}/`) + .get(`${this.apiUrl}/providers/collections/${providerId}/`) .pipe(map((response) => LicensesMapper.fromProviderDefaultLicenseResponse(response))); } diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts index 6a7bde283..56d7fbd2d 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts @@ -1,7 +1,7 @@ import { CollectionProjectSubmission } from '@osf/shared/models/collections/collections.model'; +import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; import { LicenseModel } from '@shared/models/license/license.model'; import { AsyncStateModel } from '@shared/models/store/async-state.model'; -import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; export interface AddToCollectionStateModel { collectionLicenses: AsyncStateModel; diff --git a/src/app/shared/components/add-project-form/add-project-form.component.spec.ts b/src/app/shared/components/add-project-form/add-project-form.component.spec.ts index ee325c8f8..cdaf249de 100644 --- a/src/app/shared/components/add-project-form/add-project-form.component.spec.ts +++ b/src/app/shared/components/add-project-form/add-project-form.component.spec.ts @@ -9,11 +9,11 @@ import { FormControl, FormGroup, Validators } from '@angular/forms'; import { UserSelectors } from '@core/store/user'; import { ProjectFormControls } from '@osf/shared/enums/create-project-form-controls.enum'; import { CustomValidators } from '@osf/shared/helpers/custom-form-validators.helper'; +import { ProjectModel } from '@osf/shared/models/projects/projects.model'; import { InstitutionsSelectors } from '@osf/shared/stores/institutions'; import { ProjectsSelectors } from '@osf/shared/stores/projects'; import { RegionsSelectors } from '@osf/shared/stores/regions'; import { ProjectForm } from '@shared/models/projects/create-project-form.model'; -import { ProjectModel } from '@shared/models/projects/projects.models'; import { AffiliatedInstitutionSelectComponent } from '../affiliated-institution-select/affiliated-institution-select.component'; import { ProjectSelectorComponent } from '../project-selector/project-selector.component'; diff --git a/src/app/shared/mappers/licenses.mapper.ts b/src/app/shared/mappers/licenses.mapper.ts index c8c7864eb..12755e3e2 100644 --- a/src/app/shared/mappers/licenses.mapper.ts +++ b/src/app/shared/mappers/licenses.mapper.ts @@ -1,11 +1,10 @@ -import { ResponseDataJsonApi } from '@shared/models/common/json-api.model'; - import { LicenseModel } from '../models/license/license.model'; import { LicenseDataJsonApi, LicensesResponseJsonApi, - ProviderDefaultLicenseDataJsonApi, + ProviderDefaultLicenseResponseJsonApi, } from '../models/license/licenses-json-api.model'; + export class LicensesMapper { static fromLicensesResponse(response: LicensesResponseJsonApi): LicenseModel[] { if (!response.data) { @@ -29,9 +28,9 @@ export class LicensesMapper { }; } - static fromProviderDefaultLicenseResponse(response: any) { + static fromProviderDefaultLicenseResponse(response: ProviderDefaultLicenseResponseJsonApi) { return { - id: response?.data?.attributes?.default_license_id, + id: response?.data.attributes?.default_license_id, }; } } diff --git a/src/app/shared/models/license/licenses-json-api.model.ts b/src/app/shared/models/license/licenses-json-api.model.ts index 2b7547e55..148122b1e 100644 --- a/src/app/shared/models/license/licenses-json-api.model.ts +++ b/src/app/shared/models/license/licenses-json-api.model.ts @@ -1,5 +1,3 @@ -import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; - import { ApiData, MetaJsonApi, PaginationLinksJsonApi } from '../common/json-api.model'; export interface LicensesResponseJsonApi { @@ -13,7 +11,11 @@ export interface LicenseResponseJsonApi { } export interface ProviderDefaultLicenseAttributesJsonApi { - data?: ProviderDefaultLicense; + default_license_id: string; +} + +export interface ProviderDefaultLicenseResponseJsonApi { + data: ProviderDefaultLicenseDataJsonApi; } export type LicenseDataJsonApi = ApiData; From a5852fe3e8479f06295d05e9f52e005fe7548300 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Tue, 10 Feb 2026 17:04:32 +0200 Subject: [PATCH 3/6] refactor code --- .../project-metadata-step.component.ts | 26 +++++++++++-------- .../services/add-to-collection.service.ts | 12 +-------- .../add-to-collection.actions.ts | 6 ----- .../add-to-collection.model.ts | 7 ----- .../add-to-collection.selectors.ts | 5 ---- .../add-to-collection.state.ts | 25 ------------------ .../mappers/collections/collections.mapper.ts | 1 + src/app/shared/mappers/licenses.mapper.ts | 12 +-------- .../models/collections/collections.model.ts | 5 +--- .../models/license/licenses-json-api.model.ts | 10 ------- .../provider/base-provider-json-api.model.ts | 1 + 11 files changed, 20 insertions(+), 90 deletions(-) diff --git a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts index 2338a8fd1..c1d89a730 100644 --- a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts +++ b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts @@ -33,11 +33,7 @@ import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AddToCollectionSteps, ProjectMetadataFormControls } from '@osf/features/collections/enums'; import { ProjectMetadataForm } from '@osf/features/collections/models/project-metadata-form.model'; import { ProjectMetadataFormService } from '@osf/features/collections/services'; -import { - AddToCollectionSelectors, - GetCollectionLicenses, - GetProviderDefaultLicense, -} from '@osf/features/collections/store/add-to-collection'; +import { AddToCollectionSelectors, GetCollectionLicenses } from '@osf/features/collections/store/add-to-collection'; import { TagsInputComponent } from '@osf/shared/components/tags-input/tags-input.component'; import { TextInputComponent } from '@osf/shared/components/text-input/text-input.component'; import { TruncatedTextComponent } from '@osf/shared/components/truncated-text/truncated-text.component'; @@ -49,6 +45,7 @@ import { InterpolatePipe } from '@osf/shared/pipes/interpolate.pipe'; import { ToastService } from '@osf/shared/services/toast.service'; import { GetAllContributors } from '@osf/shared/stores/contributors'; import { ClearProjects, ProjectsSelectors, UpdateProjectMetadata } from '@osf/shared/stores/projects'; +import { CollectionsSelectors, GetCollectionProvider } from '@shared/stores/collections'; @Component({ selector: 'osf-project-metadata-step', @@ -90,8 +87,8 @@ export class ProjectMetadataStepComponent { readonly inputLimits = InputLimits; readonly selectedProject = select(ProjectsSelectors.getSelectedProject); + readonly collectionProvider = select(CollectionsSelectors.getCollectionProvider); readonly collectionLicenses = select(AddToCollectionSelectors.getCollectionLicenses); - readonly providerDefaultLicense = select(AddToCollectionSelectors.getProviderDefaultLicense); readonly isSelectedProjectUpdateSubmitting = select(ProjectsSelectors.getSelectedProjectUpdateSubmitting); stepperActiveValue = input.required(); @@ -107,7 +104,7 @@ export class ProjectMetadataStepComponent { getAllContributors: GetAllContributors, getCollectionLicenses: GetCollectionLicenses, clearProjects: ClearProjects, - getProviderDefaultLicense: GetProviderDefaultLicense, + getCollectionProvider: GetCollectionProvider, }); readonly projectMetadataForm: FormGroup = this.formService.createForm(); @@ -119,9 +116,16 @@ export class ProjectMetadataStepComponent { readonly projectLicense = computed(() => { const project = this.selectedProject(); - const defaultLicense = this.providerDefaultLicense()?.id; - const licenseId = project?.licenseId || defaultLicense; - return project ? (this.collectionLicenses().find((license) => license.id === licenseId) ?? null) : null; + const defaultProviderLicense = this.collectionProvider()?.defaultLicenseId; + console.log('Project License Computed:', defaultProviderLicense); + console.log('project?.licenseId:', project?.licenseId); + console.log('this.collectionLicenses() ', this.collectionLicenses()); + // const res = project ? (this.collectionLicenses().find((license) => license.id === licenseId) ?? null) : null; + // console.log('res: ', res) + const licenseId = project?.licenseId || defaultProviderLicense; + const res = project ? (this.collectionLicenses().find((license) => license.id === licenseId) ?? null) : null; + console.log('res: ', res); + return res; }); private readonly isFormUnchanged = computed(() => { @@ -243,7 +247,7 @@ export class ProjectMetadataStepComponent { this.formService.updateLicenseValidators(this.projectMetadataForm, license); }); } else { - this.actions.getProviderDefaultLicense(this.providerId()); + this.actions.getCollectionProvider(this.providerId()); } this.populateFormFromProject(); }); diff --git a/src/app/features/collections/services/add-to-collection.service.ts b/src/app/features/collections/services/add-to-collection.service.ts index 8d2344876..94d36d32e 100644 --- a/src/app/features/collections/services/add-to-collection.service.ts +++ b/src/app/features/collections/services/add-to-collection.service.ts @@ -9,12 +9,8 @@ import { ReviewActionsMapper } from '@osf/shared/mappers/review-actions.mapper'; import { ReviewActionPayload } from '@osf/shared/models/review-action/review-action-payload.model'; import { JsonApiService } from '@osf/shared/services/json-api.service'; import { CollectionSubmissionPayload } from '@shared/models/collections/collection-submission-payload.model'; -import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; import { LicenseModel } from '@shared/models/license/license.model'; -import { - LicensesResponseJsonApi, - ProviderDefaultLicenseResponseJsonApi, -} from '@shared/models/license/licenses-json-api.model'; +import { LicensesResponseJsonApi } from '@shared/models/license/licenses-json-api.model'; import { RemoveCollectionSubmissionPayload } from '../models/remove-collection-submission-payload.model'; @@ -38,12 +34,6 @@ export class AddToCollectionService { .pipe(map((licenses) => LicensesMapper.fromLicensesResponse(licenses))); } - fetchProviderDefaultLicense(providerId: string): Observable { - return this.jsonApiService - .get(`${this.apiUrl}/providers/collections/${providerId}/`) - .pipe(map((response) => LicensesMapper.fromProviderDefaultLicenseResponse(response))); - } - createCollectionSubmission(payload: CollectionSubmissionPayload): Observable { const collectionId = payload.collectionId; const metadata = CollectionsMapper.toCollectionSubmissionRequest(payload); diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.actions.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.actions.ts index d8b1684cb..8d0531014 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.actions.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.actions.ts @@ -8,12 +8,6 @@ export class GetCollectionLicenses { constructor(public providerId: string) {} } -export class GetProviderDefaultLicense { - static readonly type = '[Add To Collection] Get Provider Default License'; - - constructor(public providerId: string) {} -} - export class GetCurrentCollectionSubmission { static readonly type = '[Add To Collection] Get Current Collection Submission'; diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts index 56d7fbd2d..ba47d319d 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.model.ts @@ -1,12 +1,10 @@ import { CollectionProjectSubmission } from '@osf/shared/models/collections/collections.model'; -import { ProviderDefaultLicense } from '@shared/models/collections/collections.model'; import { LicenseModel } from '@shared/models/license/license.model'; import { AsyncStateModel } from '@shared/models/store/async-state.model'; export interface AddToCollectionStateModel { collectionLicenses: AsyncStateModel; currentProjectSubmission: AsyncStateModel; - providerDefaultLicense: AsyncStateModel; } export const ADD_TO_COLLECTION_DEFAULTS: AddToCollectionStateModel = { @@ -20,9 +18,4 @@ export const ADD_TO_COLLECTION_DEFAULTS: AddToCollectionStateModel = { isLoading: false, error: null, }, - providerDefaultLicense: { - data: null, - isLoading: false, - error: null, - }, }; diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.selectors.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.selectors.ts index 983983983..44bdb0e7b 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.selectors.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.selectors.ts @@ -9,11 +9,6 @@ export class AddToCollectionSelectors { return state.collectionLicenses.data; } - @Selector([AddToCollectionState]) - static getProviderDefaultLicense(state: AddToCollectionStateModel) { - return state.providerDefaultLicense.data; - } - @Selector([AddToCollectionState]) static getCollectionLicensesLoading(state: AddToCollectionStateModel) { return state.collectionLicenses.isLoading; diff --git a/src/app/features/collections/store/add-to-collection/add-to-collection.state.ts b/src/app/features/collections/store/add-to-collection/add-to-collection.state.ts index 2a6a423d5..04a1848c0 100644 --- a/src/app/features/collections/store/add-to-collection/add-to-collection.state.ts +++ b/src/app/features/collections/store/add-to-collection/add-to-collection.state.ts @@ -14,7 +14,6 @@ import { CreateCollectionSubmission, GetCollectionLicenses, GetCurrentCollectionSubmission, - GetProviderDefaultLicense, RemoveCollectionSubmission, UpdateCollectionSubmission, } from './add-to-collection.actions'; @@ -53,30 +52,6 @@ export class AddToCollectionState { ); } - @Action(GetProviderDefaultLicense) - getProviderDefaultLicense(ctx: StateContext, action: GetProviderDefaultLicense) { - const state = ctx.getState(); - ctx.patchState({ - providerDefaultLicense: { - ...state.providerDefaultLicense, - isLoading: true, - }, - }); - - return this.addToCollectionService.fetchProviderDefaultLicense(action.providerId).pipe( - tap((defaultLicense) => { - ctx.patchState({ - providerDefaultLicense: { - data: defaultLicense, - isLoading: false, - error: null, - }, - }); - }), - catchError((error) => handleSectionError(ctx, 'collectionLicenses', error)) - ); - } - @Action(GetCurrentCollectionSubmission) getCurrentCollectionSubmission(ctx: StateContext, action: GetCurrentCollectionSubmission) { const state = ctx.getState(); diff --git a/src/app/shared/mappers/collections/collections.mapper.ts b/src/app/shared/mappers/collections/collections.mapper.ts index 227fbe021..680b34a04 100644 --- a/src/app/shared/mappers/collections/collections.mapper.ts +++ b/src/app/shared/mappers/collections/collections.mapper.ts @@ -58,6 +58,7 @@ export class CollectionsMapper { id: response.relationships.primary_collection.data.id, type: response.relationships.primary_collection.data.type, }, + defaultLicenseId: response.attributes?.default_license_id, brand: response.embeds.brand.data ? { id: response.embeds.brand.data.id, diff --git a/src/app/shared/mappers/licenses.mapper.ts b/src/app/shared/mappers/licenses.mapper.ts index 12755e3e2..253da04dc 100644 --- a/src/app/shared/mappers/licenses.mapper.ts +++ b/src/app/shared/mappers/licenses.mapper.ts @@ -1,9 +1,5 @@ import { LicenseModel } from '../models/license/license.model'; -import { - LicenseDataJsonApi, - LicensesResponseJsonApi, - ProviderDefaultLicenseResponseJsonApi, -} from '../models/license/licenses-json-api.model'; +import { LicenseDataJsonApi, LicensesResponseJsonApi } from '../models/license/licenses-json-api.model'; export class LicensesMapper { static fromLicensesResponse(response: LicensesResponseJsonApi): LicenseModel[] { @@ -27,10 +23,4 @@ export class LicensesMapper { text: data?.attributes?.text, }; } - - static fromProviderDefaultLicenseResponse(response: ProviderDefaultLicenseResponseJsonApi) { - return { - id: response?.data.attributes?.default_license_id, - }; - } } diff --git a/src/app/shared/models/collections/collections.model.ts b/src/app/shared/models/collections/collections.model.ts index 6034c02b7..6b67d7d16 100644 --- a/src/app/shared/models/collections/collections.model.ts +++ b/src/app/shared/models/collections/collections.model.ts @@ -18,6 +18,7 @@ export interface CollectionProvider extends BaseProviderModel { type: string; }; brand: BrandModel | null; + defaultLicenseId?: string | null; } export interface CollectionFilters { @@ -101,10 +102,6 @@ export interface CollectionProjectSubmission { project: ProjectModel; } -export interface ProviderDefaultLicense { - id: string; -} - export type CollectionSubmissionActionType = 'collection_submission_actions'; export type CollectionSubmissionTargetType = 'collection-submissions'; diff --git a/src/app/shared/models/license/licenses-json-api.model.ts b/src/app/shared/models/license/licenses-json-api.model.ts index 148122b1e..62dac41ce 100644 --- a/src/app/shared/models/license/licenses-json-api.model.ts +++ b/src/app/shared/models/license/licenses-json-api.model.ts @@ -10,18 +10,8 @@ export interface LicenseResponseJsonApi { data: LicenseDataJsonApi; } -export interface ProviderDefaultLicenseAttributesJsonApi { - default_license_id: string; -} - -export interface ProviderDefaultLicenseResponseJsonApi { - data: ProviderDefaultLicenseDataJsonApi; -} - export type LicenseDataJsonApi = ApiData; -export type ProviderDefaultLicenseDataJsonApi = ApiData; - export interface LicenseAttributesJsonApi { name: string; required_fields: 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 29ab8c054..27bce5d3d 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 @@ -16,4 +16,5 @@ export interface BaseProviderAttributesJsonApi { reviews_workflow: string; share_publish_type: string; share_source: string; + default_license_id?: string | null; } From 0e70af7b4f72b5c15a21a374b8b599304bf1cc9c Mon Sep 17 00:00:00 2001 From: mkovalua Date: Tue, 10 Feb 2026 17:54:02 +0200 Subject: [PATCH 4/6] refactor code --- .../project-metadata-step.component.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts index c1d89a730..46c649800 100644 --- a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts +++ b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts @@ -117,15 +117,8 @@ export class ProjectMetadataStepComponent { readonly projectLicense = computed(() => { const project = this.selectedProject(); const defaultProviderLicense = this.collectionProvider()?.defaultLicenseId; - console.log('Project License Computed:', defaultProviderLicense); - console.log('project?.licenseId:', project?.licenseId); - console.log('this.collectionLicenses() ', this.collectionLicenses()); - // const res = project ? (this.collectionLicenses().find((license) => license.id === licenseId) ?? null) : null; - // console.log('res: ', res) const licenseId = project?.licenseId || defaultProviderLicense; - const res = project ? (this.collectionLicenses().find((license) => license.id === licenseId) ?? null) : null; - console.log('res: ', res); - return res; + return project ? (this.collectionLicenses().find((license) => license.id === licenseId) ?? null) : null; }); private readonly isFormUnchanged = computed(() => { From d2921b333dfaca09cca41456943ae2f8da3d9403 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Tue, 10 Feb 2026 18:19:00 +0200 Subject: [PATCH 5/6] refactor code --- .../project-metadata-step/project-metadata-step.component.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts index 46c649800..573508c46 100644 --- a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts +++ b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts @@ -104,7 +104,6 @@ export class ProjectMetadataStepComponent { getAllContributors: GetAllContributors, getCollectionLicenses: GetCollectionLicenses, clearProjects: ClearProjects, - getCollectionProvider: GetCollectionProvider, }); readonly projectMetadataForm: FormGroup = this.formService.createForm(); @@ -239,8 +238,6 @@ export class ProjectMetadataStepComponent { this.selectedLicense.set(license); this.formService.updateLicenseValidators(this.projectMetadataForm, license); }); - } else { - this.actions.getCollectionProvider(this.providerId()); } this.populateFormFromProject(); }); From c859db64bcd218144a7be3f0d392bbe84e12cb82 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Tue, 10 Feb 2026 18:27:43 +0200 Subject: [PATCH 6/6] resolve CR --- .../project-metadata-step/project-metadata-step.component.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts index 573508c46..878893086 100644 --- a/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts +++ b/src/app/features/collections/components/add-to-collection/project-metadata-step/project-metadata-step.component.ts @@ -45,7 +45,7 @@ import { InterpolatePipe } from '@osf/shared/pipes/interpolate.pipe'; import { ToastService } from '@osf/shared/services/toast.service'; import { GetAllContributors } from '@osf/shared/stores/contributors'; import { ClearProjects, ProjectsSelectors, UpdateProjectMetadata } from '@osf/shared/stores/projects'; -import { CollectionsSelectors, GetCollectionProvider } from '@shared/stores/collections'; +import { CollectionsSelectors } from '@shared/stores/collections'; @Component({ selector: 'osf-project-metadata-step', @@ -115,8 +115,7 @@ export class ProjectMetadataStepComponent { readonly projectLicense = computed(() => { const project = this.selectedProject(); - const defaultProviderLicense = this.collectionProvider()?.defaultLicenseId; - const licenseId = project?.licenseId || defaultProviderLicense; + const licenseId = project?.licenseId || this.collectionProvider()?.defaultLicenseId; return project ? (this.collectionLicenses().find((license) => license.id === licenseId) ?? null) : null; });