From eee8c055888be781468bd358431d564b7c7ce4a0 Mon Sep 17 00:00:00 2001 From: nsemets Date: Wed, 29 Apr 2026 14:32:41 +0300 Subject: [PATCH 1/2] fix(filter-options): updated filter option models --- .../filters-section/filters-section.component.ts | 11 +++++++---- .../components/filter-chips/filter-chips.component.ts | 3 ++- .../global-search/global-search.component.ts | 9 ++++++--- .../search-filters/search-filters.component.ts | 6 ++++-- src/app/shared/models/search/filter-option-removed.ts | 6 ++++++ .../models/search/filter-option-selected.model.ts | 6 ++++++ .../models/search/filter-options-search-text.model.ts | 6 ++++++ 7 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 src/app/shared/models/search/filter-option-removed.ts create mode 100644 src/app/shared/models/search/filter-option-selected.model.ts create mode 100644 src/app/shared/models/search/filter-options-search-text.model.ts diff --git a/src/app/features/admin-institutions/components/filters-section/filters-section.component.ts b/src/app/features/admin-institutions/components/filters-section/filters-section.component.ts index 06788e3f7..5ec51efde 100644 --- a/src/app/features/admin-institutions/components/filters-section/filters-section.component.ts +++ b/src/app/features/admin-institutions/components/filters-section/filters-section.component.ts @@ -9,7 +9,10 @@ import { ChangeDetectionStrategy, Component, model } from '@angular/core'; import { FilterChipsComponent } from '@osf/shared/components/filter-chips/filter-chips.component'; import { SearchFiltersComponent } from '@osf/shared/components/search-filters/search-filters.component'; -import { DiscoverableFilter, FilterOption } from '@osf/shared/models/search/discoverable-filter.model'; +import { DiscoverableFilter } from '@osf/shared/models/search/discoverable-filter.model'; +import { FilterOptionRemoved } from '@osf/shared/models/search/filter-option-removed'; +import { FilterOptionSelected } from '@osf/shared/models/search/filter-option-selected.model'; +import { FilterOptionsSearchText } from '@osf/shared/models/search/filter-options-search-text.model'; import { ClearFilterSearchResults, FetchResources, @@ -44,7 +47,7 @@ export class FiltersSectionComponent { filtersVisible = model(); - onSelectedFilterOptionsChanged(event: { filter: DiscoverableFilter; filterOption: FilterOption[] }): void { + onSelectedFilterOptionsChanged(event: FilterOptionSelected): void { this.actions.updateSelectedFilterOption(event.filter.key, event.filterOption); this.actions.fetchResources(); } @@ -57,7 +60,7 @@ export class FiltersSectionComponent { this.actions.loadMoreFilterOptions(filter.key); } - onSearchFilterOptions(event: { searchText: string; filter: DiscoverableFilter }): void { + onSearchFilterOptions(event: FilterOptionsSearchText): void { if (event.searchText.trim()) { this.actions.loadFilterOptionsWithSearch(event.filter.key, event.searchText); } else { @@ -65,7 +68,7 @@ export class FiltersSectionComponent { } } - onFilterChipRemoved(event: { filterKey: string; optionRemoved: FilterOption }): void { + onFilterChipRemoved(event: FilterOptionRemoved): void { const updatedOptions = this.selectedFilterOptions()[event.filterKey].filter( (option) => option.value !== event.optionRemoved.value ); diff --git a/src/app/shared/components/filter-chips/filter-chips.component.ts b/src/app/shared/components/filter-chips/filter-chips.component.ts index e082ed8b0..f976a9967 100644 --- a/src/app/shared/components/filter-chips/filter-chips.component.ts +++ b/src/app/shared/components/filter-chips/filter-chips.component.ts @@ -3,6 +3,7 @@ import { Chip } from 'primeng/chip'; import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core'; import { DiscoverableFilter, FilterOption } from '@osf/shared/models/search/discoverable-filter.model'; +import { FilterOptionRemoved } from '@osf/shared/models/search/filter-option-removed'; @Component({ selector: 'osf-filter-chips', @@ -14,7 +15,7 @@ export class FilterChipsComponent { filterOptions = input>({}); filters = input.required(); - selectedOptionRemoved = output<{ filterKey: string; optionRemoved: FilterOption }>(); + selectedOptionRemoved = output(); filterLabels = computed(() => this.filters() diff --git a/src/app/shared/components/global-search/global-search.component.ts b/src/app/shared/components/global-search/global-search.component.ts index 86015b0dd..af1ca34e8 100644 --- a/src/app/shared/components/global-search/global-search.component.ts +++ b/src/app/shared/components/global-search/global-search.component.ts @@ -23,6 +23,9 @@ import { ActivatedRoute, Router } from '@angular/router'; import { PreprintProviderDetails } from '@osf/features/preprints/models'; import { normalizeQuotes } from '@osf/shared/helpers/normalize-quotes'; import { DiscoverableFilter, FilterOption } from '@osf/shared/models/search/discoverable-filter.model'; +import { FilterOptionRemoved } from '@osf/shared/models/search/filter-option-removed'; +import { FilterOptionSelected } from '@osf/shared/models/search/filter-option-selected.model'; +import { FilterOptionsSearchText } from '@osf/shared/models/search/filter-options-search-text.model'; import { SearchFiltersComponent } from '@shared/components/search-filters/search-filters.component'; import { ResourceType } from '@shared/enums/resource-type.enum'; import { TabOption } from '@shared/models/tab-option.model'; @@ -130,7 +133,7 @@ export class GlobalSearchComponent implements OnInit, OnDestroy { this.actions.loadMoreFilterOptions(filter.key); } - onSearchFilterOptions(event: { searchText: string; filter: DiscoverableFilter }): void { + onSearchFilterOptions(event: FilterOptionsSearchText): void { if (event.searchText.trim()) { this.actions.loadFilterOptionsWithSearch(event.filter.key, event.searchText); } else { @@ -138,7 +141,7 @@ export class GlobalSearchComponent implements OnInit, OnDestroy { } } - onSelectedFilterOptionsChanged(event: { filter: DiscoverableFilter; filterOption: FilterOption[] }): void { + onSelectedFilterOptionsChanged(event: FilterOptionSelected): void { this.actions.updateSelectedFilterOption(event.filter.key, event.filterOption); const currentFilters = this.filterOptions(); @@ -171,7 +174,7 @@ export class GlobalSearchComponent implements OnInit, OnDestroy { } } - onSelectedOptionRemoved(event: { filterKey: string; optionRemoved: FilterOption }): void { + onSelectedOptionRemoved(event: FilterOptionRemoved): void { const updatedOptions = this.filterOptions()[event.filterKey].filter( (option) => option.value !== event.optionRemoved.value ); 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 c87370fc3..fa86ae004 100644 --- a/src/app/shared/components/search-filters/search-filters.component.ts +++ b/src/app/shared/components/search-filters/search-filters.component.ts @@ -17,6 +17,8 @@ import { FilterOperatorOption, FilterOption, } from '@osf/shared/models/search/discoverable-filter.model'; +import { FilterOptionSelected } from '@osf/shared/models/search/filter-option-selected.model'; +import { FilterOptionsSearchText } from '@osf/shared/models/search/filter-options-search-text.model'; import { GenericFilterComponent } from '../generic-filter/generic-filter.component'; import { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component'; @@ -52,8 +54,8 @@ export class SearchFiltersComponent { loadFilterOptions = output(); loadMoreFilterOptions = output(); - filterOptionSelected = output<{ filter: DiscoverableFilter; filterOption: FilterOption[] }>(); - filterOptionsSearch = output<{ filter: DiscoverableFilter; searchText: string }>(); + filterOptionSelected = output(); + filterOptionsSearch = output(); readonly String = String; readonly Boolean = Boolean; diff --git a/src/app/shared/models/search/filter-option-removed.ts b/src/app/shared/models/search/filter-option-removed.ts new file mode 100644 index 000000000..548b50ba0 --- /dev/null +++ b/src/app/shared/models/search/filter-option-removed.ts @@ -0,0 +1,6 @@ +import { FilterOption } from './discoverable-filter.model'; + +export interface FilterOptionRemoved { + filterKey: string; + optionRemoved: FilterOption; +} diff --git a/src/app/shared/models/search/filter-option-selected.model.ts b/src/app/shared/models/search/filter-option-selected.model.ts new file mode 100644 index 000000000..1030a2e62 --- /dev/null +++ b/src/app/shared/models/search/filter-option-selected.model.ts @@ -0,0 +1,6 @@ +import { DiscoverableFilter, FilterOption } from './discoverable-filter.model'; + +export interface FilterOptionSelected { + filter: DiscoverableFilter; + filterOption: FilterOption[]; +} diff --git a/src/app/shared/models/search/filter-options-search-text.model.ts b/src/app/shared/models/search/filter-options-search-text.model.ts new file mode 100644 index 000000000..3e3ae1fa4 --- /dev/null +++ b/src/app/shared/models/search/filter-options-search-text.model.ts @@ -0,0 +1,6 @@ +import { DiscoverableFilter } from './discoverable-filter.model'; + +export interface FilterOptionsSearchText { + filter: DiscoverableFilter; + searchText: string; +} From bbf24ffb5a1b63698990e56df28d67ddae032b8c Mon Sep 17 00:00:00 2001 From: nsemets Date: Wed, 29 Apr 2026 14:39:18 +0300 Subject: [PATCH 2/2] fix(search-help-tutorial): simplified logic for step position --- .../search-help-tutorial.component.html | 2 +- .../search-help-tutorial.component.spec.ts | 23 ------------------- .../search-help-tutorial.component.ts | 5 ---- 3 files changed, 1 insertion(+), 29 deletions(-) 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 4faf30679..bbabab2bc 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 @@ -1,6 +1,6 @@ @for (step of steps(); track $index) { @if (currentStep() === $index + 1) { -
+

{{ step.title | translate }}

{{ step.description | translate }}

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 dd6525af1..df88814e4 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,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { SEARCH_TUTORIAL_STEPS } from '@osf/shared/constants/search-tutorial-steps.const'; -import { TutorialStep } from '@shared/models/tutorial-step.model'; import { provideOSFCore } from '@testing/osf.testing.provider'; @@ -11,13 +10,6 @@ describe('SearchHelpTutorialComponent', () => { let component: SearchHelpTutorialComponent; let fixture: ComponentFixture; - const mockTutorialStep: TutorialStep = { - title: 'Test Step', - description: 'This is a test step', - position: { top: '10px', left: '20px' }, - mobilePosition: { top: '10px', left: '20px' }, - }; - beforeEach(() => { TestBed.configureTestingModule({ imports: [SearchHelpTutorialComponent], @@ -102,21 +94,6 @@ describe('SearchHelpTutorialComponent', () => { expect(component.currentStep()).toBe(0); }); - it('should return position object when step has position', () => { - const position = component.getStepPosition(mockTutorialStep); - expect(position).toEqual({ top: '10px', left: '20px' }); - }); - - it('should return empty object when step has no position', () => { - const stepWithoutPosition: TutorialStep = { - title: 'Test Step', - description: 'This is a test step', - }; - - const position = component.getStepPosition(stepWithoutPosition); - expect(position).toEqual({}); - }); - it('should maintain currentStep state across method calls', () => { expect(component.currentStep()).toBe(0); 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 bc4d90aa4..b1bcdcbb2 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 @@ -8,7 +8,6 @@ import { toSignal } from '@angular/core/rxjs-interop'; 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', @@ -36,8 +35,4 @@ export class SearchHelpTutorialComponent { this.currentStep.set(nextStepIndex); } } - - getStepPosition(step: TutorialStep) { - return this.isTablet() ? step.position : step.mobilePosition || {}; - } }