diff --git a/projects/components/src/filtering/filter/filter-url.service.ts b/projects/components/src/filtering/filter/filter-url.service.ts index aa6309aff..465480e89 100644 --- a/projects/components/src/filtering/filter/filter-url.service.ts +++ b/projects/components/src/filtering/filter/filter-url.service.ts @@ -23,6 +23,28 @@ export class FilterUrlService { private readonly filterParserLookupService: FilterParserLookupService ) {} + public getUrlFilteringStateChanges$(attributes: FilterAttribute[]): Observable { + return this.navigationService.navigation$.pipe(map(() => this.getUrlFilteringState(attributes))); + } + + public getUrlFilteringState(attributes: FilterAttribute[]): UrlFilteringState { + const attributeMap = new Map(attributes.map(attribute => [attribute.name, attribute])); + + return { + filters: this.getUrlFilters(attributes), + groupBy: this.getUrlGroupBy() + .map(attributeName => attributeMap.get(attributeName)) + .filter((attribute): attribute is FilterAttribute => attribute !== undefined) + }; + } + + public setUrlFiltersAndGroupBy(filters: Filter[], groupBy: FilterAttribute[]): void { + this.navigationService.addQueryParametersToUrl({ + [FilterUrlService.FILTER_QUERY_PARAM]: filters.length === 0 ? undefined : filters.map(f => f.urlString), + [FilterUrlService.GROUP_BY_QUERY_PARAM]: isEmpty(groupBy) ? undefined : [groupBy.map(g => g.name).toString()] + }); + } + public getUrlFiltersChanges$(attributes: FilterAttribute[]): Observable { return this.navigationService.navigation$.pipe(map(() => this.getUrlFilters(attributes))); } @@ -119,3 +141,8 @@ export class FilterUrlService { .find(splitFilter => splitFilter !== undefined); } } + +export interface UrlFilteringState { + filters: Filter[]; + groupBy: FilterAttribute[]; +} diff --git a/projects/components/src/overlay/overlay.service.ts b/projects/components/src/overlay/overlay.service.ts index d540e10fb..d0672590c 100644 --- a/projects/components/src/overlay/overlay.service.ts +++ b/projects/components/src/overlay/overlay.service.ts @@ -35,7 +35,10 @@ export class OverlayService { data: metadata }); - popover.closeOnNavigation(); + if (config.closeOnNavigation !== false) { + popover.closeOnNavigation(); + } + sheetRef.initialize(popover); this.setActiveSheetPopover(popover); @@ -71,7 +74,6 @@ export class OverlayService { this.activeSheetPopover?.close(); this.activeSheetPopover = popover; - this.activeSheetPopover.closeOnNavigation(); this.sheetCloseSubscription = this.activeSheetPopover.closed$.subscribe( () => (this.activeSheetPopover = undefined) ); diff --git a/projects/components/src/overlay/sheet/default-sheet-ref.ts b/projects/components/src/overlay/sheet/default-sheet-ref.ts index 3d7b4d64b..296dd3631 100644 --- a/projects/components/src/overlay/sheet/default-sheet-ref.ts +++ b/projects/components/src/overlay/sheet/default-sheet-ref.ts @@ -29,4 +29,12 @@ export class DefaultSheetRef extends SheetRef { } this.popoverRef?.close(); } + + public show(): void { + this.popoverRef?.show(); + } + + public hide(): void { + this.popoverRef?.hide(); + } } diff --git a/projects/components/src/overlay/sheet/sheet.ts b/projects/components/src/overlay/sheet/sheet.ts index b6cf343ba..ec5d1f94d 100644 --- a/projects/components/src/overlay/sheet/sheet.ts +++ b/projects/components/src/overlay/sheet/sheet.ts @@ -8,6 +8,7 @@ export interface SheetOverlayConfig extends OverlayConfig { data?: TData; position?: PopoverFixedPositionLocation.Right | PopoverFixedPositionLocation.RightUnderHeader; closeOnEscapeKey?: boolean; + closeOnNavigation?: boolean; attachedTriggerTemplate?: TemplateRef; } @@ -24,4 +25,6 @@ export const SHEET_DATA = new InjectionToken('SHEET_DATA'); export abstract class SheetRef { public abstract readonly closed$: Observable; public abstract close(result?: TResult): void; + public abstract show(): void; + public abstract hide(): void; } diff --git a/projects/components/src/select/select.component.ts b/projects/components/src/select/select.component.ts index 9fadab826..3fff380d6 100644 --- a/projects/components/src/select/select.component.ts +++ b/projects/components/src/select/select.component.ts @@ -321,12 +321,12 @@ export class SelectComponent implements ControlValueAccessor, AfterContentIni } this.setSelection(item.value); - this.selectedChange.emit(this.selected); - this.propagateValueChangeToFormControl(this.selected); + this.propagateValue(); } public onClearSelected(): void { this.setSelection(); + this.propagateValue(); } private setSelection(value?: V): void { @@ -371,6 +371,11 @@ export class SelectComponent implements ControlValueAccessor, AfterContentIni this.disabled = isDisabled ?? false; } + private propagateValue(): void { + this.selectedChange.emit(this.selected); + this.propagateValueChangeToFormControl(this.selected); + } + private propagateValueChangeToFormControl(value: V | undefined): void { this.propagateControlValueChange?.(value); this.propagateControlValueChangeOnTouch?.(value);