From 3bf9384ccd4c594b700ba8fb8780af121f42a61b Mon Sep 17 00:00:00 2001 From: Ostap Zherebetskyi Date: Thu, 26 Mar 2026 12:44:59 +0200 Subject: [PATCH] feat(institutions): add sso availability filter and update related models/services --- .../pages/institutions-list/institutions-list.component.ts | 6 +++++- src/app/shared/constants/institutions-filters.const.ts | 2 ++ src/app/shared/mappers/institutions/institutions.mapper.ts | 1 + .../models/institutions/institution-json-api.model.ts | 1 + src/app/shared/models/institutions/institutions.models.ts | 1 + src/app/shared/services/institutions.service.ts | 4 ++-- src/app/shared/stores/institutions/institutions.actions.ts | 5 ++++- src/app/shared/stores/institutions/institutions.state.ts | 2 +- 8 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 src/app/shared/constants/institutions-filters.const.ts diff --git a/src/app/features/institutions/pages/institutions-list/institutions-list.component.ts b/src/app/features/institutions/pages/institutions-list/institutions-list.component.ts index 135588f15..0111f9f59 100644 --- a/src/app/features/institutions/pages/institutions-list/institutions-list.component.ts +++ b/src/app/features/institutions/pages/institutions-list/institutions-list.component.ts @@ -14,6 +14,10 @@ import { ScheduledBannerComponent } from '@core/components/osf-banners/scheduled import { LoadingSpinnerComponent } from '@osf/shared/components/loading-spinner/loading-spinner.component'; import { SearchInputComponent } from '@osf/shared/components/search-input/search-input.component'; import { SubHeaderComponent } from '@osf/shared/components/sub-header/sub-header.component'; +import { + INSTITUTIONS_SSO_AVAILABILITY_KEY, + INSTITUTIONS_SSO_AVAILABILITY_VALUE, +} from '@osf/shared/constants/institutions-filters.const'; import { FetchInstitutions, InstitutionsSelectors } from '@osf/shared/stores/institutions'; @Component({ @@ -43,7 +47,7 @@ export class InstitutionsListComponent { institutionsLoading = select(InstitutionsSelectors.isInstitutionsLoading); constructor() { - this.actions.getInstitutions(); + this.actions.getInstitutions(INSTITUTIONS_SSO_AVAILABILITY_VALUE, INSTITUTIONS_SSO_AVAILABILITY_KEY); this.setupSearchSubscription(); } diff --git a/src/app/shared/constants/institutions-filters.const.ts b/src/app/shared/constants/institutions-filters.const.ts new file mode 100644 index 000000000..77bfb79e5 --- /dev/null +++ b/src/app/shared/constants/institutions-filters.const.ts @@ -0,0 +1,2 @@ +export const INSTITUTIONS_SSO_AVAILABILITY_VALUE = '[Public,Unavailable]'; +export const INSTITUTIONS_SSO_AVAILABILITY_KEY = 'sso_availability'; diff --git a/src/app/shared/mappers/institutions/institutions.mapper.ts b/src/app/shared/mappers/institutions/institutions.mapper.ts index 66642d805..516b3e6da 100644 --- a/src/app/shared/mappers/institutions/institutions.mapper.ts +++ b/src/app/shared/mappers/institutions/institutions.mapper.ts @@ -25,6 +25,7 @@ export class InstitutionsMapper { logoPath: data.attributes.logo_path, userMetricsUrl: data.relationships?.user_metrics?.links?.related?.href, linkToExternalReportsArchive: data.attributes.link_to_external_reports_archive, + sso_availability: data.attributes.sso_availability, }; } 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 16f4b4226..6b899405d 100644 --- a/src/app/shared/models/institutions/institution-json-api.model.ts +++ b/src/app/shared/models/institutions/institution-json-api.model.ts @@ -23,6 +23,7 @@ interface InstitutionAttributesJsonApi { institutional_request_access_enabled: boolean; logo_path: string; link_to_external_reports_archive: string; + sso_availability: string; } interface InstitutionLinksJsonApi { diff --git a/src/app/shared/models/institutions/institutions.models.ts b/src/app/shared/models/institutions/institutions.models.ts index f00b4a278..aaee35b7d 100644 --- a/src/app/shared/models/institutions/institutions.models.ts +++ b/src/app/shared/models/institutions/institutions.models.ts @@ -16,6 +16,7 @@ export interface Institution { logoPath: string; userMetricsUrl?: string; linkToExternalReportsArchive?: string; + sso_availability: string; } export interface InstitutionAssets { diff --git a/src/app/shared/services/institutions.service.ts b/src/app/shared/services/institutions.service.ts index 9858f02f2..7bfb34f85 100644 --- a/src/app/shared/services/institutions.service.ts +++ b/src/app/shared/services/institutions.service.ts @@ -35,11 +35,11 @@ export class InstitutionsService { [ResourceType.DraftRegistration, 'draft_registrations'], ]); - getInstitutions(searchValue?: string): Observable { + getInstitutions(searchValue?: string, searchKey = 'name'): Observable { const params: Record = {}; if (searchValue && searchValue.trim()) { - params['filter[name]'] = searchValue.trim(); + params[`filter[${searchKey}]`] = searchValue.trim(); } return this.jsonApiService diff --git a/src/app/shared/stores/institutions/institutions.actions.ts b/src/app/shared/stores/institutions/institutions.actions.ts index 7645e7d6b..6bd5462d0 100644 --- a/src/app/shared/stores/institutions/institutions.actions.ts +++ b/src/app/shared/stores/institutions/institutions.actions.ts @@ -8,7 +8,10 @@ export class FetchUserInstitutions { export class FetchInstitutions { static readonly type = '[Institutions] Fetch Institutions'; - constructor(public searchValue?: string) {} + constructor( + public searchValue?: string, + public searchKey?: string + ) {} } export class FetchResourceInstitutions { diff --git a/src/app/shared/stores/institutions/institutions.state.ts b/src/app/shared/stores/institutions/institutions.state.ts index 631f9ec56..cac3312d4 100644 --- a/src/app/shared/stores/institutions/institutions.state.ts +++ b/src/app/shared/stores/institutions/institutions.state.ts @@ -54,7 +54,7 @@ export class InstitutionsState { }, }); - return this.institutionsService.getInstitutions(action.searchValue).pipe( + return this.institutionsService.getInstitutions(action.searchValue, action.searchKey).pipe( tap((response) => { ctx.setState( patch({